![](https://habrastorage.org/web/e04/04d/504/e0404d50439140e6972c28326a3f4e17.png)
モデル「未来のKAMAZ」、Dmitry Kotlyar作。
KOMPAS開発者の1人が、大規模なWindowsアプリケーションをAndroidに移植する方法を説明しています。24Alexander Poluektov。
ベースライン
KOMPAS-3Dファイル形式の特異性は、ドキュメントの内部構造の説明がなく、メイン製品のソースコードなしではファイルを読み取ることができないということです(独自の試みとサードパーティの開発者の両方が試みたものです)。
データはバイナリ形式でシリアル化され、各クラスはファイルのバージョンを考慮して独自にそれを実行します。 5番目のバージョンのKOMPAS-3DはWindowsでのみ開発されましたが、ユーザーは少なくとも他のOSからのファイルの表示を実装することを長い間求めてきました。 既存のKOMPAS-3Dコードに基づいて、別個のKOMPAS:Android用24製品を作成することが決定されました。
プロジェクトは非常に大きく、C ++で数百万行です。 C ++があるため、すべてを書き直すのではなく、NDKを使用できます。 システムの一部(ジオメトリックコア)がすでにGUIから独立しており、Linuxシステムに適合している作業量を多少削減しました。
![画像](https://habrastorage.org/web/224/fb4/089/224fb40896824746a6f6221a426dd11f.png)
Linux用のC3Dカーネルテストアプリケーション
課題、落とし穴、およびソリューション
最初は、タスクはファイルから3Dモデルを読み取り、それらを描画することでした。 実際には、結果のボディはファイルに保存されず、コンストラクションヒストリのみが保存されることが判明しました。 スケッチで使用される描画/フラグメントオブジェクトを含む、使用可能なすべてのオブジェクトの読み取りを整理する必要がありました。 作業を追加することで、パーツ/アセンブリだけでなく図面/フラグメントの開口部を整理することができました。 アセンブリで行われたモデルの変更には、ディスクへの保存と同様に、メモリへの書き込みによるデータの転送とともに、含まれるパーツの再構築が必要であることが判明しました。 ファイルの読み取りに加えて、書き込みメカニズムも実装する必要がありました。
もちろん、多数のソーステキストを構造化する必要があります。 車輪を再発明しないために、プロジェクトは元のモジュールと同様のモジュールに分割されました。 ユーザーインターフェイスと構築プロセスを担当するモジュールは除外されました。 最初は、リンクすることを望まない数学的コアに問題がありました。 リンカーに渡されたコマンドラインが長すぎるため、問題が発生しました。 プロジェクトを大幅に変更せずに状況を解決するには、カーネルアセンブリをLinux仮想マシンに持ち込む必要がありました。 幸いなことに、Android NDKの次のバージョンでは問題が修正され、現在ではそのような問題はありません。
重大な問題ではありませんでしたが、デバッグには強い神経が必要でした。 1行で変更を行うには、プロジェクトのアセンブリと再起動が3(最大)から40分まで必要です。
![](https://habrastorage.org/web/67e/f95/467/67ef95467b034271944e02660fa16de8.png)
図面表示
ファイルシステム、レジストリ、およびユーザーインターフェイスの操作は、個別のモジュールに移動されました。 これにより、連続転写の場所を大幅に制限することができました。 これは、困難が線を追加した場所です。 ファイルのバージョンに応じて、行は1バイトwindows-1251または2バイトwchar_tのいずれかになります。 Android NDKにはネイティブのutf-8エンコーディングがあり、4バイトのwchar_tが受け入れられます。 また、行は多かれ少なかれ比較され、それらからハッシュが合計されます。 この動物園に対処する唯一の方法は、長いデバッグとコードの詳細な観察です。
大量のレガシーコードの開発時間が大幅に増加しました。 プロジェクトは本当に古いです。 15年前にVisual Studio 6 / Borland C ++ Builderで記述されたコードがあります。 MicrosoftコンパイラーがC ++標準の違反をいかに冷静に処理するか(時にはそれを助長することもある)、プラットフォームに依存しない一見したところのコードフラグメントを書き換える必要がしばしばありました。
最初にシリアル化の詳細について言及しました。 データはバイナリ形式でシリアル化され、各クラスはファイルのバージョンを考慮して独自にそれを実行します。 組み込みのウィンドウタイプは、次のようにシリアル化されます。 バリアント。 文字列のハッシュはシリアル化され、文字列と比較されます(エンコードについて覚えておいてください)。
開発結果
KOMPASの最初のバージョンの開発:24は約6か月かかりました。 新しいリリースには、KOMPAS-3Dファイルの最新バージョンのサポートとマイナーな改善が含まれています。
このプロジェクトには、KOMPAS-3Dからの2000個を超えるcppファイルと、KOMPASのみに固有の約20個のファイルが含まれています。24。 コードには、KOMPAS-3DとKOMPASの異なる実装を含む約4000セクションが含まれています。
モバイルデバイスに十分なRAMを備えたモデル、アセンブリ、または図面を開く機能が実現されました。 実際には、すべてのファイルが開かれるわけではありませんが、個々のバグを修正する問題です。
すべてのプラットフォームで比較的簡単にサポートできるコードを受け取りました。 KOMPASの実験的なアセンブリがあります:LinuxおよびWindowsの場合は24です。
![画像](https://habrastorage.org/web/111/ac6/fa6/111ac6fa65db493296a8394c39e72217.png)
ターボカップリングモデルへの動的セクションの適用
開発プロセス中に、Android用KOMPAS-3Dが存在する可能性が確認されました。 アセンブリを開くと、完全な再構築が行われます。 モバイルアプリケーションは、単純なゲームやノートブックから本格的なプロジェクトへと大きく飛躍しました。 さらに、最近の携帯電話の性能は10年前にPCを上回り、タブレットのサイズと解像度により、画面に十分な量の情報を配置できます。
KOMPAS:24はソリューションの試験場となり、その一部はその後KOMPAS-3Dに移行されました。 たとえば、KOMPAS:24では、3Dモデルの動的セクションが初めて表示され、三角測量キャッシュを使用した迅速なレンダリング、および再構築せずにキャッシュからアセンブリをすばやく開くことができました。
![](https://habrastorage.org/web/be4/faf/bb4/be4fafbb4b084345990cfe4b658f60f4.png)