Performa — MRTK2
Memulai
Cara termampu untuk merasilialisasi performa adalah melalui framerate atau berapa kali aplikasi Anda dapat merender gambar per detik. Penting untuk memenuhi framerate target, seperti yang diuraikan oleh platform yang ditargetkan (yaitu Windows Mixed Reality, Oculus, dll). Misalnya, pada HoloLens, framerate target adalah 60 FPS. Aplikasi framerate rendah dapat mengakibatkan pengalaman pengguna yang memburuk seperti stabilisasi hologram yang memburuk, pelacakan dunia, pelacakan tangan, dan banyak lagi. Untuk membantu pengembang melacak dan mencapai framerate kualitas, Mixed Reality Toolkit menyediakan berbagai alat dan skrip.
Profiler visual
Untuk terus melacak performa selama masa pakai pengembangan, sangat disarankan untuk selalu menampilkan visual framerate saat menjalankan & men-debug aplikasi. Mixed Reality Toolkit menyediakan alat diagnostik Visual Profiler yang memberikan informasi real time tentang penggunaan FPS dan memori saat ini dalam tampilan aplikasi. Visual Profiler dapat dikonfigurasi melalui Pengaturan Sistem Diagnostik di bawah Pemeriksa Profil MRTK.
Selain itu, sangat penting untuk menggunakan Visual Profiler untuk melacak framerate saat berjalan di perangkat dibandingkan dengan berjalan di editor Unity atau emulator. Hasil performa yang paling akurat akan digambarkan saat berjalan di perangkat dengan build konfigurasi Rilis.
Catatan
Jika membangun untuk Windows Mixed Reality, sebarkan dengan build konfigurasi MASTER.
Optimalkan jendela
MRTK Optimize Window menawarkan alat informasi dan otomatisasi untuk membantu pengembang realitas campuran menyiapkan lingkungan mereka untuk hasil berperforma terbaik dan mengidentifikasi potensi hambatan dalam adegan mereka & aset. Konfigurasi utama tertentu di Unity dapat membantu memberikan hasil yang jauh lebih optimal untuk proyek realitas campuran.
Umumnya, pengaturan ini melibatkan konfigurasi penyajian yang ideal untuk realitas campuran. Aplikasi realitas campuran unik dibandingkan dengan pengembangan grafis 3D tradisional karena ada dua layar (yaitu dua mata) untuk dirender untuk seluruh adegan.
Pengaturan yang disarankan yang direferensikan di bawah ini dapat dikonfigurasi secara otomatis dalam proyek Unity dengan memanfaatkan Jendela Pengoptimalan MRTK.
Unity Profiler
Unity Profiler adalah alat yang berguna untuk menyelidiki detail performa aplikasi pada tingkat bingkai demi bingkai.
Waktu yang dihabiskan untuk CPU
Untuk mempertahankan kecepatan bingkai yang nyaman (biasanya 60 bingkai per detik), aplikasi perlu mencapai waktu jangka waktu maksimum 16,6 milidetik waktu CPU. Untuk membantu mengidentifikasi biaya fungsionalitas MRTK, Microsoft Mixed Reality Toolkit berisi penanda untuk jalur kode perulangan dalam (per bingkai). Penanda ini menggunakan format berikut, untuk membantu memahami fungsionalitas tertentu yang digunakan:
[MRTK] className.methodName
Catatan
Mungkin ada data tambahan setelah nama metode. Ini digunakan untuk mengidentifikasi fungsionalitas yang dijalankan secara kondisional dan berpotensi mahal yang dapat dihindari oleh perubahan kecil pada kode aplikasi.
Dalam contoh ini, hierarki telah diperluas untuk menunjukkan bahwa metode UpdateHandData kelas WindowsMixedRealityArticulatedHand memakan waktu CPU 0,44 md selama jangka waktu dianalisis. Data ini dapat digunakan untuk membantu menentukan apakah masalah performa terkait dengan kode aplikasi atau dari tempat lain dalam sistem.
Sangat disarankan agar pengembang melengkapi kode aplikasi dengan cara yang sama. Area utama fokus untuk instrumentasi kode aplikasi berada dalam penanganan aktivitas karena metode ini dibebankan ke perulangan pembaruan MRTK saat peristiwa dinaikkan. Waktu bingkai tinggi dalam perulangan pembaruan MRTK dapat menunjukkan kode mahal dalam metode penanganan aktivitas.
Pengaturan yang direkomendasikan untuk Unity
penyajian Single-Pass Instanced
Konfigurasi penyajian default untuk XR di Unity adalah Multi-pass. Pengaturan ini menginstruksikan Unity untuk menjalankan seluruh alur render dua kali, sekali untuk setiap mata. Ini dapat dioptimalkan dengan memilih penyajian Instans Single Pass sebagai gantinya. Konfigurasi ini memanfaatkan array target render untuk dapat melakukan satu panggilan gambar yang instans ke target render yang sesuai untuk setiap mata. Selain itu, mode ini memungkinkan semua penyajian dilakukan dalam satu eksekusi alur penyajian. Dengan demikian, memilih penyajian Instans Pass Tunggal sebagai jalur penyajian untuk aplikasi realitas campuran dapat menghemat waktu yang substansial pada CPU & GPU dan merupakan konfigurasi rendering yang direkomendasikan.
Namun, untuk mengeluarkan satu panggilan gambar untuk setiap jala ke setiap mata, instancing GPU harus didukung oleh semua shader. Instancing memungkinkan GPU untuk melakukan panggilan gambar multipleks di kedua mata. Shader bawaan Unity serta shader MRTK Standard secara default berisi instruksi instancing yang diperlukan dalam kode shader. Jika menulis shader kustom untuk Unity, shader ini mungkin perlu diperbarui untuk mendukung penyajian Single Pass Instanced.
Contoh Kode untuk Shader Kustom
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID //Insert
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
UNITY_VERTEX_OUTPUT_STEREO //Insert
};
v2f vert (appdata v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v); //Insert
UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
Pengaturan kualitas
Unity menyediakan preset untuk mengontrol kualitas penyajian untuk setiap titik akhir platform. Preset ini mengontrol fitur grafis apa yang dapat diaktifkan seperti bayangan, anti-aliasing, iluminasi global, dan banyak lagi. Disarankan untuk menurunkan pengaturan ini dan mengoptimalkan jumlah perhitungan yang dilakukan selama penyajian.
Langkah 1: Memperbarui proyek Unity realitas campuran untuk menggunakan pengaturan tingkat Kualitas Rendah
Mengedit>Pengaturan Proyek, lalu pilih kategori >Kualitas Pilih Kualitas Rendah untuk Platform UWP
Langkah 2: Untuk setiap file adegan Unity, nonaktifkan Iluminasi Global real time
Jendela>Rendering>Pengaturan> PencahayaanHapus centang Iluminasi Global Real-time
Berbagi buffer kedalaman (HoloLens)
Jika mengembangkan untuk platform Windows Mixed Reality dan khususnya HoloLens, mengaktifkan Berbagi Buffer Kedalaman di bawah Pengaturan XR dapat membantu stabilisasi hologram. Namun, pemrosesan buffer kedalaman dapat dikenakan biaya performa, terutama jika menggunakan format kedalaman 24-bit. Dengan demikian, sangat disarankan untuk mengonfigurasi buffer kedalaman ke presisi 16-bit.
Jika z-fighting terjadi karena format bit yang lebih rendah, konfirmasikan bidang klip jauh dari semua kamera diatur ke nilai serendah mungkin untuk aplikasi. Unity secara default menetapkan bidang klip jauh 1000m. Pada HoloLens, bidang klip jauh 50m umumnya lebih dari cukup untuk sebagian besar skenario aplikasi.
Catatan
Jika menggunakan format kedalaman 16-bit, efek buffer stensil yang diperlukan tidak akan berfungsi karena Unity tidak membuat buffer stensil dalam pengaturan ini. Memilih format kedalaman 24-bit secara sebaliknya umumnya akan membuat buffer stensil 8-bit, jika berlaku pada platform grafis titik akhir.
Jika menggunakan komponen Masker yang memerlukan buffer stensil, pertimbangkan untuk menggunakan RectMask2D sebagai gantinya, yang tidak memerlukan buffer stensil dan dengan demikian dapat digunakan bersama dengan format kedalaman 16-bit.
Catatan
Untuk menentukan dengan cepat objek mana dalam adegan yang tidak menulis ke buffer kedalaman secara visual, seseorang dapat menggunakan utilitas Buffer Kedalaman Render di bawah Pengaturan Editor di profil Konfigurasi MRTK.
Optimalkan Data Jala
Pengaturan Optimalkan Data Mesh mencoba menghapus atribut vertex yang tidak digunakan dalam aplikasi Anda. Pengaturan melakukan ini dengan menjalankan setiap shader pass di setiap materi yang ada di setiap jala dalam build. Ini bagus untuk ukuran data game dan performa runtime tetapi dapat menghambat waktu build secara drastis.
Disarankan untuk menonaktifkan pengaturan ini selama pengembangan dan mengaktifkan kembali selama pembuatan build "Master". Pengaturan dapat ditemukan di bawah Edit>Pemutar>Pengaturan> ProyekPengaturan> LainOptimalkan Data Jala.
Rekomendasi umum
Performa dapat menjadi tantangan yang ambigu dan terus berubah bagi pengembang realitas campuran dan spektrum pengetahuan untuk merasialisasi performa sangat luas. Namun, ada beberapa rekomendasi umum untuk memahami cara mendekati performa untuk aplikasi.
Hal ini berguna untuk menyederhanakan eksekusi aplikasi ke dalam potongan-potongan yang berjalan pada CPU atau GPU dan dengan demikian mengidentifikasi apakah aplikasi dibatasi oleh salah satu komponen. Mungkin ada hambatan yang mencakup unit pemrosesan dan beberapa skenario unik yang harus diselidiki dengan hati-hati. Namun, untuk memulai, ada baiknya untuk memahami di mana aplikasi dijalankan untuk jumlah waktu terbanyak.
GPU terikat
Karena sebagian besar platform untuk aplikasi realitas campuran menggunakan penyajian stereoskopis, sangat umum untuk dibatasi GPU karena sifat penyajian layar "lebar ganda". Futhermore, platform realitas campuran seluler seperti HoloLens atau Oculus Quest akan dibatasi oleh CPU kelas seluler & daya pemrosesan GPU.
Saat berfokus pada GPU, umumnya ada dua tahap penting bahwa aplikasi harus menyelesaikan setiap bingkai.
- Jalankan shader vertex
- Jalankan shader piksel (juga dikenal sebagai shader fragmen)
Tanpa mendalami bidang kompleks grafik komputer & merender alur, setiap tahap shader adalah program yang berjalan pada GPU untuk menghasilkan yang berikut.
- Shader vertex mengubah simpul jala menjadi koordinat dalam ruang layar (yaitu kode yang dijalankan per puncak)
- Shader piksel menghitung warna untuk menggambar fragmen piksel dan jala tertentu (yaitu kode jalankan per piksel)
Sehubungan dengan penyetelan performa, biasanya lebih bermanfaat untuk fokus pada pengoptimalan operasi dalam shader piksel. Aplikasi mungkin hanya perlu menggambar kubus yang hanya akan menjadi 8 simpul. Namun, ruang layar yang diduduki kubus kemungkinan berada pada urutan jutaan piksel. Dengan demikian, mengurangi kode shader dengan mengatakan 10 operasi dapat menghemat lebih banyak pekerjaan secara signifikan jika dikurangi pada shader piksel daripada shader vertex.
Ini adalah salah satu alasan utama untuk memanfaatkan shader MRTK Standard karena shader ini umumnya menjalankan lebih sedikit instruksi per piksel & vertex daripada shader Unity Standard sambil mencapai hasil estetika yang sebanding.
Pengoptimalan CPU | Pengoptimalan GPU |
---|---|
Logika simulasi aplikasi | Operasi penyajian |
Menyederhanakan Fisika | Mengurangi perhitungan pencahayaan |
Menyederhanakan Animasi | Mengurangi jumlah poligon & # objek yang dapat digambar |
Kelola Pengumpulan Sampah | Mengurangi # objek transparan |
Referensi Cache | Hindari efek pasca-pemrosesan/layar penuh |
Menggambar instancing panggilan
Salah satu kesalahan paling umum di Unity yang mengurangi performa adalah mengkloning bahan pada waktu proses. Jika GameObjects memiliki materi dan/atau jala yang sama, mereka dapat dioptimalkan menjadi satu panggilan gambar melalui teknik seperti batching statis, batching dinamis, dan GPU Instancing. Namun, jika pengembang memodifikasi properti materi Renderer saat runtime, Unity akan membuat salinan klon bahan yang ditetapkan.
Misalnya, jika ada 100 kubus dalam adegan, pengembang mungkin ingin menetapkan warna unik untuk masing-masing saat runtime. Akses renderer.material.color di C# akan membuat Unity membuat materi baru dalam memori untuk perender/GameObject khusus ini. Masing-masing dari 100 kubus akan memiliki materinya sendiri dan dengan demikian mereka tidak dapat digabungkan menjadi satu panggilan gambar, tetapi sebaliknya akan menjadi 100 permintaan panggilan gambar dari CPU ke GPU.
Untuk mengatasi rintangan ini dan masih menetapkan warna unik per kubus, pengembang harus memanfaatkan MaterialPropertyBlock.
private PropertyBlock m_PropertyBlock ;
private Renderer myRenderer;
private void Start()
{
myRenderer = GetComponent<Renderer>();
m_PropertyBlock = new MaterialPropertyBlock();
}
private void ChangeColor()
{
// Creates a copy of the material once for this renderer
myRenderer.material.color = Color.red;
// vs.
// Retains instancing capability for renderer
m_PropertyBlock.SetColor("_Color", Color.red);
myRenderer.SetPropertyBlock(m_PropertyBlock);
}
Alat performa Unity
Unity menyediakan alat performa hebat yang dibangun ke dalam editor.
Jika memperkirakan tradeoff performa kasar antara satu shader dan shader lainnya, berguna untuk mengkompilasi setiap shader dan melihat jumlah operasi per tahap shader. Ini dapat dilakukan dengan memilih aset shader dan mengklik tombol Kompilasi dan tampilkan kode . Ini akan mengkompilasi semua varian shader dan membuka visual studio dengan hasilnya. Catatan: Hasil statistik yang dihasilkan dapat bervariasi tergantung pada fitur apa yang telah diaktifkan pada bahan yang menggunakan shader yang diberikan. Unity hanya akan mengkompilasi varian shader yang langsung digunakan dalam proyek saat ini.
Contoh statistik shader Standar Unity
Contoh statistik shader MRTK Standard
Lihat juga
Unity
- Pengoptimalan Performa Unity untuk Pemula
- Tutorial Pengoptimalan Performa Unity
- Praktik Terbaik Pengoptimalan Unity
- Mengoptimalkan performa grafis
- Panduan Praktis Pengoptimalan Seluler
Realitas Campuran Windows
- Pengaturan yang Direkomendasikan untuk Unity
- Memahami Performa untuk Mixed Reality
- Rekomendasi performa untuk Unity
- Panduan Pelacakan Peristiwa untuk Windows Unity