WPF の 3D パフォーマンスの最大化

Windows Presentation Foundation (WPF) を使用して 3D コントロールを作成し、アプリケーションに 3D シーンを含めるときに、パフォーマンスの最適化を考慮することが重要です。 このトピックでは、アプリケーションのパフォーマンスに影響を与える 3D クラスとプロパティの一覧を示し、それらを使用するときにパフォーマンスを最適化するための推奨事項も併せて説明します。

このトピックは、Windows Presentation Foundation (WPF) 3D 機能について詳しく理解していることを前提としています。 このドキュメントの提案は、"レンダリング層 2" (おおまかに言うと、ピクセル シェーダー バージョン 2.0 と頂点シェーダー バージョン 2.0 をサポートするハードウェアとして定義されています) に適用されます。 詳細については、「グラフィックスの描画層」を参照してください。

パフォーマンスへの影響:High

プロパティ 推奨事項
Brush ブラシの速度 (最速から低速):

SolidColorBrush

LinearGradientBrush

ImageBrush

DrawingBrush (キャッシュ済み)

VisualBrush (キャッシュ済み)

RadialGradientBrush

DrawingBrush (キャッシュされていない)

VisualBrush (キャッシュされていない)
ClipToBoundsProperty Windows Presentation Foundation (WPF) で Viewport3D のコンテンツを Viewport3D の四角形に明示的にクリップする必要がない場合は常に、Viewport3D.ClipToBounds を false に設定します。 Windows Presentation Foundation (WPF) のアンチエイリアスされたクリッピングは非常に遅くなる可能性があり、Viewport3DClipToBounds は既定で有効 (低速) になっています。
IsHitTestVisible マウス ヒット テストの実行時に、Windows Presentation Foundation (WPF) で Viewport3D のコンテンツを考慮する必要がない場合は常に、Viewport3D.IsHitTestVisible を false に設定します。 3D コンテンツのヒット テストは、ソフトウェアで実行され、メッシュが大きいと速度が低下する場合があります。 Viewport3DIsHitTestVisible は既定で有効 (低速) になっています。
GeometryModel3D 異なる素材または変換が必要な場合にのみ、異なるモデルを作成します。 それ以外の場合は、同じ素材と変換を含む多数の GeometryModel3D インスタンスを、少数のより大きな GeometryModel3D および MeshGeometry3D インスタンスに結合しようとします。
MeshGeometry3D メッシュ アニメーション (フレームごとにメッシュの個々の頂点を変更すること) は、Windows Presentation Foundation (WPF) では常に効率的であるとは限りません。 各頂点が変更されたときの変更通知のパフォーマンスへの影響を最小限に抑えるには、頂点ごとの変更を実行する前に、ビジュアル ツリーからメッシュを切り離します。 メッシュが変更されたら、それをビジュアル ツリーに再接続します。 また、この方法でアニメーション化されるメッシュのサイズを最小限にしてみます。
3D アンチエイリアシング レンダリングの速度を上げるには、添付プロパティ EdgeModeAliased に設定して、Viewport3D でのマルチサンプリングを無効にします。 Windows では、ピクセルあたり 4 サンプルの 3D アンチエイリアシングが既定で有効になっています。
テキスト 3D シーンのライブ テキスト (DrawingBrush または VisualBrush 内にあるためライブである) が低速になることがあります。 テキストが変更されない場合は、代わりに (RenderTargetBitmap によって) テキストのイメージを使用してみてください。
TileBrush ブラシのコンテンツが静的でないために 3D シーンで VisualBrush または DrawingBrush を使用する必要がある場合は、ブラシのキャッシュを試します (添付プロパティ CachingHintCache に設定します)。 必要な品質レベルを維持したまま、キャッシュされたブラシがあまり頻繁に再生成されないように、(添付プロパティ CacheInvalidationThresholdMinimum および CacheInvalidationThresholdMaximum を使用して) 最小および最大のスケール無効化しきい値を設定します。 既定では、DrawingBrushVisualBrush はキャッシュされません。つまり、ブラシで塗りつぶされたものを再レンダリングする必要があるたびに、まずブラシのコンテンツ全体を中間の面に再レンダリングする必要があります。
BitmapEffect BitmapEffect を使用すると、影響を受けるすべてのコンテンツがハードウェアの高速化なしで強制的にレンダリングされます。 パフォーマンスを最大限高めるには、BitmapEffect を使用しないでください。

パフォーマンスへの影響:Medium

プロパティ 推奨事項
MeshGeometry3D メッシュが、共有頂点を持つ隣接した三角形として定義され、それらの頂点の位置、法線、およびテクスチャ座標が同じである場合は、各共有頂点を 1 回だけ定義し、TriangleIndices を使用して指標によってそれらの三角形を定義します。
ImageBrush テクスチャのサイズを明示的に制御している場合 (RenderTargetBitmapImageBrush のどちらか一方または両方を使用している場合) は、そのサイズを最小限にしてみます。 解像度テクスチャが低くなると、画質が低下する可能性があるので、品質とパフォーマンスの適切なバランスを探してください。
Opacity 半透明の 3D コンテンツ (反射など) をレンダリングする場合は、Viewport3D.Opacity を 1 未満の値に設定することで別の半透明の Viewport3D を作成するのではなく、(Opacity または Color によって) ブラシまたは素材の不透明度プロパティを使用します。
Viewport3D シーンで使用している Viewport3D オブジェクトの数を最小限に抑えます。 モデルごとに個別の Viewport3D インスタンスを作成するのではなく、同じ Viewport3D に複数の 3D モデルを配置します。
Freezable 通常は、MeshGeometry3DGeometryModel3D、ブラシ、素材を再利用すると便利です。 すべて Freezable から派生しているため、マルチペアレントにできます。
Freezable アプリケーションでプロパティが変更されないままになる場合は、Freezable に対して Freeze メソッドを呼び出します。 固定すると、ワーキング セットを減らして速度を上げることができます。
Brush ブラシのコンテンツが変更されない場合は、VisualBrushDrawingBrush ではなく ImageBrush を使用します。 2D コンテンツは、RenderTargetBitmap によって Image に変換され、その後 ImageBrush で使用できます。
BackMaterial 実際に GeometryModel3D の背面を表示する必要がある場合を除き、BackMaterial は使用しないでください。
Light ライトの速度 (最速から低速):

AmbientLight

DirectionalLight

PointLight

SpotLight
MeshGeometry3D 次の制限の下でメッシュ サイズを維持するようにしてください。

Positions:20,001 個の Point3D インスタンス

TriangleIndices:60,003 個の Int32 インスタンス
Material 素材の速度 (最速から低速):

EmissiveMaterial

DiffuseMaterial

SpecularMaterial
Brush Windows Presentation Foundation (WPF) 3D は、非表示のブラシ (黒のアンビエント ブラシ、クリア ブラシなど) を一貫した方法でオプトアウトしていません。 これらをシーンに入れないことを検討してください。
MaterialGroup MaterialGroup 内の各 Material で別のレンダリング パスが生成されます。そのため、単純な素材でも多くの素材を含めると、GPU で塗りつぶしの要求が大幅に増加する可能性があります。 MaterialGroup 内の素材の数は最小限に抑えてください。

パフォーマンスへの影響:Low

プロパティ 推奨事項
Transform3DGroup アニメーションまたはデータ バインディングが不要な場合は、複数の変換を含む変換グループを使用するのではなく、1 つの MatrixTransform3D を使用して、それを、使用しなければ変換グループに個別に存在する変換すべての結果に設定します。
Light シーンのライト数を最小限に抑えます。 シーン内のライトが多すぎると、Windows Presentation Foundation (WPF) が強制的にソフトウェア レンダリングにフォールバックされます。 上限は、約 110 個の DirectionalLight オブジェクト、70 個の PointLight オブジェクト、または 40 個のSpotLight オブジェクトです。
ModelVisual3D 静的オブジェクトを別の ModelVisual3D インスタンスに配置することで、移動するオブジェクトとそれらを区別します。 ModelVisual3D は、変換された境界をキャッシュするので、GeometryModel3D よりも "重い" です。 GeometryModel3D はモデルとして最適化され、ModelVisual3D はシーン ノードとして最適化されています。 GeometryModel3D の共有インスタンスをシーンに配置するには、ModelVisual3D を使用します。
Light シーンのライト数を変更する回数を最小限に抑えます。 ライト数を変更するたびにシェーダーの再生成と再コンパイルが強制されます。ただし、その構成が以前に存在していた (そのため、そのシェーダーがキャッシュされていた) 場合を除きます。
淡色 黒のライトは表示されませんが、レンダリング時間に追加されます。除外することを検討してください。
MeshGeometry3D Windows Presentation Foundation (WPF) で MeshGeometry3D の PositionsNormalsTextureCoordinatesTriangleIndices などの大きなコレクションの構築時間を最小限に抑えるには、値の作成前にコレクションのサイズを事前に設定します。 可能であれば、コレクションのコンストラクターに、配列やリストなどの事前に作成されたデータ構造を渡します。

関連項目