Folder Sumber Daya
Optimasi khusus

Optimasi Umum

Ada banyak cara yang berbeda untuk mengoptimalkan kode karena ada alasan untuk masalah kinerja. Secara umum, sangat dianjurkan bahwa pengembang profil erat aplikasi mereka sebelum mencoba menerapkan optimasi CPU. Namun, ada beberapa optimasi CPU sederhana yang berlaku secara universal.

Alamat Properti oleh ID

Unity tidak menggunakan nama string untuk mengatasi sifat Animator, Bahan dan ShaderProgram yang berjalan di GPU. More info
Lihat di Glossary
secara internal. Untuk kecepatan, semua nama properti yang telah dimiliki ke dalam ID properti, dan itu adalah ID-ID ini yang sebenarnya digunakan untuk mengatasi properti.

Oleh karena itu, setiap kali menggunakan metode Set atau Get pada Animator, Bahan atau Shader, gunakan metode yang bernilai integer bukan metode yang bernilai string. Metode string hanya melakukan hashing string dan kemudian meneruskan ID hashed ke metode integer-valued.

ID properti yang dibuat dari hashe string adalah deterministik selama satu lari. Cara paling sederhana untuk menggunakannya adalah untuk menyatakan variabel read-only integer statis untuk setiap nama properti, dan menggunakan variabel integer di tempat string. Ini secara otomatis diinisialisasi selama startup tanpa kode awalisasi lebih diperlukan.

API yang tepat adalah Animator.StringToHash untuk nama properti Animator, dan Shader.PropertyToID untuk nama properti Material & Shader.

Gunakan API fisika non-allocating

Dalam Unity 5.3 dan seterusnya, versi non-allocating dari semua API query Fisika telah diperkenalkan. Ganti panggilan RaycastAll dengan RaycastNonAlloc, panggilan SphereCastAll dengan SphereCastNonAlloc, dan sebagainya. Untuk aplikasi 2D, ada juga versi non-allocating dari semua API query Fisika2D.

Perbandingan Null terhadap UnityEngine. Sitemap

The Mono dan IL2CPPBack-end scripting bersatu yang dapat Anda gunakan sebagai alternatif untuk Mono ketika proyek bangunan untuk beberapa platform. More info
Lihat di Glossary
runtimes memperlakukan contoh kelas yang berasal dari Login Sitemap dengan cara tertentu. Metode panggilan pada kasus sebenarnya panggilan ke kode mesin, yang harus melakukan lookup dan validasi untuk mengubah referensi skrip ke referensi asli. Sementara kecil, biaya membandingkan variabel jenis ini untuk null jauh lebih mahal daripada perbandingan terhadap kelas C# murni. Untuk alasan ini, hindari perbandingan null ini dalam loop ketat atau dalam kode yang berjalan setiap bingkai.

Vektor dan matematika quaternion dan urutan operasi

Untuk matematika vektor dan quaternionCara standar Unity mewakili rotasi sebagai data. Ketika menulis kode yang berhubungan dengan rotasi, Anda biasanya harus menggunakan kelas Quaternion dan metodenya. More info
Lihat di Glossary
yang terletak di loop ketat, ingat bahwa matematika integer lebih cepat daripada matematika titik mengambang, dan matematika titik mengambang lebih cepat daripada vektor, matriks atau matematika quaternion.

Oleh karena itu, setiap kali aritmatika komputatif atau associatif memungkinkan, mencoba untuk meminimalkan biaya operasi matematika individu:


Vector3 x;

int a, b;

// Less efficient: results in two vector multiplications

Vector3 slow = a * x * b;

// More efficient: one integer mult, one vector mult

Vector3 fast = a * b * x;

Warna Built-In

Hal ini umum untuk aplikasi yang harus mengkonversi antara string warna HTML-format (#RRGGBBAA) dan struktur Unity asli Color dan Color32 untuk menggunakan skrip dari Komunitas Unify. Script ini keduanya lambat dan menyebabkan alokasi memori yang luas karena manipulasi string.

Sebagai Unity 5, ada API ColorUtility built-in yang melakukan konversi ini secara efisien. Penggunaan API bawaan harus disukai.

Cari dan CariObjectOfType

Ini adalah praktik terbaik umum untuk menghilangkan semua penggunaan GameObject.Find dan Object.FindObjectOfType dalam kode produksi. Sebagai API ini membutuhkan Unity untuk iterate atas semua GameObjectsObjek mendasar dalam adegan Unity, yang dapat mewakili karakter, props, pemandangan, kamera, waypoints, dan banyak lagi. Fungsi GameObject didefinisikan oleh Komponen yang melekat padanya. More info
Lihat di Glossary
dan Komponen dalam memori, mereka dengan cepat menjadi non-performant sebagai lingkup proyek tumbuh.

Pengecualian terhadap aturan di atas dapat dilakukan dalam aksesor untuk benda-benda tunggal. Objek manajer global sering mengekspos properti "instance", dan sering memiliki panggilan FindObjectOfType dalam getter untuk mendeteksi instance yang sudah ada sebelumnya dari singleton:


class SomeSingleton {

    private SomeSingleton _instance;

    public SomeSingleton Instance {

        get {

            if(_instance == null) { 

                _instance =

                    FindObjectOfType<SomeSingleton>(); 

            }

            if(_instance == null) { 

                _instance = CreateSomeSingleton();

            }

            return _instance;

        }

    }

}

Sementara pola ini umumnya diterima, penting untuk memeriksa kode dan memastikan bahwa aksesor disebut dalam ScenesAdegan berisi lingkungan dan menu permainan Anda. Pikirkan setiap file Adegan unik sebagai tingkat yang unik. Di setiap Adegan, Anda menempatkan lingkungan, hambatan, dan dekorasi, pada dasarnya merancang dan membangun permainan Anda dalam potongan-potongan. More info
Lihat di Glossary
di mana objek singleton tidak ada. Jika getter tidak secara otomatis membuat instance dari satuton yang hilang, sangat umum untuk menemukan bahwa kode mencari hasil tunggal dalam panggilan berulang ke FindObjectOfType (meskipun beberapa kali per bingkai) dan menciptakan saluran yang tidak diinginkan pada kinerja.

Kode debug & atribut [kondisi]

API logging UnityEngine.Debug tidak dilucuti dari build non-development, dan menulis ke file log jika disebut. Sebagai kebanyakan pengembang tidak berniat untuk menulis informasi debug dalam build non-development, disarankan untuk membungkus panggilan penebangan pembangunan-hanya dalam metode kustom, seperti itu:


    public static class Logger {

        [Conditional("ENABLE_LOGS")]

        public static void Debug(string logMsg) {

            UnityEngine.Debug.Log(logMsg);

        }

    }

Dengan mendekorasi metode ini dengan atribut [Kondisi], mendefinisikan atau mendefinisikan digunakan oleh atribut Kondisi menentukan apakah metode yang didekorasi disertakan dalam sumber yang disusun.

Jika tidak ada yang ditentukan, maka metode yang didekorasi and semua panggilan ke metode yang didekorasi disusun. Efeknya identik dengan apa yang akan terjadi jika metode dan semua panggilan ke metode dibungkus dalam blok preprocessor #if … #endif.

Untuk informasi lebih lanjut tentang atribut Conditional, lihat situs MSDN: msdn.microsoft.com.

Folder Sumber Daya
Optimasi khusus