Tip Optimasi untuk Persatuan

Unity adalah game engine yang populer tidak hanya di kalangan developer indie tetapi juga perusahaan besar.

Ini menampilkan antarmuka yang ramah pengguna, pipeline Rendering yang kuat, sistem komponen yang mudah digunakan, dan terakhir, mendukung beragam platform.

Namun dengan antarmuka yang mudah digunakan, akan lebih mudah untuk memperumit permainan Anda (misalnya dengan menempatkan banyak objek yang tidak perlu, dll.), jadi penting untuk memiliki optimasi dalam pikiran selama seluruh proses pembangunan.

Berikut tips penting untuk 3 kategori utama (Rendering, Scripting, dan Audio) yang akan membantu Anda meningkatkan performa game Anda:

Render

Tip 1: Jaga agar Objek dengan komponen Renderer tidak berskala

Benda tak berskala adalah benda yang mempunyai skala (1, 1, 1). Dalam hal ini, Unity tidak perlu melakukan perhitungan tambahan untuk mengubah skala objek di setiap frame.

Contoh: Katakanlah Anda memiliki model rumah yang terlalu besar atau terlalu kecil untuk level Anda. Hal yang wajar untuk dilakukan adalah menskalakannya seperti ini:

Pengubahan ukuran bangunan

Seringkali tidak apa-apa untuk menskalakan objek dalam tampilan Pemandangan, tetapi jika Anda berencana untuk memiliki banyak duplikat objek tersebut, lebih baik mengubah skala di Pengaturan Impor.

Hal pertama yang perlu Anda lakukan adalah menskalakan model hingga sesuai dengan kebutuhan Anda (misal bangunan di atas diskalakan dari (1, 1, 1) hingga (0.49482, 0.49482, 0.49482)), lalu pilih model di Proyek lihat dan di Pengaturan Impor catat Faktor Skala (Biasanya 1 atau 0,1).

Tetapkan nilai baru, yang harus sama dengan faktor skala default dikalikan dengan skala baru (Dalam kasus saya, 1 x 0,49482 = 0,49482), lalu tekan Terapkan. Sekarang kembali ke model dalam tampilan pemandangan dan atur skala kembali ke (1, 1, 1).

Pengaturan faktor Skala 3D Unity

Objek sekarang diskalakan sesuai kebutuhan sambil mempertahankan skala default (1, 1, 1).

Tip ini sangat penting untuk objek animasi yang menggunakan SkinnedMeshRenderer karena komponen ini lebih mahal untuk dirender, dan memiliki skala (1, 1, 1) menyederhanakan proses rendering.

Tip 2: Gunakan lampu sesedikit mungkin

Ada 3 jenis lampu di Unity (Lampu terarah, Lampu titik, dan Lampu sorot). Dalam hal kinerja, Directional light adalah yang termurah untuk rendering, kemudian Point, dan terakhir Spotlight.

Secara umum, Anda tidak ingin memiliki lebih dari 1 cahaya terarah per pemandangan, dan untuk lampu spot dan titik, usahakan memiliki sesedikit mungkin (atau tidak sama sekali).

Dalam hal bayangan real-time, meskipun meningkatkan aspek visual permainan, ia memiliki overhead kinerja tinggi sehingga secara umum, lebih baik untuk menonaktifkannya atau memasukkannya ke dalam lightmaps dan light probe.

Tip 3: Gunakan Transparent Shader dengan hati-hati

Hanya gunakan Peneduh Transparan atau Partikel pada permukaan yang perlu transparan (misalnya Pagar, Partikel Asap, dll.)

Objek dengan transparansi memerlukan proses rendering tambahan yang dapat mengurangi performa, terutama pada platform dengan sumber daya terbatas, seperti Seluler atau Web.

skrip

Tip 1: Selalu simpan referensi komponen dalam cache

Anda harus selalu menyimpan referensi komponen dalam cache jika Anda berencana untuk mengaksesnya setiap Pembaruan.

Misalnya, periksa skrip di bawah ini:

Buruk

using UnityEngine;

public class Script1 : MonoBehaviour
{
    float someValue = 0;

    // Update is called once per frame
    void Update()
    {
        someValue = GetComponent<Script2>().someValue2;
    }
}

Di sini kita memiliki Script1 yang mengambil variabel "someValue2" dari Script2 dan menugaskannya ke variabel lokal.

Sekarang, memanggil hanya satu GetComponent setiap frame tidak akan berdampak apa pun pada kinerja, namun, Anda harus membiasakan menyimpan cache komponen yang akan sering digunakan.

Ada dua cara untuk menyimpan komponen dalam skrip dalam cache, yaitu dengan membuat variabel publik dan menetapkannya dalam tampilan Inspektur, atau membuat variabel pribadi dan menetapkannya dari Mulai atau Sedar. Periksa contoh di bawah ini:

Bagus

using UnityEngine;

public class Script1 : MonoBehaviour
{

    float someValue = 0;

    Script2 script2Cached;

    // Use this for initialization
    void Start()
    {
        script2Cached = GetComponent<Script2>();
    }

    // Update is called once per frame
    void Update()
    {
        someValue = script2Cached.someValue2;
    }
}

Jauh lebih baik, Script2 sekarang dapat diakses setiap Pembaruan tanpa overhead kinerja.

Lakukan hal yang sama untuk komponen bawaan, seperti BoxCollider, Rigidbody, dll. (kecuali Transform dan GameObject, komponen tersebut sudah di-cache secara default sehingga Anda dapat langsung mengaksesnya).

Tip 2: Gunakan SendMessage dengan hati-hati

SendMessage memungkinkan Anda memanggil fungsi tertentu (jika ada) pada setiap MonoBehaviour yang melekat ke objek game.

Misalnya saja ketika kalian menembakkan senjata di dalam game, kalian dapat dengan cepat memberikan damage ketika peluru mengenai musuh, tanpa perlu menggunakan GetComponent dan hal tambahan lainnya.

Namun, metode ini tidak boleh dipanggil terlalu sering karena memerlukan komputasi yang intensif.

Tip 3: Gunakan GameObject.Find dan GameObject.FindWithTag dengan hati-hati

GameObject.Find, GameObject.FindWithTag dan GameObject.FindGameObjectsWithTag memungkinkan Anda mencari objek di Scene dengan cepat. Metode ini jauh lebih lambat dibandingkan GetComponent dan hanya boleh digunakan selama inisialisasi.

Tip 4: Hindari menggunakan OnGUI

Secara historis OnGUI adalah satu-satunya cara untuk membuat menus di Unity. Namun sejak itu, alternatif ditambahkan yang disebut UI Canvas yang jauh lebih baik dalam hal kinerja dan menawarkan lebih banyak fungsionalitas.

Namun demikian, OnGUI masih tetap merupakan cara yang layak untuk membuat UI di Unity dan jika Anda benar-benar perlu menggunakannya, perlu diingat bahwa OnGUI dipanggil setidaknya dua kali per frame (dua kali lebih banyak dari Update dan LateUpdate) jadi jangan gunakan untuk perhitungan apa pun selain UI.

Satu hal yang dapat Anda lakukan adalah memiliki skrip terpisah yang hanya berisi OnGUI dan mengaktifkan/menonaktifkannya bila diperlukan.

Misalnya:

UIScript.cs

using UnityEngine;

public class UIScript : MonoBehaviour {

    void OnGUI()
    {
        if(GUI.Button(new Rect(5, 5, 125, 25), "Button 1"))
        {
            //Button 1 was pressed, Do Something
        }
        if (GUI.Button(new Rect(140, 5, 125, 25), "Button 2"))
        {
            //Button 2 was pressed, Do Something
        }
    }
}

Skrip1.cs

using UnityEngine;

public class Script1 : MonoBehaviour
{

    UIScript uiScript;

    // Use this for initialization
    void Start()
    {
        uiScript = GetComponent<UIScript>();
        uiScript.enabled = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Tab))
        {
            //toggle UIScript when Tab is pressed
            uiScript.enabled = !uiScript.enabled;
        }
    }
}

Baik UIScript dan Script1 dilampirkan ke GameObject yang sama. Script1 mengontrol kapan menampilkan menu.

Saat pemain menekan Tab, UIScript diaktifkan, menampilkan tombol. Menekan Tab lagi akan menonaktifkannya, menyembunyikan tombol.

Saat UIScript dinonaktifkan, metode OnGUI tidak dipanggil sehingga meningkatkan kinerja.

Tip 5: Gunakan Profiler

Profiler adalah salah satu alat terpenting dalam mengidentifikasi kemacetan dan penurunan fps, sehingga memudahkan untuk menemukan penyebab pasti dari rendahnya kinerja.

Audio

Klip Audio dapat dioptimalkan dengan memastikan Pengaturan Impornya benar.

Pengaturan Impor Audio yang optimal akan bergantung pada panjang audio, frekuensi pemutaran, dan platform target.

Artikel yang Disarankan
Generator Billboard untuk Persatuan
Pengaturan Impor Klip Audio Unity untuk Performa Terbaik
Cara Memanfaatkan Pembaruan di Unity
Unity Optimalkan Game Anda Menggunakan Profiler
Meningkatkan Performa Game Mobile di Unity
Kiat Twitter untuk Persatuan
Membandingkan Lingkungan Pengembangan 2D dan 3D di Unity