共用方式為


最大化 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.ClipToBounds (部分機器翻譯) 的內容裁剪為 Viewport3D 的矩形時,請將 Viewport3D 設定為 false。 Windows Presentation Foundation (WPF) 消除鋸齒裁剪可能非常慢,且預設會在 ClipToBounds (部分機器翻譯) 上啟用 Viewport3D (慢)。
IsHitTestVisible 當您不需要 Windows Presentation Foundation (WPF) 在執行滑鼠點擊測試時考慮 Viewport3D.IsHitTestVisible (部分機器翻譯) 的內容時,請將 Viewport3D 設定為 false。 點擊測試 3D 內容是在軟體中完成,而且對於大型網格來說可能很慢。 預設會在 IsHitTestVisible (部分機器翻譯) 上啟用 Viewport3D (英文) (慢)。
GeometryModel3D 只有在需要不同的材質或轉換時,才建立不同的模型。 否則,嘗試將許多具有相同材質和轉換的 GeometryModel3D (部分機器翻譯) 執行個體合併為幾個較大的 GeometryModel3D (部分機器翻譯) 和 MeshGeometry3D (部分機器翻譯) 執行個體。
MeshGeometry3D 網格動畫 (根據每個畫面變更網格的個別頂點) 在 Windows Presentation Foundation (WPF) 中不一定是有效率的。 若要在修改每個頂點時將變更通知的效能影響降到最低,在執行每個頂點修改之前,請先將網格與視覺化樹狀結構中斷連結。 修改網格之後,將其重新連結至視覺化樹狀結構。 此外,嘗試將以這種方式進行動畫處理的網格大小降到最低。
3D 消除鋸齒 若要提高轉譯速度,請將附加屬性 Viewport3D (英文) 設定為 EdgeMode,以停用 Aliased (部分機器翻譯) 上的多重取樣。 根據預設,會在 Windows 上啟用 3D 消除鋸齒功能,每個像素 4 個樣本。
文字 3D 場景中的即時文字 (即時,因其位於 DrawingBrush (部分機器翻譯) 或 VisualBrush (部分機器翻譯) 中) 可能很慢。 除非文字將變更,否則可嘗試改為使用文字的影像 (透過 RenderTargetBitmap (部分機器翻譯))。
TileBrush 如果您必須在 3D 場景中使用 VisualBrush (部分機器翻譯) 或 DrawingBrush (部分機器翻譯) (因為筆刷的內容不是靜態的),請嘗試快取筆刷 (將附加屬性 CachingHint (部分機器翻譯) 設定為 Cache)。 設定最小和最大的小數位數無效閾值 (具有附加屬性 CacheInvalidationThresholdMinimum (部分機器翻譯) 和 CacheInvalidationThresholdMaximum (英文)),讓快取的筆刷不會太頻繁地重新產生,同時仍維持所需的品質層級。 根據預設,不會快取 DrawingBrush (部分機器翻譯) 和 VisualBrush (部分機器翻譯),這表示每次使用筆刷繪製的內容必須重新轉譯時,必須先將筆刷的整個內容重新轉譯到中繼介面。
BitmapEffect BitmapEffect (部分機器翻譯) 會強制轉譯所有受影響的內容,而不需要硬體加速。 為了獲得最佳效能,請勿使用 BitmapEffect (部分機器翻譯)。

效能影響:中

房產 建議
MeshGeometry3D 當網格定義為使用共用頂點的鄰接三角形,且那些頂點具有相同的位置、法線及紋理座標時,只需定義每個共用頂點一次,然後使用 TriangleIndices (部分機器翻譯) 依索引定義三角形。
ImageBrush 當您可明確控制大小時 (當您正在使用 RenderTargetBitmap (部分機器翻譯) 和/或 ImageBrush (部分機器翻譯) 時),請嘗試將紋理大小降到最低。 請注意,較低解析度的紋理可能會降低視覺品質,因此,請嘗試在品質與效能之間找出適當的平衡。
不透明度 轉譯半透明 3D 內容 (例如反射) 時,使用筆刷或材質上的不透明度屬性 (透過 Opacity (部分機器翻譯) 或 Color (英文)),而不是將 Viewport3D 設定為小於 1 的值來建立個別半透明的 Viewport3D.Opacity (部分機器翻譯)。
Viewport3D 將您在場景中使用的 Viewport3D (部分機器翻譯) 物件數目降到最低。 將許多 3D 模型放在相同的 Viewport3D 中,而不是為每個模型建立個別的 Viewport3D 執行個體。
Freezable 通常,重複使用 MeshGeometry3D (部分機器翻譯)、 GeometryModel3D (部分機器翻譯)、筆刷和材質是有助益的。 這些全都是多父系的,因為它們均衍生自 Freezable
Freezable 當 Freezables 的屬性將在您的應用程式中維持不變時,請呼叫其上的 Freeze (英文) 方法。 凍結可以減少工作集並提高速度。
Brush 若筆刷的內容將不會變更,請使用 ImageBrush (部分機器翻譯),而不是 VisualBrush (部分機器翻譯) 或 DrawingBrush (部分機器翻譯)。 2D 內容可以透過 Image (部分機器翻譯) 轉換為 RenderTargetBitmap (部分機器翻譯),然後在 ImageBrush (部分機器翻譯) 中使用。
BackMaterial 除非您實際需要看到 BackMaterial (部分機器翻譯) 的背面,否則請勿使用 GeometryModel3D (英文)。
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 的 Positions (部分機器翻譯)、Normals (部分機器翻譯)、TextureCoordinates (部分機器翻譯) 和 TriangleIndices (部分機器翻譯)) 的建構時間降到最低,請在值母體之前預先調整集合的大小。 盡可能傳遞集合建構函式預先填入的資料結構,例如陣列或清單。

另請參閱