Rekomendasi performa untuk Unity

Artikel ini dibangun berdasarkan rekomendasi performa untuk realitas campuran, tetapi berfokus pada peningkatan khusus Unity.

Kami baru-baru ini merilis aplikasi bernama Dasar-Dasar Kualitas yang mencakup masalah performa, desain, dan lingkungan umum serta solusi untuk aplikasi HoloLens 2. Aplikasi ini adalah demo visual yang bagus untuk konten berikut.

Langkah pertama yang paling penting saat mengoptimalkan performa aplikasi realitas campuran di Unity adalah memastikan Anda menggunakan pengaturan lingkungan yang direkomendasikan untuk Unity. Artikel tersebut berisi konten dengan beberapa konfigurasi adegan terpenting untuk membangun aplikasi Mixed Reality berkinerja. Beberapa pengaturan yang direkomendasikan ini juga disorot di bawah ini.

Cara membuat profil dengan Unity

Unity menyediakan bawaan Unity Profiler , yang merupakan sumber daya yang bagus untuk mengumpulkan wawasan performa yang berharga untuk aplikasi khusus Anda. Meskipun Anda dapat menjalankan profiler dalam editor, metrik ini tidak mewakili lingkungan runtime yang sebenarnya sehingga hasilnya harus digunakan dengan hati-hati. Kami menyarankan agar Anda membuat profil aplikasi dari jarak jauh saat menjalankan di perangkat untuk wawasan yang paling akurat dan dapat ditindakkan.

Unity menyediakan dokumentasi yang bagus untuk:

  1. Cara menghubungkan profiler Unity ke aplikasi UWP dari jarak jauh
  2. Cara mendiagnosis masalah performa dengan Unity Profiler secara efektif

Pembuatan profil GPU

Profiler Unity

Dengan Unity Profiler terhubung dan setelah menambahkan profiler GPU (lihat Tambahkan Profiler di sudut kanan atas), seseorang dapat melihat berapa banyak waktu yang dihabiskan untuk CPU & GPU masing-masing di tengah profiler. Ini memungkinkan pengembang untuk mendapatkan perkiraan cepat jika aplikasi mereka terikat CPU atau GPU.

Unity CPU vs GPU

Catatan

Untuk menggunakan pembuatan profil GPU, Anda perlu menonaktifkan Pekerjaan Grafis di Pengaturan Pemutar Unity. Lihat modul Profiler Penggunaan GPU Unity untuk detail selengkapnya.

Debugger bingkai kesatuan

Unity's Frame Debugger juga merupakan alat yang kuat dan berwawasan untuk digunakan. Ini akan memberi Anda gambaran umum yang baik tentang apa yang dilakukan GPU setiap bingkai. Hal-hal yang perlu diwaspadai adalah target penyajian tambahan dan perintah blit untuk disalin di antara mereka karena ini sangat mahal di HoloLens. Idealnya, tidak ada target render di luar layar yang harus digunakan pada HoloLens. Ini biasanya ditambahkan saat mengaktifkan fitur rendering yang mahal (misalnya MSAA, HDR atau efek layar penuh seperti mekar) yang harus dihindari.

Overlay kecepatan bingkai HoloLens

Halaman Performa Sistem Portal Perangkat memiliki ringkasan performa CPU dan GPU perangkat yang baik. Anda dapat mengaktifkan Penghitung laju bingkai tampilan di headset dan Grafik laju bingkai tampilan di headset. Opsi ini akan mengaktifkan penghitung dan grafik FPS, masing-masing, yang akan memberi Anda umpan balik langsung dalam aplikasi yang berjalan di perangkat Anda.

PIX

PIX juga dapat digunakan untuk memprofilkan aplikasi Unity. Ada juga instruksi terperinci tentang cara menggunakan dan menginstal PIX untuk HoloLens 2. Dalam build pengembangan, cakupan yang sama dengan yang Anda lihat di Unity's Frame Debugger juga akan ditampilkan di PIX dan dapat diperiksa dan difilterkan secara lebih rinci.

Catatan

Unity menyediakan kemampuan untuk dengan mudah memodifikasi resolusi target render aplikasi Anda saat runtime melalui properti XRSettings.renderViewportScale . Gambar akhir yang disajikan di perangkat memiliki resolusi tetap. Platform akan mengambil sampel output resolusi yang lebih rendah untuk membangun gambar resolusi yang lebih tinggi untuk penyajian pada tampilan.

UnityEngine.XR.XRSettings.renderViewportScale = 0.7f;

Rekomendasi performa CPU

Konten di bawah ini mencakup praktik performa yang lebih mendalam, terutama ditargetkan untuk pengembangan Unity & C#.

Referensi cache

Kami merekomendasikan referensi penembolokan ke semua komponen dan GameObjects yang relevan saat inisialisasi karena panggilan fungsi berulang seperti GetComponent<T>() dan Camera.main lebih mahal relatif terhadap biaya memori untuk menyimpan pointer. . Camera.main hanya menggunakan FindGameObjectsWithTag() di bawahnya, yang secara mahal mencari grafik adegan Anda untuk objek kamera dengan tag "MainCamera ".

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    private Camera cam;
    private CustomComponent comp;

    void Start() 
    {
        cam = Camera.main;
        comp = GetComponent<CustomComponent>();
    }

    void Update()
    {
        // Good
        this.transform.position = cam.transform.position + cam.transform.forward * 10.0f;

        // Bad
        this.transform.position = Camera.main.transform.position + Camera.main.transform.forward * 10.0f;

        // Good
        comp.DoSomethingAwesome();

        // Bad
        GetComponent<CustomComponent>().DoSomethingAwesome();
    }
}

Catatan

Hindari GetComponent(string)
Saat menggunakan GetComponent(), ada beberapa kelebihan beban yang berbeda. Penting untuk selalu menggunakan implementasi berbasis Jenis dan tidak pernah kelebihan pencarian berbasis string. Mencari berdasarkan string di adegan Anda secara signifikan lebih mahal daripada mencari berdasarkan Jenis.
(Baik) Component GetComponent(Type type)
(Baik) T GetComponent<T>()
(Buruk) Component GetComponent(string)>

Hindari operasi yang mahal

  1. Hindari penggunaan LINQ

    Meskipun LINQ dapat bersih dan mudah dibaca dan ditulis, umumnya membutuhkan lebih banyak komputasi dan memori daripada jika Anda menulis algoritma secara manual.

    // Example Code
    using System.Linq;
    
    List<int> data = new List<int>();
    data.Any(x => x > 10);
    
    var result = from x in data
                 where x > 10
                 select x;
    
  2. API Unity Umum

    API Unity tertentu, meskipun berguna, bisa mahal untuk dieksekusi. Sebagian besar dari ini melibatkan pencarian seluruh grafik adegan Anda untuk beberapa daftar GameObjects yang cocok. Operasi ini umumnya dapat dihindari dengan penembolokan referensi atau menerapkan komponen manajer untuk GameObjects untuk melacak referensi saat runtime.

        GameObject.SendMessage()
        GameObject.BroadcastMessage()
        UnityEngine.Object.Find()
        UnityEngine.Object.FindWithTag()
        UnityEngine.Object.FindObjectOfType()
        UnityEngine.Object.FindObjectsOfType()
        UnityEngine.Object.FindGameObjectsWithTag()
        UnityEngine.Object.FindGameObjectsWithTag()
    

Catatan

SendMessage() dan BroadcastMessage() harus dihilangkan dengan semua biaya. Fungsi-fungsi ini dapat berada pada urutan 1000x lebih lambat daripada panggilan fungsi langsung.

  1. Waspadalah terhadap tinju

    Tinju adalah konsep inti dari bahasa dan runtime C#. Ini adalah proses pembungkusan variabel berjenis nilai seperti char, , int, booldll. ke dalam variabel yang dititik referensi. Ketika variabel berjenis nilai "dikotak", variabel tersebut dibungkus dalam System.Object, yang disimpan pada tumpukan terkelola. Memori dialokasikan dan akhirnya ketika dibuang harus diproses oleh pengumpul sampah. Alokasi dan dealokasi ini dikenakan biaya performa dan dalam banyak skenario tidak perlu atau dapat dengan mudah digantikan oleh alternatif yang lebih murah.

    Untuk menghindari tinju, pastikan bahwa variabel, bidang, dan properti tempat Anda menyimpan jenis dan struktur numerik (termasuk Nullable<T>) sangat di ketik sebagai jenis tertentu seperti int, float? atau MyStruct, alih-alih menggunakan objek. Jika memasukkan objek ini ke dalam daftar, pastikan untuk menggunakan daftar yang sangat di ketik seperti List<int> bukan List<object> atau ArrayList.

    Contoh tinju di C#

    // boolean value type is boxed into object boxedMyVar on the heap
    bool myVar = true;
    object boxedMyVar = myVar;
    

Jalur kode berulang

Setiap fungsi panggilan balik Unity berulang (yaitu Pembaruan) yang dijalankan berkali-kali per detik dan/atau bingkai harus ditulis dengan hati-hati. Setiap operasi mahal di sini akan berdampak besar dan konsisten pada performa.

  1. Fungsi panggilan balik kosong

    Meskipun kode di bawah ini mungkin tampak tidak bersalah untuk keluar dalam aplikasi Anda, terutama karena setiap skrip Unity menginisialisasi secara otomatis dengan metode Pembaruan, panggilan balik kosong ini bisa menjadi mahal. Unity beroperasi bolak-balik antara batas kode yang tidak dikelola dan terkelola, antara kode UnityEngine dan kode aplikasi Anda. Peralihan konteks atas jembatan ini cukup mahal, bahkan jika tidak ada yang harus dijalankan. Ini menjadi sangat bermasalah jika aplikasi Anda memiliki 100-an GameObjects dengan komponen yang memiliki panggilan balik Unity berulang kosong.

    void Update()
    {
    }
    

Catatan

Update() adalah manifestasi paling umum dari masalah performa ini tetapi panggilan balik Unity berulang lainnya, seperti berikut ini bisa sama buruknya, jika tidak lebih buruk: FixedUpdate(), LateUpdate(), OnPostRender", OnPreRender(), OnRenderImage(), dll.

  1. Operasi untuk mendukung berjalan sekali per bingkai

    Unity API berikut adalah operasi umum untuk banyak Aplikasi Holografik. Meskipun tidak selalu memungkinkan, hasil dari fungsi-fungsi ini biasanya dapat dihitung sekali dan hasilnya digunakan kembali di seluruh aplikasi untuk bingkai tertentu.

    a) Adalah praktik yang baik untuk memiliki kelas atau layanan Singleton khusus untuk menangani tatapan Anda Raycast ke dalam adegan dan kemudian menggunakan kembali hasil ini di semua komponen adegan lainnya, alih-alih membuat operasi Raycast berulang dan identik oleh setiap komponen. Beberapa aplikasi mungkin memerlukan raycast dari asal yang berbeda atau terhadap LayerMasks yang berbeda.

        UnityEngine.Physics.Raycast()
        UnityEngine.Physics.RaycastAll()
    

    b) Hindari operasi GetComponent() dalam panggilan balik Unity berulang seperti Update() dengan membuat cache referensi di Start() atau Awake()

        UnityEngine.Object.GetComponent()
    

    c) Adalah praktik yang baik untuk membuat instans semua objek, jika memungkinkan, pada inisialisasi dan menggunakan pengumpulan objek untuk mendaur ulang dan menggunakan kembali GameObjects sepanjang runtime aplikasi Anda

        UnityEngine.Object.Instantiate()
    
  2. Hindari antarmuka dan konstruksi virtual

    Memanggil panggilan fungsi melalui antarmuka vs objek langsung atau memanggil fungsi virtual seringkali bisa jauh lebih mahal daripada menggunakan konstruksi langsung atau panggilan fungsi langsung. Jika fungsi atau antarmuka virtual tidak perlu, maka itu harus dihapus. Namun, hit performa untuk pendekatan ini sepadan dengan trade-off jika menggunakannya menyederhanakan kolaborasi pengembangan, keterbacaan kode, dan pemeliharaan kode.

    Umumnya, rekomendasinya adalah untuk tidak menandai bidang dan fungsi sebagai virtual kecuali ada harapan yang jelas bahwa anggota ini perlu ditimpa. Seseorang harus sangat berhati-hati di sekitar jalur kode frekuensi tinggi yang disebut berkali-kali per bingkai atau bahkan sekali per bingkai seperti UpdateUI() metode.

  3. Hindari melewati struktur menurut nilai

    Tidak seperti kelas, struktur adalah jenis nilai dan ketika diteruskan langsung ke fungsi, kontennya disalin ke dalam instans yang baru dibuat. Salinan ini menambahkan biaya CPU, serta memori tambahan pada tumpukan. Untuk struktur kecil, efeknya minimal dan dengan demikian dapat diterima. Namun, untuk fungsi berulang kali memanggil setiap bingkai serta fungsi yang mengambil struct besar, jika memungkinkan memodifikasi definisi fungsi untuk diteruskan oleh referensi. Pelajari selengkapnya di sini

Lain-lain

  1. Fisika

    a) Umumnya, cara termampu untuk meningkatkan fisika adalah dengan membatasi jumlah waktu yang dihabiskan untuk Fisika atau jumlah iterasi per detik. Ini akan mengurangi akurasi simulasi. Lihat TimeManager di Unity

    b) Jenis tabrakan di Unity memiliki karakteristik performa yang sangat berbeda. Urutan di bawah ini mencantumkan collider berkinerja paling rendah ke collider berkinerja paling sedikit dari kiri ke kanan. Penting untuk menghindari Mesh Colliders, yang secara substansial lebih mahal daripada tabrakan primitif.

    Sphere < Capsule < Box <<< Mesh (Convex) < Mesh (non-Convex)

    Lihat Praktik Terbaik Fisika Unity untuk informasi selengkapnya

  2. Animasi

    Nonaktifkan animasi diam dengan menonaktifkan komponen Animator (menonaktifkan objek permainan tidak akan memiliki efek yang sama). Hindari pola desain di mana animator berada dalam perulangan menetapkan nilai ke hal yang sama. Ada overhead yang cukup besar untuk teknik ini, tanpa efek pada aplikasi. Pelajari lebih lanjut di sini.

  3. Algoritma kompleks

    Jika aplikasi Anda menggunakan algoritma kompleks seperti kinematik terbalik, temuan jalur, dll, cari pendekatan yang lebih sederhana atau sesuaikan pengaturan yang relevan untuk performanya

Rekomendasi performa CPU-ke-GPU

Umumnya, performa CPU-ke-GPU turun ke panggilan gambar yang dikirimkan ke kartu grafis. Untuk meningkatkan performa, panggilan gambar perlu dikurangi secara strategis a) atau b) direstrukturisasi untuk hasil yang optimal. Karena panggilan gambar itu sendiri intensif sumber daya, menguranginya akan mengurangi pekerjaan keseluruhan yang diperlukan. Selanjutnya, perubahan status antara panggilan gambar memerlukan langkah validasi dan terjemahan yang mahal di driver grafis dan dengan demikian, restrukturisasi panggilan gambar aplikasi Anda untuk membatasi perubahan status (yaitu materi yang berbeda, dll) dapat meningkatkan performa.

Unity memiliki artikel hebat yang memberikan gambaran umum dan menyelami panggilan gambar batching untuk platform mereka.

Penyajian instans pass tunggal

Single Pass Instanced Rendering di Unity memungkinkan panggilan gambar untuk setiap mata dikurangi menjadi satu panggilan gambar instans. Karena koherensi cache antara dua panggilan gambar, ada juga beberapa peningkatan performa pada GPU juga.

Untuk mengaktifkan fitur ini di Proyek Unity Anda

  1. Buka Pengaturan OpenXR (buka Edit>Pengaturan> ProyekXR Manajemen> PluginOpenXR).
  2. Pilih Instans Single Pass dari menu drop-down Mode Render .

Baca artikel berikut dari Unity untuk detailnya dengan pendekatan penyajian ini.

Catatan

Salah satu masalah umum dengan Single Pass Instanced Rendering terjadi jika pengembang sudah memiliki shader kustom yang ada yang tidak ditulis untuk instancing. Setelah mengaktifkan fitur ini, pengembang mungkin melihat beberapa GameObjects hanya dirender dalam satu mata. Ini karena shader kustom terkait tidak memiliki properti yang sesuai untuk instancing.

Lihat Single Pass Stereo Rendering untuk HoloLens dari Unity untuk cara mengatasi masalah ini

Batching statis

Unity dapat mengumpulkan banyak objek statis untuk mengurangi panggilan gambar ke GPU. Batching Statis berfungsi untuk sebagian besar objek Renderer di Unity bahwa 1) berbagi materi yang sama dan 2) semuanya ditandai sebagai Statis (Pilih objek di Unity dan pilih kotak centang di kanan atas inspektur). GameObjects yang ditandai sebagai Statis tidak dapat dipindahkan di seluruh runtime aplikasi Anda. Dengan demikian, batching statis bisa sulit dimanfaatkan pada HoloLens di mana hampir setiap objek perlu ditempatkan, dipindahkan, diskalakan, dll. Untuk headset imersif, batching statis dapat secara dramatis mengurangi panggilan gambar dan dengan demikian meningkatkan performa.

Baca Batching Statis di bawah Gambar Batching Panggilan di Unity untuk detail selengkapnya.

Batching dinamis

Karena bermasalah untuk menandai objek sebagai Statis untuk pengembangan HoloLens, batching dinamis dapat menjadi alat yang bagus untuk mengimbangi fitur yang kurang ini. Ini juga dapat berguna pada headset imersif juga. Namun, batching dinamis di Unity bisa sulit diaktifkan karena GameObjects harus a) berbagi Materi yang sama dan b) memenuhi daftar panjang kriteria lain.

Baca Batching Dinamis di bawah Gambar Batching Panggilan di Unity untuk daftar lengkapnya. Paling umum, GameObjects menjadi tidak valid untuk di-batch secara dinamis, karena data jala terkait tidak boleh lebih dari 300 simpul.

Teknik lain

Batching hanya dapat terjadi jika beberapa GameObjects dapat berbagi materi yang sama. Biasanya, ini akan diblokir oleh kebutuhan GameObjects untuk memiliki tekstur unik untuk Materi masing-masing. Adalah umum untuk menggabungkan Tekstur menjadi satu Tekstur besar, metode yang dikenal sebagai Texture Atlasing.

Selain itu, lebih baik menggabungkan jala menjadi satu GameObject jika memungkinkan dan masuk akal. Setiap Perender di Unity akan memiliki panggilan gambar terkait versus mengirimkan jala gabungan di bawah satu Perender.

Catatan

Memodifikasi properti Renderer.material pada runtime akan membuat salinan Bahan dan dengan demikian berpotensi merusak batching. Gunakan Renderer.sharedMaterial untuk memodifikasi properti materi bersama di seluruh GameObjects.

Rekomendasi performa GPU

Pelajari selengkapnya tentang mengoptimalkan penyajian grafis di Unity

Bandwidth dan tingkat pengisian

Saat merender bingkai pada GPU, aplikasi terikat oleh bandwidth memori atau tingkat pengisian.

  • Bandwidth memori adalah tingkat baca dan tulis yang dapat dilakukan GPU dari memori
  • Tingkat pengisian mengacu pada piksel yang dapat digambar per detik oleh GPU.

Mengoptimalkan berbagi buffer kedalaman

Kami menyarankan agar Anda mengaktifkan berbagi buffer Kedalaman untuk mengoptimalkan stabilitas hologram. Saat mengaktifkan reprojeksi tahap akhir berbasis kedalaman dengan pengaturan ini, kami sarankan Anda memilih format kedalaman 16-bit alih-alih format kedalaman 24-bit . Buffer kedalaman 16-bit akan secara drastis mengurangi bandwidth (dan dengan demikian daya) yang terkait dengan lalu lintas buffer kedalaman. Ini bisa menjadi peningkatan besar baik dalam pengurangan daya maupun performa. Namun, ada dua kemungkinan hasil negatif dengan menggunakan format kedalaman 16-bit.

Z-Fighting

Pengurangan ketepatan rentang kedalaman membuat z-fighting lebih mungkin terjadi dengan 16 bit dari 24-bit. Untuk menghindari artefak ini, ubah bidang klip dekat/jauh kamera Unity untuk memperkirakan presisi yang lebih rendah. Untuk aplikasi berbasis HoloLens, bidang klip jauh 50 m alih-alih default Unity 1000 m umumnya dapat menghilangkan z-fighting apa pun.

Penyangga Stensil Dinonaktifkan

Saat Unity membuat Tekstur Render dengan kedalaman 16-bit, tidak ada buffer stensil yang dibuat. Memilih format kedalaman 24-bit, seperti yang dijelaskan dalam dokumentasi Unity, akan membuat buffer z-24-bit dan buffer stensil 8-bit (jika 32-bit berlaku pada perangkat (misalnya, HoloLens), yang umumnya terjadi).

Hindari efek layar penuh

Teknik yang beroperasi pada layar penuh bisa mahal karena urutan besarnya adalah jutaan operasi setiap bingkai. Disarankan untuk menghindari efek pasca-pemrosesan seperti anti-aliasing, mekar, dan banyak lagi.

Pengaturan pencahayaan optimal

Iluminasi Global real time di Unity dapat memberikan hasil visual yang luar biasa tetapi melibatkan perhitungan pencahayaan yang mahal. Sebaiknya nonaktifkan Iluminasi Global real-time untuk setiap file adegan Unity melaluiPengaturan> PencahayaanPenyajian>Jendela> Hapus Centang Iluminasi Global Real-time.

Selain itu, disarankan untuk menonaktifkan semua transmisi bayangan karena ini juga menambahkan GPU mahal yang diteruskan ke adegan Unity. Bayangan dapat dinonaktifkan per cahaya tetapi juga dapat dikontrol secara holistik melalui pengaturan Kualitas.

Mengedit>Pengaturan Proyek, lalu pilih kategori >Kualitas Pilih Kualitas Rendah untuk Platform UWP. Seseorang juga dapat mengatur properti Bayangan ke Nonaktifkan Bayangan.

Kami menyarankan agar Anda menggunakan pencahayaan panggang dengan model Anda di Unity.

Mengurangi jumlah poli

Jumlah poligon dikurangi dengan

  1. Menghapus objek dari adegan
  2. Pengurangan aset, yang mengurangi jumlah poligon untuk jala tertentu
  3. Menerapkan Sistem Level of Detail (LOD) ke dalam aplikasi Anda, yang merender objek yang jauh dengan versi poligon bawah dari geometri yang sama

Memahami shader di Unity

Perkiraan yang mudah untuk membandingkan shader dalam performa adalah mengidentifikasi jumlah rata-rata operasi yang masing-masing dijalankan pada runtime. Ini dapat dilakukan dengan mudah di Unity.

  1. Pilih aset shader Anda atau pilih bahan, lalu di sudut kanan atas jendela inspektur, pilih ikon roda gigi diikuti dengan "Pilih Shader"

    Pilih shader di Unity

  2. Dengan aset shader dipilih, pilih tombol "Kompilasi dan tampilkan kode" di bawah jendela inspektur

    Mengkompilasi Kode Shader di Unity

  3. Setelah mengkompilasi, cari bagian statistik dalam hasil dengan jumlah operasi yang berbeda untuk vertex dan shader piksel (Catatan: shader piksel sering disebut shader fragmen)

    Operasi Shader Standar Unity

Mengoptimalkan shader piksel

Melihat hasil statistik yang dikompilasi menggunakan metode di atas, shader fragmen umumnya akan menjalankan lebih banyak operasi daripada shader vertex, rata-rata. Shader fragmen, juga dikenal sebagai shader piksel, dijalankan per piksel pada output layar sementara shader vertex hanya dijalankan per-verteks dari semua jala yang digambar ke layar.

Dengan demikian, tidak hanya shader fragmen memiliki lebih banyak instruksi daripada shader vertex karena semua perhitungan pencahayaan, shader fragmen hampir selalu dijalankan pada himpunan data yang lebih besar. Misalnya, jika output layar adalah gambar 2k by 2k, maka shader fragmen dapat dieksekusi 2.000 * 2.000 = 4.000.000 kali. Jika merender dua mata, angka ini berlipat ganda karena ada dua layar. Jika aplikasi realitas campuran memiliki beberapa pass, efek pasca-pemrosesan layar penuh, atau merender beberapa jala ke piksel yang sama, jumlah ini akan meningkat secara dramatis.

Oleh karena itu, mengurangi jumlah operasi dalam shader fragmen umumnya dapat memberikan keuntungan performa yang jauh lebih besar daripada pengoptimalan di shader vertex.

Alternatif shader Unity Standard

Alih-alih menggunakan rendering berbasis fisik (PBR) atau shader berkualitas tinggi lainnya, lihat menggunakan shader yang lebih berkinerja dan lebih murah. Mixed Reality Toolkit menyediakan shader standar MRTK yang telah dioptimalkan untuk proyek realitas campuran.

Unity juga menyediakan opsi shader yang tidak menyala, vertex menyala, difus, dan shader sederhana lainnya yang lebih cepat dibandingkan dengan shader Standar Unity. Lihat Penggunaan dan Performa Shader Bawaan untuk informasi lebih rinci.

Pramuat shader

Gunakan pramuat Shader dan trik lainnya untuk mengoptimalkan waktu muat shader. Secara khusus, pramuat shader berarti Anda tidak akan melihat hitch apa pun karena kompilasi shader runtime.

Batasi penggalian berlebihan

Di Unity, seseorang dapat menampilkan overdraw untuk adegan mereka, dengan beralih menu mode gambar di sudut kiri atas tampilan Adegan dan memilih Overdraw.

Umumnya, overdraw dapat dimitigasi dengan memusnahkan objek sebelumnya sebelum dikirim ke GPU. Unity memberikan detail tentang penerapan Occlusion Culling untuk mesin mereka.

Rekomendasi memori

Alokasi memori yang berlebihan & operasi dealokasi dapat memiliki efek buruk pada aplikasi holografik Anda, yang mengakibatkan performa yang tidak konsisten, bingkai beku, dan perilaku merugikan lainnya. Sangat penting untuk memahami pertimbangan memori saat mengembangkan di Unity karena manajemen memori dikendalikan oleh pengumpul sampah.

Pengumpulan Sampah

Aplikasi Holografik akan kehilangan waktu komputasi pemrosesan ke pengumpul sampah (GC) ketika GC diaktifkan untuk menganalisis objek yang tidak lagi berada dalam cakupan selama eksekusi dan memorinya perlu dirilis, sehingga dapat disediakan untuk digunakan kembali. Alokasi konstan dan de-alokasi umumnya akan mengharuskan pengumpul sampah untuk berjalan lebih sering, sehingga merugikan performa dan pengalaman pengguna.

Unity telah menyediakan halaman luar biasa yang menjelaskan secara rinci cara kerja pengumpul sampah dan tips untuk menulis kode yang lebih efisien sehubungan dengan manajemen memori.

Salah satu praktik paling umum yang mengarah pada pengumpulan sampah yang berlebihan bukanlah referensi penembolokan ke komponen dan kelas dalam pengembangan Unity. Referensi apa pun harus diambil selama Start() atau Awake() dan digunakan kembali dalam fungsi selanjutnya seperti Update() atau LateUpdate().

Tips cepat lainnya:

  • Gunakan kelas StringBuilder C# untuk membangun string kompleks secara dinamis saat runtime
  • Menghapus panggilan ke Debug.Log() saat tidak lagi diperlukan, karena masih dijalankan di semua versi build aplikasi
  • Jika aplikasi holografik Anda umumnya memerlukan banyak memori, pertimbangkan untuk memanggil System.GC.Collect() selama fase pemuatan seperti saat menyajikan layar pemuatan atau transisi

Pengumpulan objek

Pengumpulan objek adalah teknik populer untuk mengurangi biaya alokasi dan dealokasi objek berkelanjutan. Ini dilakukan dengan mengalokasikan kumpulan besar objek yang identik dan menggunakan kembali instans yang tidak aktif dan tersedia dari kumpulan ini alih-alih terus menelurkan dan menghancurkan objek dari waktu ke waktu. Kumpulan objek sangat bagus untuk komponen yang dapat digunakan kembali yang memiliki masa pakai variabel selama aplikasi.

Performa startup

Pertimbangkan untuk memulai aplikasi Anda dengan adegan yang lebih kecil, lalu gunakan SceneManager.LoadSceneAsync untuk memuat sisa adegan. Ini memungkinkan aplikasi Anda untuk sampai ke status interaktif secepat mungkin. Mungkin ada lonjakan CPU besar saat adegan baru sedang diaktifkan dan bahwa konten yang dirender mungkin gagap atau halangan. Salah satu cara untuk mengatasinya adalah dengan mengatur properti AsyncOperation.allowSceneActivation ke "false" pada adegan yang dimuat, tunggu hingga adegan dimuat, bersihkan layar menjadi hitam, lalu atur kembali ke "true" untuk menyelesaikan aktivasi adegan.

Ingat bahwa saat adegan startup dimuat, layar percikan holografik akan ditampilkan kepada pengguna.

Lihat juga