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

Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) を使用して3D コントロールを作成し、アプリケーションに3D シーンを含めると、パフォーマンスの最適化を考慮することが重要になります。As you use the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) to build 3D controls and include 3D scenes in your applications, it is important to consider performance optimization. このトピックでは、アプリケーションのパフォーマンスに影響を与える3D クラスとプロパティの一覧と、それらを使用するときのパフォーマンスを最適化するための推奨事項について説明します。This topic provides a list of 3D classes and properties that have performance implications for your application, along with recommendations for optimizing performance when you use them.

このトピックでは、Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) 3D 機能について高度に理解することを前提としています。This topic assumes an advanced understanding of Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) 3D features. このドキュメントの提案は、"レンダリング層 2" に適用されます。これは、ピクセルシェーダーバージョン2.0 と頂点シェーダーバージョン2.0 をサポートするハードウェアとしてほぼ定義されています。The suggestions in this document apply to "rendering tier 2"—roughly defined as hardware that supports pixel shader version 2.0 and vertex shader version 2.0. 詳細については、「グラフィックスの描画層」を参照してください。For more details, see Graphics Rendering Tiers.

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

プロパティProperty 推奨Recommendation
Brush ブラシの速度 (最速から低速):Brush speed (fastest to slowest):

SolidColorBrush

LinearGradientBrush

ImageBrush

DrawingBrush (キャッシュ済み)DrawingBrush (cached)

VisualBrush (キャッシュ済み)VisualBrush (cached)

RadialGradientBrush

DrawingBrush (キャッシュなし)DrawingBrush (uncached)

VisualBrush (キャッシュなし)VisualBrush (uncached)
ClipToBoundsProperty Viewport3D の内容を Viewport3D's 四角形に明示的にクリップ Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) 必要がない場合は常に、Viewport3D.ClipToBounds を false に設定します。Set Viewport3D.ClipToBounds to false whenever you do not need to have Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) explicitly clip the content of a Viewport3D to the Viewport3D’s rectangle. アンチエイリアス化されたクリップ Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) は非常に遅くなり、Viewport3Dでは ClipToBounds が既定で有効 (低速) になります。Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) antialiased clipping can be very slow, and ClipToBounds is enabled (slow) by default on Viewport3D.
IsHitTestVisible マウスヒットテストの実行時に Viewport3D の内容を考慮する必要 Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) がない場合は常に、Viewport3D.IsHitTestVisible を false に設定します。Set Viewport3D.IsHitTestVisible to false whenever you do not need Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) to consider the content of a Viewport3D when performing mouse hit testing. ヒットテスト3D コンテンツはソフトウェアで実行され、大きなメッシュでは速度が低下する可能性があります。Hit testing 3D content is done in software and can be slow with large meshes. Viewport3Dでは、既定で IsHitTestVisible が有効 (低速) になります。IsHitTestVisible is enabled (slow) by default on Viewport3D.
GeometryModel3D 異なるモデルを作成するのは、異なる素材または変換が必要な場合のみにしてください。Create different models only when they require different Materials or Transforms. それ以外の場合は、同じ素材を持つ多数の GeometryModel3D インスタンスを結合し、いくつかの大きな GeometryModel3DMeshGeometry3D インスタンスに変換します。Otherwise, try to coalesce many GeometryModel3D instances with the same Materials and Transforms into a few larger GeometryModel3D and MeshGeometry3D instances.
MeshGeometry3D メッシュアニメーション—フレームごとにメッシュの個々の頂点を変更することは、Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)では常に効率的であるとは限りません。Mesh animation—changing the individual vertices of a mesh on a per-frame basis—is not always efficient in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF). 各頂点が変更されたときの変更通知のパフォーマンスへの影響を最小限に抑えるには、頂点ごとの変更を実行する前に、ビジュアルツリーからメッシュをデタッチします。To minimize the performance impact of change notifications when each vertex is modified, detach the mesh from the visual tree before performing per-vertex modification. メッシュが変更されたら、ビジュアルツリーに再アタッチします。Once the mesh has been modified, reattach it to the visual tree. また、この方法でアニメーション化されるメッシュのサイズを最小化してみてください。Also, try to minimize the size of meshes that will be animated in this way.
3D アンチエイリアシング3D Antialiasing 表示速度を上げるには、添付プロパティ EdgeModeAliasedに設定して、Viewport3D のマルチサンプリングを無効にします。To increase rendering speed, disable multisampling on a Viewport3D by setting the attached property EdgeMode to Aliased. 既定では、3D アンチエイリアシングは、1ピクセルあたり4サンプルの Windows で有効になっています。By default, 3D antialiasing is enabled on Windows with 4 samples per pixel.
TextText 3D シーンのライブテキスト (DrawingBrush または VisualBrush内にあるためライブテキスト) が低速になることがあります。Live text in a 3D scene (live because it’s in a DrawingBrush or VisualBrush) can be slow. テキストが変更されない限り、(RenderTargetBitmap経由で) テキストの画像を使用してください。Try to use images of the text instead (via RenderTargetBitmap) unless the text will change.
TileBrush ブラシの内容が静的でないために3D シーンで VisualBrush または DrawingBrush を使用する必要がある場合は、ブラシのキャッシュを試します (添付プロパティ CachingHintCacheに設定します)。If you must use a VisualBrush or a DrawingBrush in a 3D scene because the brush’s content is not static, try caching the brush (setting the attached property CachingHint to Cache). 必要な品質レベルを維持したまま、キャッシュされたブラシが頻繁に再生成されないように、(添付プロパティ CacheInvalidationThresholdMinimum および CacheInvalidationThresholdMaximum) のスケール無効化の最小しきい値と最大値を設定します。Set the minimum and maximum scale invalidation thresholds (with the attached properties CacheInvalidationThresholdMinimum and CacheInvalidationThresholdMaximum) so that the cached brushes won’t be regenerated too frequently, while still maintaining your desired level of quality. 既定では、DrawingBrushVisualBrush はキャッシュされません。つまり、ブラシで塗りつぶされたものを再描画する必要があるたびに、ブラシのコンテンツ全体を中間サーフェイスに再描画する必要があります。By default, DrawingBrush and VisualBrush are not cached, meaning that every time something painted with the brush has to be re-rendered, the entire content of the brush must first be re-rendered to an intermediate surface.
BitmapEffect BitmapEffect は、影響を受けるすべてのコンテンツを強制的にハードウェアアクセラレータなしで表示します。BitmapEffect forces all affected content to be rendered without hardware acceleration. 最適なパフォーマンスを得るには、BitmapEffectを使用しないでください。For best performance, do not use BitmapEffect.

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

プロパティProperty 推奨Recommendation
MeshGeometry3D メッシュが共有頂点を持つ隣接する三角形として定義され、それらの頂点の位置、法線、およびテクスチャの座標が同じである場合は、各共有頂点を1回だけ定義し、TriangleIndicesでインデックスを使用して三角形を定義します。When a mesh is defined as abutting triangles with shared vertices and those vertices have the same position, normal, and texture coordinates, define each shared vertex only once and then define your triangles by index with TriangleIndices.
ImageBrush サイズを明示的に制御している場合 (RenderTargetBitmapImageBrushを使用している場合) は、テクスチャのサイズを最小限に抑えてください。Try to minimize texture sizes when you have explicit control over the size (when you’re using a RenderTargetBitmap and/or an ImageBrush). 解像度が低くなると、画質が低下する可能性があるので、品質とパフォーマンスのバランスを適切に見つけることができます。Note that lower resolution textures can decrease visual quality, so try to find the right balance between quality and performance.
OpacityOpacity 半透明の3D コンテンツ (反射など) をレンダリングする場合は、Viewport3D.Opacity を1未満の値に設定することによって、別の半透明の Viewport3D を作成するのではなく、(Opacity または Colorによって) ブラシまたはマテリアルの不透明度プロパティを使用します。When rendering translucent 3D content (such as reflections), use the opacity properties on brushes or materials (via Opacity or Color) instead of creating a separate translucent Viewport3D by setting Viewport3D.Opacity to a value less than 1.
Viewport3D シーンで使用している Viewport3D オブジェクトの数を最小限に抑えます。Minimize the number of Viewport3D objects you’re using in a scene. モデルごとに個別の Viewport3D インスタンスを作成するのではなく、複数の3D モデルを同じ Viewport3D に配置します。Put many 3D models in the same Viewport3D rather than creating separate Viewport3D instances for each model.
Freezable 通常は、MeshGeometry3DGeometryModel3D、ブラシ、マテリアルを再利用すると便利です。Typically it’s beneficial to reuse MeshGeometry3D, GeometryModel3D, Brushes, and Materials. これらは Freezableから派生したものであるため、すべてが可能です。All are multiparentable since they’re derived from Freezable.
Freezable アプリケーションでプロパティが変更されていない場合は、Freezable で Freeze メソッドを呼び出します。Call the Freeze method on Freezables when their properties will remain unchanged in your application. 固定すると、ワーキングセットを減らして速度を上げることができます。Freezing can decrease working set and increase speed.
Brush ブラシの内容が変更されない場合は、VisualBrush または DrawingBrush ではなく ImageBrush を使用します。Use ImageBrush instead of VisualBrush or DrawingBrush when the content of the brush will not change. 2D コンテンツは、RenderTargetBitmap を使用して Image に変換し、ImageBrushで使用できます。2D content can be converted to an Image via RenderTargetBitmap and then used in an ImageBrush.
BackMaterial GeometryModel3Dの背面を実際に表示する必要がある場合を除き、BackMaterial は使用しないでください。Don’t use BackMaterial unless you actually need to see the back faces of your GeometryModel3D.
Light ライト速度 (最速から低速):Light speed (fastest to slowest):

AmbientLight

DirectionalLight

PointLight

SpotLight
MeshGeometry3D 次の制限事項の下でメッシュサイズを維持してください:Try to keep mesh sizes under these limits:

Positions: 20001 Point3D インスタンスPositions: 20,001 Point3D instances

TriangleIndices: 60003 Int32 インスタンスTriangleIndices: 60,003 Int32 instances
Material 素材の速度 (最速から低速):Material speed (fastest to slowest):

EmissiveMaterial

DiffuseMaterial

SpecularMaterial
Brush Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) 3D は、一貫した方法で非表示のブラシ (黒のアンビエントブラシ、クリアブラシなど) をオプトアウトしません。3D doesn't opt out of invisible brushes (black ambient brushes, clear brushes, etc.) in a consistent way. これらをシーンから省略することを検討してください。Consider omitting these from your scene.
MaterialGroup MaterialGroup 内の各 Material によって別のレンダリングパスが生成されます。そのため、多くの素材を含め、単純な素材でも、GPU での入力要求が大幅に増加する可能性があります。Each Material in a MaterialGroup causes another rendering pass, so including many materials, even simple materials, can dramatically increase the fill demands on your GPU. MaterialGroup内の素材の数を最小限に抑えます。Minimize the number of materials in your MaterialGroup.

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

プロパティProperty 推奨Recommendation
Transform3DGroup アニメーションまたはデータバインディングが不要な場合は、複数の変換を含む変換グループを使用するのではなく、1つの MatrixTransform3Dを使用して、変換グループに個別に存在する可能性があるすべての変換の積として設定します。When you don’t need animation or data binding, instead of using a transform group containing multiple transforms, use a single MatrixTransform3D, setting it to be the product of all the transforms that would otherwise exist independently in the transform group.
Light シーンのライト数を最小限に抑えます。Minimize the number of lights in your scene. シーン内のライトが多すぎると、Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) 強制的にソフトウェアレンダリングにフォールバックされます。Too many lights in a scene will force Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) to fall back to software rendering. 制限は、約 110 DirectionalLight オブジェクト、70 PointLight オブジェクト、または 40 SpotLight オブジェクトです。The limits are roughly 110 DirectionalLight objects, 70 PointLight objects, or 40 SpotLight objects.
ModelVisual3D オブジェクトを別の ModelVisual3D インスタンスに配置することで、オブジェクトを静的オブジェクトから分離します。Separate moving objects from static objects by putting them in separate ModelVisual3D instances. ModelVisual3D は、変換された境界をキャッシュするため GeometryModel3D よりも "重い" です。ModelVisual3D is "heavier" than GeometryModel3D because it caches transformed bounds. GeometryModel3D はモデルとして最適化されています。ModelVisual3D はシーンノードになるように最適化されています。GeometryModel3D is optimized to be a model; ModelVisual3D is optimized to be a scene node. ModelVisual3D を使用して、GeometryModel3D の共有インスタンスをシーンに配置します。Use ModelVisual3D to put shared instances of GeometryModel3D into the scene.
Light シーンのライト数を変更する回数を最小限に抑えます。Minimize the number of times you change the number of lights in the scene. これらの構成が既に存在していて、シェーダーがキャッシュされている場合を除き、ライト数を変更するたびにシェーダーの再生成と再コンパイルが行われます。Each change of light count forces a shader regeneration and recompilation unless that configuration has existed previously (and thus had its shader cached).
浅煎りLight 黒のライトは表示されませんが、レンダリング時間が追加されます。省略することを検討してください。Black lights won’t be visible, but they will add to render time; consider omitting them.
MeshGeometry3D MeshGeometry3D's PositionsNormalsTextureCoordinatesTriangleIndicesなど、Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)の大きなコレクションの構築時間を最小限に抑えるには、値を作成する前にコレクションのサイズを事前に設定します。To minimize the construction time of large collections in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF), such as a MeshGeometry3D’s Positions, Normals, TextureCoordinates, and TriangleIndices, pre-size the collections before value population. 可能であれば、コレクションのコンストラクターに、配列やリストなどの事前設定されたデータ構造を渡します。If possible, pass the collections’ constructors prepopulated data structures such as arrays or Lists.

参照See also