最大化 WPF 3D 效能

當您使用 Windows Presentation Foundation (WPF) 來建置 3D 控制項,並在應用程式中包含 3D 場景時,請務必考慮效能優化。 本主題提供 3D 類別和屬性的清單,這些類別和屬性對您的應用程式具有效能影響,以及當您使用這些類別時優化效能的建議。

本主題假設進階瞭解 Windows Presentation Foundation (WPF) 3D 功能。 本檔中的建議適用于「轉譯層 2」,大致定義為支援圖元著色器 2.0 版和頂點著色器 2.0 版的硬體。 如需詳細資訊,請參閱 圖形轉譯層

效能影響:高

屬性 建議
Brush 筆刷速度 (最快到最慢):

SolidColorBrush

LinearGradientBrush

ImageBrush

DrawingBrush (快取)

VisualBrush (快取)

RadialGradientBrush

DrawingBrush (未快取)

VisualBrush (未快取)
ClipToBoundsProperty 當您不需要 Windows Presentation Foundation (WPF) 將 的內容明確裁剪 Viewport3D 至 Viewport3D 的矩形時,請設定 Viewport3D.ClipToBounds 為 false。 Windows Presentation Foundation (WPF) 反鋸齒裁剪速度可能非常慢,且 ClipToBounds 預設會在 上 Viewport3D 啟用 (緩慢)。
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 多重取樣。 根據預設,Windows 上會啟用 3D 反鋸齒功能,每個圖元有 4 個樣本。
Text 3D 場景中的即時文字(即時,因為它位於 DrawingBrushVisualBrush 中),可能很慢。 除非文字會變更,否則請嘗試改用文字的影像(透過 RenderTargetBitmap )。
TileBrush 如果您必須在 3D 場景中使用 VisualBrushDrawingBrush ,因為筆刷的內容不是靜態的,請嘗試快取筆刷(將附加屬性 CachingHint 設定為 Cache )。 設定最小和最大小數位數無效閾值(具有附加屬性 CacheInvalidationThresholdMinimumCacheInvalidationThresholdMaximum ),讓快取的筆刷不會太頻繁地重新產生,同時仍維持所需的品質層級。 根據預設, DrawingBrush 而且 VisualBrush 不會快取,這表示每次使用筆刷繪製的專案都必須重新轉譯時,筆刷的整個內容必須先重新轉譯為中繼表面。
BitmapEffect BitmapEffect 強制所有受影響的內容在沒有硬體加速的情況下轉譯。 為了獲得最佳效能,請勿使用 BitmapEffect

效能影響:中

屬性 建議
MeshGeometry3D 當網格定義為使用共用頂點來濫用三角形,且這些頂點具有相同的位置、一般和紋理座標時,請只定義每個共用頂點一次,然後使用 索引 TriangleIndices 定義您的三角形。
ImageBrush 當您明確控制大小時,請嘗試將紋理大小降到最低(當您使用 RenderTargetBitmap 和/或 ImageBrush 時)。 請注意,較低的解析度紋理可能會降低視覺品質,因此請嘗試找出品質與效能之間的正確平衡。
不透明度 轉譯半透明 3D 內容(例如反射)時,請使用筆刷或材質上的不透明度屬性(透過 OpacityColor ),而不是將 設定 Viewport3D.Opacity 為小於 1 的值來建立個別的半透明 Viewport3D
Viewport3D 將您在場景中使用的物件數目 Viewport3D 降至最低。 將許多 3D 模型放在相同的 Viewport3D 中,而不是為每個模型建立個別的 Viewport3D 實例。
Freezable 通常重複使用 、、 GeometryModel3D 筆刷和材質會很有説明 MeshGeometry3D 。 所有 都是多父系的,因為它們衍生自 Freezable
Freezable Freeze在 Freezables 上呼叫 方法,當其屬性在應用程式中維持不變時。 凍結可以減少工作集並提高速度。
Brush 當筆刷的內容不會變更時,請使用 ImageBrush 而非 VisualBrushDrawingBrush 。 2D 內容可以透過 轉換為 ImageRenderTargetBitmap ,然後在 中使用 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 中的每個都 Material 會導致另一個 MaterialGroup 轉譯階段,因此,包括許多材質,甚至簡單的材質,可以大幅增加 GPU 的填滿需求。 將 中的 MaterialGroup 材質數目降到最低。

效能影響:低

屬性 建議
Transform3DGroup 當您不需要動畫或資料系結時,不要使用包含多個轉換的轉換群組,請使用單 MatrixTransform3D 一 ,將它設定為轉換群組中獨立存在之所有轉換的乘積。
Light 將場景中的燈光數目降到最低。 場景中的燈光太多會強制 Windows Presentation Foundation (WPF) 回復到軟體轉譯。 限制約為 110 DirectionalLight 個物件、70 PointLight 個物件或 40 SpotLight 個物件。
ModelVisual3D 將物件與靜態物件分開,方法是將它們放在不同的 ModelVisual3D 實例中。 ModelVisual3D 比 GeometryModel3D 快取轉換界限更重。 GeometryModel3D 已優化為模型;ModelVisual3D 已優化為場景節點。 使用 ModelVisual3D 將 GeometryModel3D 的共用實例放入場景中。
Light 將您變更場景中燈光數目的次數降到最低。 光計數的每個變更都會強制著色器重新產生和重新編譯,除非該組態先前已存在(因此已快取著色器)。
淺色 無法看見黑燈,但會新增來轉譯時間:請考慮省略它們。
MeshGeometry3D 若要將 Windows Presentation Foundation (WPF) 中大型集合的建構時間降至最低,例如 MeshGeometry3D 的 PositionsNormalsTextureCoordinatesTriangleIndices ,在值母體擴展之前預先調整集合的大小。 可能的話,請傳遞集合的建構函式預先填入的資料結構,例如陣列或清單。

另請參閱