Sfaturi de optimizare pentru Unity

Unity este un motor de joc care este popular nu numai printre dezvoltatorii indie, ci și printre marile companii.

Dispune de o interfață ușor de utilizat, o conductă de randare puternică, un sistem de componente ușor de utilizat și, în sfârșit, acceptă o gamă largă de platforme.

Dar, cu o interfață ușor de utilizat, este și mai ușor să-ți complici prea mult jocul (de exemplu, plasând o mulțime de obiecte inutile etc.), așa că este important să ai optimization în minte pe parcursul întregului curs de dezvoltare.

Iată sfaturi importante pentru cele 3 categorii majore (Rendering, Scripting, and Audio) care vă vor ajuta să vă îmbunătățiți performanța jocului:

Redare

Sfat 1: Păstrați obiectele cu componenta Renderer nescalată

Obiectele nescale sunt cele care au o scară de (1, 1, 1). În acest caz, Unity nu trebuie să facă calcule suplimentare pentru a redimensiona obiectul din fiecare cadru.

Exemplu: Să presupunem că ai un model de casă prea mare sau prea mică pentru nivelul tău. Lucrul natural de făcut este să-l scalați astfel:

Redimensionarea clădirii

De cele mai multe ori este ok să scalați obiectul în vizualizarea Scenă, dar dacă intenționați să aveți o mulțime de instanțe duplicate ale acelui obiect, este de preferat să schimbați scara în Setările de import.

Primul lucru pe care trebuie să-l faceți este să scalați modelul până când acesta se potrivește nevoilor dvs. (de exemplu, clădirea de mai sus a fost scalată de la (1, 1, 1) la (0.49482, 0.49482, 0.49482)), apoi selectați modelul în Proiect vizualizați și în setările de import notați factorul de scară (de obicei este fie 1, fie 0,1).

Setați noua valoare, care ar trebui să fie egală cu factorul de scară implicit înmulțit cu noua scară (În cazul meu, este 1 x 0,49482 = 0,49482), apoi apăsați Aplicare. Acum reveniți la modelul din vizualizarea scenei și setați scala înapoi la (1, 1, 1).

Setări pentru factorul de scară Unity 3D

Obiectul este acum scalat așa cum aveți nevoie, păstrând scala implicită (1, 1, 1).

Acest sfat este deosebit de important pentru obiectele animate care folosesc SkinnedMeshRenderer, deoarece această componentă este mai costisitoare de randat și având o scară de (1, 1, 1) simplifică procesul de randare.

Sfat 2: Folosiți cât mai puține lumini

Există 3 tipuri de lumini în Unity (lumină direcțională, lumină punctuală și reflector). Din punct de vedere al performanței, lumina direcțională este cea mai ieftină pentru randare, apoi Point și, în sfârșit, Spotlight.

În general, nu doriți să aveți mai mult de 1 lumină direcțională pe scenă, iar pentru spot și lumini punctiforme încercați să aveți cât mai puține posibil (sau deloc).

În ceea ce privește umbrele în timp real, în timp ce îmbunătățește aspectul vizual al jocului, are o suprafață de înaltă performanță, așa că, în general, este mai bine să le dezactivați sau să le coaceți în lightmaps și light sonde.

Sfat 3: Folosiți umbritoare transparente cu prudență

Folosiți doar Transparent sau Particle Shaders pe suprafețe care trebuie să fie transparente (de exemplu, garduri, particule de fum etc.)

Obiectele cu transparență necesită o trecere suplimentară de randare care ar putea reduce performanța, în special pe platforme cu resurse limitate, cum ar fi Mobile sau Web.

Scripting

Sfat 1: păstrați întotdeauna în cache referințele componentelor

Ar trebui să memorați întotdeauna în cache referințele componentelor dacă intenționați să le accesați la fiecare actualizare.

De exemplu, verificați scriptul de mai jos:

Rău

using UnityEngine;

public class Script1 : MonoBehaviour
{
    float someValue = 0;

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

Aici avem Script1 care primește variabila "someValue2" de la Script2 și o atribuie unei variabile locale.

Acum, apelarea unui singur GetComponent pentru fiecare cadru nu va avea niciun impact asupra performanței, cu toate acestea, ar trebui să adoptați un obicei de a stoca în cache componentele care vor fi utilizate frecvent.

Există două moduri de a stoca în cache o componentă într-un script, fie de a crea o variabilă publică și de a o atribui în vizualizarea Inspector, fie de a crea o variabilă privată și de a o atribui din Start sau Awake. Verificați exemplul de mai jos:

Bun

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;
    }
}

Mult mai bine, Script2 poate fi acum accesat la fiecare actualizare fără suprasolicitare de performanță.

Faceți același lucru pentru componentele încorporate, cum ar fi BoxCollider, Rigidbody etc. (cu excepția Transform și GameObject, acestea sunt deja memorate în cache în mod implicit, astfel încât să le puteți accesa imediat).

Sfat 2: Folosiți SendMessage cu prudență

SendMessage vă permite să apelați o funcție specifică (dacă există) pentru fiecare MonoBehaviour care este atașat unui obiect de joc.

De exemplu, când trageți cu o armă în joc, puteți provoca rapid daune atunci când glonțul lovește inamicul, fără a fi nevoie să utilizați GetComponent și alte lucruri suplimentare.

Cu toate acestea, această metodă nu ar trebui apelată prea des, deoarece este destul de intensivă în calcul.

Sfat 3: Folosiți GameObject.Find și GameObject.FindWithTag cu precauție

GameObject.Find, GameObject.FindWithTag și GameObject.FindGameObjectsWithTag vă permit să căutați rapid obiectele din Scenă. Aceste metode sunt mult mai lente decât GetComponent și ar trebui utilizate numai în timpul inițializării.

Sfat 4: Evitați utilizarea OnGUI

Din punct de vedere istoric, OnGUI a fost singura modalitate de a crea meniuri în Unity. Dar de atunci a fost adăugată o alternativă numită UI Canvas care este mult mai bună din punct de vedere al performanței și oferă mult mai multă funcționalitate.

Cu toate acestea, OnGUI rămâne încă o modalitate viabilă de a face UI în Unity și, dacă trebuie neapărat să o utilizați, rețineți că OnGUI este apelat de cel puțin două ori pe cadru (de două ori mai mult decât Update și LateUpdate), așa că nu utilizați-l pentru orice calcule în afară de UI.

Un lucru pe care îl puteți face este să aveți un script separat care să aibă numai OnGUI în el și să îl activați/dezactivați atunci când este necesar.

De exemplu:

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
        }
    }
}

Script1.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;
        }
    }
}

Atât UIScript, cât și Script1 sunt atașate la același GameObject. Script1 controlează când să afișeze meniul.

Când jucătorul apasă Tab, UIScript este activat, afișând butoanele. Apăsând din nou pe Tab îl dezactivează, ascunzând butoanele.

În timp ce UIScript este dezactivat, metoda OnGUI nu este apelată, ceea ce la rândul său îmbunătățește performanța.

Sfat 5: Folosiți Profiler

Profiler este unul dintre cele mai importante instrumente atunci când vine vorba de identificarea blocajelor și scăderilor fps, facilitând găsirea cauzei exacte a performanței scăzute.

Audio

Clipurile audio pot fi optimizate asigurându-vă că setările lor de import sunt corecte.

Setări optime de import audio vor depinde de lungimea audio, frecvența de redare și platforma țintă.

Articole sugerate
Cum să utilizați Actualizarea în Unity
Generatorul de panouri publicitare pentru Unity
Setări de import pentru clip audio Unity pentru cea mai bună performanță
Unity Optimizați-vă jocul folosind Profiler
Îmbunătățirea performanței unui joc mobil în Unity
Sfaturi Twitter pentru Unity
Cum să devii un programator mai bun în Unity