「改善された」レンダリングオプションについての話を続けましょう。
描画呼び出し
Alexander Tulup、プログラマー:以下に、アセンブリの回転中のレンダリング速度の結果を示します。 24フレーム/秒(fps)は人間の目にとって快適な指標と見なされることを思い出してください。
「大きなシーンを表示するパフォーマンスの主な問題は、いわゆる「描画呼び出し」の多くに関連しています。 古いバージョンのレンダリングは、数学データモデルの上に構築されています。 したがって、各プリミティブ(ポイント、エッジ、フェース)に対して、その表示のために個別のメソッドが呼び出されました。
描画呼び出しごとに、 OpenGL (ドライバー)は一連のチェックを実行し、同時に受信コマンドをビデオカードが理解できる形式に変換します。その後、呼び出しはキューに追加され、実行のために既に送信されます。
OpenGLのGPUコマンド転送スキーム( ソース )
詳細が多数あると、CPUへの呼び出しの数が非常に多くなるため、データがビデオカードに到着する時間がないだけです。 非常に強力なビデオカードでは、中程度またはより弱いビデオカードと同じように「スローダウン」する状況になります。
これに対処するには、レンダリング(状態遷移)の数を減らします-マテリアルごとにグループ化し、共通のジオメトリを組み合わせます( インスタンス化 )など。
シーン全体から見ると、特定の部分のみが表示されていることを忘れないでください。 目に見えないオブジェクトを検出するためのアルゴリズムがここで適用可能です(錐台カリング、オクルージョンカリングなど)
The Road to One Million DrawsとAZDOの例に触発されて、私たちはかなり珍しい道を取ることを決めました:可能な限りCPU側の状態の変化を取り除きます。 これで、ほぼすべてがグラフィックカードで実行されます。 必要なすべての属性は、シェーダー自体( shader )からの描画中にビデオメモリから直接取得されます。これは、ビデオメモリ( VRAM )の増加とSSBOの登場により可能になりました。
1,000,000のサイコロ
このアプローチの利点のうち、表示速度が非常に高速になりました。 速度は、GPUの機能、つまり処理できるデータの量によってのみ制限されます。
また、不可視オブジェクトのクリッピングメカニズムを非常に効率的に実装できました。 可視性チェックの結果はビデオメモリに直接記録され、そこから描画コマンドが形成されます。 つまり、CPU側では、待つ必要はありません。
このアプローチの主な欠点の1つは、開発の複雑さが高いことです。 選択したアプローチを考慮して、多くを新たに実装する必要があります。 さらに、多くの場合、同じシェーダーコードが異なる動作をするか、異なるメーカーのビデオカードでまったく動作しないという状況に対処する必要がありました。 多くの場合、これはドライバーを更新することで「処理」されましたが、長いデバッグの後、コードを書き換える必要がある場合がありました。
当然、ビデオカードの要件も増加しました。 OpenGL 4.5のサポートは重要ですが、唯一の要件ではありません。
以下では、以下の構成のPCで測定を行いました。表1.さまざまなモデルのフレームレート(1秒あたりのフレーム数、fps)。 多いほど良い。 表示モード:ハーフトーン+ワイヤフレーム、簡易モードが無効、アンチエイリアス品質:中(MSAA 8x)
CPU:Intel Core i7-6700K 4.00 GHz
RAM:32 Gb
GPU:NVidia Quadro P2000
OS:Microsoft Windows 10 x64 Professional
モデル | 数量
部品 | フレームレート、fps | ||
V16.1 | v17.1 | v18 | ||
車 モザイク研削 | 2764 | 4.1 | 4.7 | 124.9 |
PGU-410 | 108337 | 0.3 | 0.4 | 28.6 |
カーダンパー | 17342 | 1,1 | 1.4 | 124.7 |
トロリーバス | 9783 | 1.9 | 2,4 | 124.9 |
北潮 発電所 | 48445 | 0.3 | 0.5 | 76.1 |
設置 真空技術 | 7189 | 1.9 | 2,3 | 124.9 |
シップリデューサー 発電所 | 6414 | 2.6 | 3.6 | 123.9 |
大きなアセンブリにコンポーネントを追加する
大規模アセンブリにコンポーネントを追加するシナリオは、最終的にはいわゆる複雑なテストに発展しました。これを表2に示します。
表2.大規模アセンブリにコンポーネントを追加するシナリオ。 テスト基準。
基準 | 基準の説明 |
ファイルを開く速度 | アセンブリに追加されたコンポーネントは、ディスクからロードする必要があります |
レンダリング速度 | アセンブリと挿入されたコンポーネントを配置する必要があります。そのためには、画像を回転/移動/ズームする必要があります |
オブジェクト選択速度 | 合致を作成するには、面、平面、エッジなどの基本オブジェクトを選択する必要があります。 |
ビルドツリーとの同期速度 | アセンブリとそのインターフェイスに追加されたコンポーネントは、コンストラクションツリーで表される必要があります |
仕様モジュールの同期速度 | アセンブリに追加されたコンポーネントは、仕様で検討する必要があります。 |
テーブルには、最初から別々の加速方向として選択されたポイント(描画、開始)が表示されます。 しかし、改善には他のコンポーネントが必要でした。
ツリーとの同期にはかなりの時間がかかりました。 部分的な更新を実装することで問題を解決しました。
もう1つの難点は、仕様がKOMPAS-3Dのパフォーマンスに与える重大な影響でした。 いくつかの複雑なテストシナリオでは、このコンポーネントが主要コンポーネント(50%以上)でした。
仕様書
仕様はKOMPAS-3Dシステムモジュールで、同名の設計ドキュメントの作成を担当します。 別のチームによって開発されています。
特に、チームは仕様モジュールの内部メカニズムを再設計することにより、挿入中の同期を加速しました。
いくつかの結果
アセンブリにコンポーネントを追加します「船の発電所の減速機」。
アセンブリ「海洋発電所の減速機」の包括的なテスト。
数字は、1-ブラケット、2-ワッシャー、3-ボルトを示しています。
表3.大規模アセンブリへのコンポーネントの挿入時間(秒単位)。 少ないほど良い。
成分 | アクション | 時間s | |||
V16.1 | v17.1 | v18 | |||
挿入
成分 ブラケット | 読み込み中 | 2.0 | 3.0 | 2.2 | |
ペアリングモードに切り替える | 0.6 | 0.4 | 0.4 | ||
最初のペアリング | 最初のオブジェクト選択 | 0.4 | 1,0 | 0.2 | |
2番目のオブジェクトの選択 | 0.5 | 1,1 | 0.2 | ||
適切なペアリングを選択してください | 3.8 | 3.6 | 1,0 | ||
2番目のペアリング | 最初のオブジェクト選択 | 0.5 | 1.4 | 0.5 | |
2番目のオブジェクトの選択 | 0.5 | 1.4 | 0.2 | ||
適切なペアリングを選択してください | 3.6 | 3.0 | 1,2 | ||
3番目のペアリング | 最初のオブジェクト選択 | 0.5 | 0.5 | 0.5 | |
2番目のオブジェクトの選択 | 0.3 | 1,1 | 0.3 | ||
適切なペアリングを選択してください | 3,7 | 3.2 | 1,1 | ||
挿入の作成を確認 | 7.8 | 5.2 | 2,3 | ||
トータルブラケットインサート | 24.2 | 24.6 | 10.1 | ||
挿入
ワッシャー 図書館から 標準 製品 | 最初のペアリングの選択 | 6.4 | 2,4 | 0.4 | |
2番目のペアの選択 | 4.2 | 3,1 | 0.4 | ||
挿入の作成を確認 | 15.7 | 9.2 | 4.4 | ||
インサートワッシャーの合計 | 26.3 | 14.7 | 5.2 | ||
挿入
ボルト | 読み込み中 | 2.0 | 2.7 | 2.0 | |
ペアリングモードに切り替える | 0.5 | 0.5 | 0.5 | ||
最初のペアリング | 最初のオブジェクト選択 | 0.4 | 1,0 | 0.2 | |
2番目のオブジェクトの選択 | 0.4 | 1,1 | 0.2 | ||
適切なペアリングを選択してください | 3.4 | 2.7 | 1,0 | ||
2番目のペアリング | 最初のオブジェクト選択 | 0.4 | 1,2 | 0.4 | |
2番目のオブジェクトの選択 | 0.5 | 0.5 | 0.4 | ||
適切なペアリングを選択してください | 3,7 | 2.9 | 1,0 | ||
3番目のペアリング | 最初のオブジェクト選択 | 0.5 | 1,0 | 0.5 | |
2番目のオブジェクトの選択 | 0.5 | 1,0 | 0.2 | ||
適切なペアリングを選択してください | 4.2 | 3.9 | 1,2 | ||
挿入の作成を確認 | 32,5 | 5,4 | 2.2 | ||
ボルト挿入の合計 | 49 | 21,2 | 9.8 | ||
3つのコンポーネントの合計挿入 | 99.5 | 60.5 | 25.1 |
包括的なテストは、アセンブリの編集シナリオの1つと考えることができます(一般的なテストの数から)。
さらに、アセンブリの再構築が加速しました。 これで、操作を編集した場合、アセンブリ全体が完全に再構築されず、変更されたオブジェクトのみが更新されます。 依存する操作、つまり変更された操作の結果によって結果が影響を受ける可能性のある操作を判別するために、操作、本体、および挿入の間の関係を構築する特別なアルゴリズムが使用されます。
アセンブリオープニング
ファイルの読み取り速度を上げる主なアイデアは、KOMPAS-3Dが現時点でユーザーが必要とするものだけを読み取るようにすることです。
例:
- アセンブリ挿入の現在の実行のみを読み取り、
- ダウンロードタイプの場合、必要な情報のみを読み取ります:三角形分割または三角形分割+結果( B-rep )。
これにはすべて、ファイル内のデータ構造を改良して、個々の部分を読み取れるようにする必要がありました。
Anton Sidyakin、プログラマー、チームリーダー:ファイルのオープンを高速化することに加えて、部分的な読み取りは、消費されるリソース(主にRAM)の削減にも役立ちました。
「しばらくの間、KOMPAS-3Dファイルはいくつかのサービスファイルを組み合わせたアーカイブでした。 それらの1つには、ツリー構造で編成されたモデル/アセンブリドキュメントに関するデータが含まれています。 この構造をナビゲートする機能はすでに存在していました。 部分的な読み取りでは、各部分が互いに独立していることを確認する必要がありました。 したがって、受け取ったパーツは相互に参照すべきではありません。そうでない場合、リンクのあるパーツは「劣悪」になります。
結果として、パフォーマンスをドキュメントから分離し、詳細については相互に分離することができました。 アセンブリでは、インサートと合致のコンテナが個別に強調表示されます。 実行の中で、建設の初期データと結果を三角測量とボディの形で分離することもできました。
単純化されたタイプのロードについて説明すると、編集可能なアセンブリは完全にロードされ、タイプに応じて、三角形分割と境界表現(B-rep)のみがその挿入からロードされます。 このモードで外部変数が変更された挿入を表示すると、読み取り時に再構築することでその場で取得されていたため、いくつかの困難が生じました。 解決策は、そのようなインサートをアセンブリに再構築した結果を書き留めることでした。 これにより、再構築が行われないため、高速化されました。
説明されたドキュメントのパーツへの分割により、インサートで選択されたパフォーマンスのみをアセンブリにロードできました。
改善に基づいて、新しいタイプのアセンブリ読み込み-「部分的」が登場しました。 このタイプのロードでは、結果(ボディ、サーフェス)と三角測量のみがファイルから差し引かれます。 部分読み込みでは、ペアリングを作成でき、機能面ではコンポーネントの完全読み込みに近いです。
部分読み込みの改善を実装した後、カスタム読み込みタイプの作成は有望になります。
ヒント
カスタムブートタイプは、コンポーネントをロードするためのシステムメソッドの組み合わせです。 この関数は新しいものではありませんが、v18で行われた改善により、その使用から大きなボーナスを得ることができます。
将来のビルドに重要ではないコンポーネントの場合、「空」の負荷タイプを適用できます。 これらは、他のコンポーネント(「vnutryanka」)に隠されている可能性があります。 v18では、ブートタイプが「空」のコンポーネント(およびアセンブリ全体)がほぼ瞬時に開きます。
表4.「空」および「ディメンション」ダウンロードタイプのアセンブリのオープン時間(秒単位)。 少ないほど良い。
モデル | ダウンロードの種類 | 営業時間、s | ||
V16.1 | v17.1 | v18 | ||
設置 真空技術 | 空の | 12.8 | 11.7 | 2.5 |
大きさ | 21,2 | 20.8 | 2.6 | |
シップリデューサー 発電所 | 空の | 31,0 | 15.9 | 7.2 |
大きさ | 371.5 | 114.8 | 7.3 |
製品の外観を理解するために必要な、またはさらに構築するためのサポートオブジェクトとして使用される残りのコンポーネントは、「フル」または「部分的に」ロードできます。
カスタムブートタイプを準備するためのツールとして、新しいコマンドを使用して「非表示」コンポーネントを選択できます。 コマンドを適用し、コンテキストメニューを使用して、選択したコンポーネントの読み込みの種類を「空」に変更します。
投影
投影を加速するとき、数学的コアの入力で受信したデータをフィルタリングするという質問を自問しました。
まず、不可視のコンポーネント/ボディをフィルタリングすることにしました。 この目的のために、オクルージョンカリングメカニズムが使用されました。投影されるボディが表示されているか、閉じているか、または他のボディ内にあるかどうかを確認できます。 この操作は、ビデオカードの側面で実行されます。
最大の効果は、閉じたボリューム内に多数のコンポーネントが隠されたモデルの投影を作成する場合です。次に例を示します。
- 複雑なドライブ、ギアボックスなど
- 乗り物
- 建物
- 電気機器を備えたキャビネット。
「大まかな投影」オプションが含まれます。 名前は偶然ではありません-比較的小さな部品(たとえば、発電所のスケールのボルト)は、アセンブリスケールに投影されない場合があります。 この状況は、特に寸法図面や一般的な図面を作成する場合に、多くのユーザーに適しています。
「粗投影」オプションの詳細
このオプションは、標準の投影でのみ使用できます。 画像(セクション、セクション、リモートビュー)を指定する場合、「大まかな投影」は関係ありません。
このオプションを使用しなくても、投影はV16およびv17と比較して著しく高速です。 これは数学的コアの側面の改善によって助けられました。
表5. 3つの標準投影法を作成する時間(秒単位)。 少ないほど良い。
モデル | 3つの標準投影法を作成する時間 | |||
V16.1 | v17.1 | v18
含まれています 下書き 投影 | v18
オフ 下書き 投影 | |
設置 真空技術 | 124.1 | 47.5 | 12.9 | 34.6 |
シップリデューサー 発電所 | 256 | 410 | 38,4 | 54,4 |
多目的 統一された ボックス本体 | 99.9 | 123,4 | 44.9 | 53.5 |
また、v18では、個々の連合種を再構築する可能性が実装されました。
多くの関連ビューを含む図面では、ユーザーは個々の無関係なビューを再構築できます。 たとえば、彼が注釈を追加したいもの。 ラフ投影オプションを有効にして構築されたビューを絞り込むこともできます。
単一のビューを再構築する
この機能は明示的な加速には適用されませんが、ユーザーは時間を節約できます。
図面内のモデル真空技術設備の投影を加速するために行われた作業の結果:
次のパートでは、c3dlabsジオメトリックコアのCOMPASS-3D パフォーマンスへの貢献、C3D Modelerの変更、およびv18に適したハードウェアについて、質量中心特性(MTC)の計算を加速した方法について説明します。