WPF 3D パフォーマンスを最大化する
Windows Presentation Foundation (WPF) を使用して 3D コントロールを構築し、アプリケーションに 3D シーンを含める場合は、パフォーマンスの最適化を検討することが重要です。 このトピックでは、アプリケーションのパフォーマンスに影響を与える 3D クラスとプロパティの一覧と、それらを使用するときのパフォーマンスを最適化するための推奨事項について説明します。
このトピックでは、Windows Presentation Foundation (WPF) の 3D 機能について高度に理解していることを前提としています。 このドキュメントの提案は、ピクセル シェーダー バージョン 2.0 と頂点シェーダー バージョン 2.0 をサポートするハードウェアとして大まかに定義されている "レンダリング層 2" に適用されます。 詳細については、「グラフィックス レンダリング層の」を参照してください。
パフォーマンスへの影響: 高
財産 | 勧告 |
---|---|
Brush | ブラシの速度 (最速から最も遅い): SolidColorBrush LinearGradientBrush ImageBrush DrawingBrush (キャッシュ) VisualBrush (キャッシュ) RadialGradientBrush DrawingBrush (キャッシュなし) VisualBrush (キャッシュなし) |
ClipToBoundsProperty | Windows Presentation Foundation (WPF) で Viewport3D のコンテンツを Viewport3D の四角形に明示的にクリップする必要がない場合は常に、Viewport3D.ClipToBounds を false に設定します。 Windows Presentation Foundation (WPF) のアンチエイリアシングされたクリッピングは非常に遅くなる可能性があり、Viewport3Dでは既定で ClipToBounds が有効になっています (低速)。 |
IsHitTestVisible | マウス ヒット テストを実行するときに、windows Presentation Foundation (WPF) で Viewport3D の内容を考慮する必要がない場合は常に、Viewport3D.IsHitTestVisible を false に設定します。 ヒット テストの 3D コンテンツはソフトウェアで行われ、大きなメッシュでは遅くなる可能性があります。 IsHitTestVisible は、Viewport3Dで既定で有効になっています (低速)。 |
GeometryModel3D | 異なるマテリアルまたは変換が必要な場合にのみ、異なるモデルを作成します。 それ以外の場合は、同じマテリアルと変換を使用して多数の GeometryModel3D インスタンスを、いくつかの大きな GeometryModel3D および MeshGeometry3D インスタンスに結合してみてください。 |
MeshGeometry3D | フレームごとにメッシュの個々の頂点を変更するメッシュ アニメーションは、Windows Presentation Foundation (WPF) では常に効率的であるとは限りません。 各頂点が変更されたときの変更通知のパフォーマンスへの影響を最小限に抑えるには、頂点ごとの変更を実行する前に、ビジュアル ツリーからメッシュをデタッチします。 メッシュが変更されたら、ビジュアル ツリーに再アタッチします。 また、この方法でアニメーション化されるメッシュのサイズを最小限に抑えるようにしてください。 |
3D アンチエイリアシング | レンダリング速度を上げるには、添付プロパティの EdgeMode を Aliased に設定して、Viewport3D のマルチサンプリングを無効にします。 既定では、3D アンチエイリアシングは、ピクセルあたり 4 サンプルで Windows で有効になっています。 |
テキスト | 3D シーン内にあるライブ テキスト(DrawingBrush または VisualBrushに含まれるためライ ブ)は、遅くなる可能性があります。 テキストが変更されない限り、代わりに(RenderTargetBitmap経由で)テキストの画像を使用してみてください。 |
TileBrush | ブラシのコンテンツが静的ではないために 3D シーンで VisualBrush または DrawingBrush を使用する必要がある場合は、ブラシをキャッシュしてみてください (添付プロパティ CachingHint を Cache に設定します)。 必要なレベルの品質を維持しながら、キャッシュされたブラシがあまり頻繁に再生成されないように、(添付プロパティ CacheInvalidationThresholdMinimum と CacheInvalidationThresholdMaximumを使用して) 最小スケールと最大スケールの無効化しきい値を設定します。 既定では、DrawingBrush と VisualBrush はキャッシュされません。つまり、ブラシで塗りつぶされた何かを再レンダリングする必要があるたびに、ブラシのコンテンツ全体を最初に中間サーフェスに再レンダリングする必要があります。 |
BitmapEffect | BitmapEffect は、影響を受けるすべてのコンテンツをハードウェア アクセラレーションなしで強制的にレンダリングします。 最適なパフォーマンスを得る場合は、BitmapEffectを使用しないでください。 |
パフォーマンスへの影響: 中
財産 | 勧告 |
---|---|
MeshGeometry3D | メッシュが共有頂点を持つ三角形を当て合わせて定義され、それらの頂点の位置、法線、テクスチャ座標が同じである場合は、各共有頂点を 1 回だけ定義し、TriangleIndicesでインデックスによって三角形を定義します。 |
ImageBrush | サイズを明示的に制御する場合 (RenderTargetBitmap や ImageBrushを使用している場合) は、テクスチャ サイズを最小限に抑えるようにしてください。 解像度の低いテクスチャは、視覚的な品質を低下させる可能性があるため、品質とパフォーマンスの間の適切なバランスを見つけてください。 |
不透明 | 半透明の 3D コンテンツ (反射など) をレンダリングする場合は、Viewport3D.Opacity を 1 未満の値に設定して個別の半透明 Viewport3D を作成する代わりに、ブラシまたはマテリアルの不透明度プロパティ (Opacity または Colorを使用) を使用します。 |
Viewport3D | シーンで使用している Viewport3D オブジェクトの数を最小限に抑えます。 モデルごとに個別の Viewport3D インスタンスを作成するのではなく、多数の 3D モデルを同じ Viewport3D に配置します。 |
Freezable | 通常、MeshGeometry3D、GeometryModel3D、ブラシ、マテリアルを再利用すると便利です。 これらは Freezable から派生しているため、すべてマルチペアレントです。 |
Freezable | アプリケーションでプロパティが変更されない場合は、Freezables で Freeze メソッドを呼び出します。 凍結はワーキングセットを減少させ、速度を上げることができます。 |
Brush | ブラシの内容が変更されない場合は、VisualBrush または DrawingBrush の代わりに 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内の材料の数を最小限に抑えます。 |
パフォーマンスへの影響: 低
財産 | 勧告 |
---|---|
Transform3DGroup | アニメーションやデータ バインディングが必要ない場合は、複数の変換を含む変換グループを使用する代わりに、1 つの MatrixTransform3Dを使用し、変換グループ内に独立して存在するすべての変換の積として設定します。 |
Light | シーン内のライトの数を最小限に抑えます。 シーン内のライトが多すぎると、Windows Presentation Foundation (WPF) がソフトウェア レンダリングにフォールバックする必要があります。 制限は、約 110 個の DirectionalLight オブジェクト、70 個の PointLight オブジェクト、または 40 個の SpotLight オブジェクトです。 |
ModelVisual3D | オブジェクトを別の ModelVisual3D インスタンスに配置して、移動オブジェクトを静的オブジェクトから分離します。 ModelVisual3D は、変換された境界をキャッシュするため、GeometryModel3D よりも "重い" 状態です。 GeometryModel3D はモデルとして最適化されています。ModelVisual3D は、シーン ノードとして最適化されています。 ModelVisual3D を使用して、GeometryModel3D の共有インスタンスをシーンに配置します。 |
Light | シーン内のライトの数を変更する回数を最小限に抑えます。 ライト カウントを変更するたびに、その構成が以前に存在し、シェーダーがキャッシュされている場合を除き、シェーダーの再生成と再コンパイルが強制されます。 |
光 | 黒いライトは表示されませんが、レンダリング時間が長くなります。それらを省略することを検討してください。 |
MeshGeometry3D | MeshGeometry3D の Positions、Normals、TextureCoordinates、TriangleIndicesなど、Windows Presentation Foundation (WPF) の大規模なコレクションの構築時間を最小限に抑えるには、値の作成前にコレクションのサイズを事前に設定します。 可能であれば、配列や Lists などの事前設定されたデータ構造をコレクションのコンストラクターに渡します。 |
関連情報
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET Desktop feedback