Bagikan melalui


Memaksimalkan Performa 3D WPF

Saat Anda menggunakan Windows Presentation Foundation (WPF) untuk membangun kontrol 3D dan menyertakan adegan 3D dalam aplikasi Anda, penting untuk mempertimbangkan pengoptimalan performa. Topik ini menyediakan daftar kelas dan properti 3D yang memiliki implikasi performa untuk aplikasi Anda, bersama dengan rekomendasi untuk mengoptimalkan performa saat Anda menggunakannya.

Topik ini mengasumsikan pemahaman lanjutan tentang fitur 3D Windows Presentation Foundation (WPF). Saran dalam dokumen ini berlaku untuk "rendering tier 2"—kira-kira didefinisikan sebagai perangkat keras yang mendukung pixel shader versi 2.0 dan vertex shader versi 2.0. Untuk detail selengkapnya, lihat Tingkat Rendering Grafis.

Dampak Performa: Tinggi

Properti Rekomendasi
Brush Kecepatan sikat (tercepat hingga terlambat):

SolidColorBrush

LinearGradientBrush

ImageBrush

DrawingBrush (di-cache)

VisualBrush (di-cache)

RadialGradientBrush

DrawingBrush (tidak di-cache)

VisualBrush (tidak di-cache)
ClipToBoundsProperty Atur Viewport3D.ClipToBounds ke false setiap kali Anda tidak perlu membuat Windows Presentation Foundation (WPF) secara eksplisit mengklip isi ke Viewport3D persegi panjang Viewport3D. Pengklipan antialias Windows Presentation Foundation (WPF) bisa sangat lambat, dan ClipToBounds diaktifkan (lambat) secara default pada Viewport3D.
IsHitTestVisible Atur Viewport3D.IsHitTestVisible ke false setiap kali Anda tidak memerlukan Windows Presentation Foundation (WPF) untuk mempertimbangkan konten saat Viewport3D melakukan pengujian hit mouse. Memukul pengujian konten 3D dilakukan dalam perangkat lunak dan bisa lambat dengan jala besar. IsHitTestVisible diaktifkan (lambat) secara default pada Viewport3D.
GeometryModel3D Buat model yang berbeda hanya ketika memerlukan Material atau Transformasi yang berbeda. Jika tidak, cobalah untuk mengkoalisi banyak GeometryModel3D instans dengan Bahan dan Transformasi yang sama menjadi beberapa yang lebih besar GeometryModel3D dan MeshGeometry3D instans.
MeshGeometry3D Animasi jala—mengubah simpul individual jala berdasarkan per bingkai—tidak selalu efisien di Windows Presentation Foundation (WPF). Untuk meminimalkan dampak performa pemberitahuan perubahan saat setiap vertex dimodifikasi, lepaskan jala dari pohon visual sebelum melakukan modifikasi per vertex. Setelah jala dimodifikasi, lampirkan kembali ke pohon visual. Selain itu, cobalah untuk meminimalkan ukuran jala yang akan dianimasikan dengan cara ini.
Antialias 3D Untuk meningkatkan kecepatan penyajian, nonaktifkan multisampling pada dengan Viewport3D mengatur properti EdgeMode terlampir ke Aliased. Secara default, antialias 3D diaktifkan pada Windows dengan 4 sampel per piksel.
Teks Teks langsung dalam adegan 3D (langsung karena berada di atau DrawingBrushVisualBrush) bisa lambat. Cobalah untuk menggunakan gambar teks sebagai gantinya (melalui RenderTargetBitmap) kecuali teks akan berubah.
TileBrush Jika Anda harus menggunakan VisualBrush atau DrawingBrush dalam adegan 3D karena konten sikat tidak statis, coba cache kuas (atur properti CachingHint terlampir ke Cache). Atur ambang batas pembatalan skala minimum dan maksimum (dengan properti CacheInvalidationThresholdMinimum terlampir dan CacheInvalidationThresholdMaximum) sehingga kuas cache tidak akan terlalu sering diregenerasi, sambil tetap mempertahankan tingkat kualitas yang Anda inginkan. Secara default, DrawingBrush dan VisualBrush tidak di-cache, yang berarti bahwa setiap kali sesuatu yang dicat dengan kuas harus dirender ulang, seluruh konten kuas harus terlebih dahulu dirender ulang ke permukaan perantara.
BitmapEffect BitmapEffect memaksa semua konten yang terpengaruh untuk dirender tanpa akselerasi perangkat keras. Untuk performa terbaik, jangan gunakan BitmapEffect.

Dampak Performa: Sedang

Properti Rekomendasi
MeshGeometry3D Ketika jala didefinisikan sebagai segitiga abutting dengan simpul bersama dan simpul tersebut memiliki posisi, normal, dan koordinat tekstur yang sama, tentukan setiap puncak bersama hanya sekali dan kemudian tentukan segitiga Anda dengan indeks dengan TriangleIndices.
ImageBrush Cobalah untuk meminimalkan ukuran tekstur saat Anda memiliki kontrol eksplisit atas ukuran (saat Anda menggunakan RenderTargetBitmap dan/atau ImageBrush). Perhatikan bahwa tekstur resolusi yang lebih rendah dapat mengurangi kualitas visual, jadi cobalah untuk menemukan keseimbangan yang tepat antara kualitas dan performa.
Opacity Saat merender konten 3D tembus pandang (seperti pantulan), gunakan properti opasitas pada kuas atau bahan (melalui Opacity atau Color) alih-alih membuat tembus pandang Viewport3D terpisah dengan mengatur Viewport3D.Opacity ke nilai kurang dari 1.
Viewport3D Minimalkan jumlah Viewport3D objek yang Anda gunakan dalam adegan. Letakkan banyak model 3D dalam Viewport3D yang sama daripada membuat instans Viewport3D terpisah untuk setiap model.
Freezable Biasanya bermanfaat untuk menggunakan MeshGeometry3Dkembali , , GeometryModel3DSikat, dan Bahan. Semua multiparentable karena berasal dari Freezable.
Freezable Freeze Panggil metode pada Freezables ketika propertinya akan tetap tidak berubah di aplikasi Anda. Pembekuan dapat mengurangi set kerja dan meningkatkan kecepatan.
Brush Gunakan ImageBrush alih-alih VisualBrush atau DrawingBrush ketika konten kuas tidak akan berubah. Konten 2D dapat dikonversi ke Image via RenderTargetBitmap dan kemudian digunakan dalam ImageBrush.
BackMaterial Jangan gunakan BackMaterial kecuali Anda benar-benar perlu melihat wajah belakang Anda GeometryModel3D.
Light Kecepatan cahaya (tercepat hingga terlambat):

AmbientLight

DirectionalLight

PointLight

SpotLight
MeshGeometry3D Cobalah untuk menjaga ukuran jala di bawah batas ini:

Positions: 20.001 Point3D instans

TriangleIndices: 60.003 Int32 instans
Material Kecepatan material (tercepat hingga terlambat):

EmissiveMaterial

DiffuseMaterial

SpecularMaterial
Brush Windows Presentation Foundation (WPF) 3D tidak memilih keluar dari sikat tak terlihat (sikat sekitar hitam, sikat bening, dll.) dengan cara yang konsisten. Pertimbangkan untuk menghilangkan ini dari adegan Anda.
MaterialGroup Masing-masing Material dalam suatu MaterialGroup penyebab pass penyajian lain, jadi termasuk banyak bahan, bahkan bahan sederhana, dapat secara dramatis meningkatkan tuntutan pengisian pada GPU Anda. Minimalkan jumlah bahan di Anda MaterialGroup.

Dampak Performa: Rendah

Properti Rekomendasi
Transform3DGroup Ketika Anda tidak memerlukan animasi atau pengikatan data, alih-alih menggunakan grup transformasi yang berisi beberapa transformasi, gunakan satu MatrixTransform3D, mengaturnya menjadi produk dari semua transformasi yang akan ada secara independen dalam grup transformasi.
Light Minimalkan jumlah lampu di adegan Anda. Terlalu banyak lampu dalam adegan akan memaksa Windows Presentation Foundation (WPF) untuk kembali ke penyajian perangkat lunak. Batasnya sekitar 110 DirectionalLight objek, 70 PointLight objek, atau 40 SpotLight objek.
ModelVisual3D Pisahkan objek pemindahan dari objek statis dengan menempatkannya dalam instans terpisah ModelVisual3D . ModelVisual3D "lebih berat" daripada GeometryModel3D karena cache mengubah batas. GeometryModel3D dioptimalkan untuk menjadi model; ModelVisual3D dioptimalkan untuk menjadi simpul adegan. Gunakan ModelVisual3D untuk menempatkan instans bersama GeometryModel3D ke dalam adegan.
Light Minimalkan berapa kali Anda mengubah jumlah lampu dalam adegan. Setiap perubahan jumlah cahaya memaksa regenerasi shader dan kompilasi ulang kecuali konfigurasi tersebut telah ada sebelumnya (dan dengan demikian shader-nya di-cache).
Ringan Lampu hitam tidak akan terlihat, tetapi akan menambah waktu render; pertimbangkan untuk menghilangkannya.
MeshGeometry3D Untuk meminimalkan waktu konstruksi koleksi besar di Windows Presentation Foundation (WPF), seperti MeshGeometry3D's Positions, , NormalsTextureCoordinates, dan TriangleIndices, pre-size koleksi sebelum populasi nilai. Jika memungkinkan, berikan struktur data yang telah diisi sebelumnya oleh konstruktor koleksi seperti array atau Daftar.

Baca juga