Optimalisatietips voor eenheid

Unity is een game-engine die niet alleen populair is bij indie-ontwikkelaars, maar ook bij grote bedrijven.

Het beschikt over een gebruiksvriendelijke interface, een krachtige Rendering-pijplijn, een eenvoudig te gebruiken componentensysteem en ten slotte ondersteunt het een breed scala aan platforms.

Maar met een eenvoudig te gebruiken interface is het nog gemakkelijker om je spel te ingewikkeld te maken (bijvoorbeeld door een heleboel onnodige objecten te plaatsen, enz.), dus het is belangrijk om optimalisatie te hebben gedurende de hele ontwikkeling in gedachten.

Hier zijn belangrijke tips voor de 3 hoofdcategorieën (Rendering, Scripting, en Audio) die u zullen helpen de prestaties van uw spel te verbeteren:

Weergave

Tip 1: Houd de objecten met de Renderer-component ongeschaald

Niet-geschaalde objecten zijn objecten met een schaal van (1, 1, 1). In dat geval hoeft Unity geen aanvullende berekeningen uit te voeren om het object in elk frame opnieuw te schalen.

Voorbeeld: Stel dat u een model van een huis heeft dat te groot of te klein is voor uw niveau. Het natuurlijke ding om te doen is om het als volgt te schalen:

Formaat van gebouw wijzigen

Meestal is het prima om het object in de scèneweergave te schalen, maar als u van plan bent veel dubbele exemplaren van dat object te hebben, verdient het de voorkeur om de schaal in de importinstellingen te wijzigen.

Het eerste dat u hoeft te doen is het model schalen totdat het aan uw behoeften voldoet (het gebouw hierboven is bijvoorbeeld geschaald van (1, 1, 1) naar (0,49482, 0,49482, 0,49482)), en selecteert vervolgens het model in het Project bekijk en noteer in de importinstellingen de schaalfactor (meestal is deze 1 of 0,1).

Stel de nieuwe waarde in, die gelijk moet zijn aan de standaardschaalfactor, vermenigvuldigd met de nieuwe schaal (in mijn geval is dit 1 x 0,49482 = 0,49482) en druk vervolgens op Toepassen. Ga nu terug naar het model in de scèneweergave en zet de schaal terug op (1, 1, 1).

Unity 3D Schaalfactorinstellingen

Het object wordt nu op de gewenste manier geschaald, terwijl de standaardschaal (1, 1, 1) behouden blijft.

Deze tip is vooral belangrijk voor geanimeerde objecten die SkinnedMeshRenderer gebruiken, omdat het renderen van deze component duurder is en een schaal van (1, 1, 1) het weergaveproces vereenvoudigt.

Tip 2: Gebruik zo min mogelijk lampen

Er zijn 3 soorten lampen in Unity (gericht licht, puntlicht en spotlight). Qua prestaties is gericht licht het goedkoopste voor weergave, daarna Point en ten slotte Spotlight.

Over het algemeen wil je niet meer dan één gericht licht per scène hebben, en voor de spot- en puntlichten probeer je er zo weinig mogelijk (of helemaal geen) te hebben.

In termen van real-time schaduwen, hoewel het het visuele aspect van het spel verbetert, heeft het een krachtige overhead, dus over het algemeen is het beter om ze uit te schakelen of ze in lightmaps en light te plaatsen sondes.

Tip 3: Wees voorzichtig met transparante shaders

Gebruik alleen transparante of deeltjesshaders op oppervlakken die transparant moeten zijn (bijv. hekken, rookdeeltjes, enz.)

Objecten met transparantie vereisen een extra weergavepas die de prestaties zou kunnen verminderen, vooral op platforms met beperkte bronnen, zoals mobiel of internet.

Scripten

Tip 1: Componentreferenties altijd in de cache opslaan

U moet componentreferenties altijd in de cache opslaan als u van plan bent deze bij elke update te openen.

Controleer bijvoorbeeld het onderstaande script:

Slecht

using UnityEngine;

public class Script1 : MonoBehaviour
{
    float someValue = 0;

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

Hier hebben we Script1 dat de variabele "someValue2" uit Script2 haalt en deze aan een lokale variabele toewijst.

Nu heeft het aanroepen van slechts één GetComponent per frame geen enkele invloed op de prestaties. U moet er echter een gewoonte van maken om de componenten die vaak worden gebruikt in de cache op te slaan.

Er zijn twee manieren om een ​​component in een script in de cache op te slaan: maak een openbare variabele en wijs deze toe in de Inspector-weergave, of maak een privévariabele en wijs deze toe vanuit Start of Awake. Bekijk het onderstaande voorbeeld:

Goed

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

Veel beter is dat Script2 nu bij elke update toegankelijk is zonder prestatieoverhead.

Doe hetzelfde voor ingebouwde componenten, zoals BoxCollider, Rigidbody, enz. (behalve Transform en GameObject, deze worden standaard al in de cache opgeslagen, zodat u er meteen toegang toe hebt).

Tip 2: Gebruik SendMessage met voorzichtigheid

Met SendMessage kunt u een specifieke functie aanroepen (indien aanwezig) voor elk MonoBehaviour dat bijgevoegd aan een spelobject is.

Als je in de game bijvoorbeeld een wapen afschiet, kun je snel schade aanrichten als de kogel de vijand raakt, zonder dat je GetComponent en andere extra dingen hoeft te gebruiken.

Deze methode moet echter niet te vaak worden aangeroepen, omdat deze behoorlijk rekenintensief is.

Tip 3: Gebruik GameObject.Find en GameObject.FindWithTag met de nodige voorzichtigheid

Met GameObject.Find, GameObject.FindWithTag en GameObject.FindGameObjectsWithTag kunt u snel naar de objecten in de scène zoeken. Deze methoden zijn veel langzamer dan GetComponent en mogen alleen tijdens initialisatie worden gebruikt.

Tip 4: Vermijd het gebruik van OnGUI

Historisch gezien was OnGUI de enige manier om menu's te maken in Unity. Maar sindsdien is er een alternatief toegevoegd genaamd UI Canvas dat veel beter is qua prestaties en veel meer functionaliteit biedt.

Desalniettemin blijft OnGUI nog steeds een haalbare manier om een ​​gebruikersinterface in Unity te maken en als je het absoluut nodig hebt, houd er dan rekening mee dat OnGUI minstens twee keer per frame wordt aangeroepen (twee keer zoveel als Update en LateUpdate), dus doe dat niet gebruik het voor alle berekeningen naast de gebruikersinterface.

Eén ding dat u kunt doen, is een apart script hebben dat alleen OnGUI bevat en dit indien nodig in-/uitschakelen.

Bijvoorbeeld:

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

Zowel UIScript als Script1 zijn aan hetzelfde GameObject gekoppeld. Script1 bepaalt wanneer het menu moet worden weergegeven.

Wanneer de speler op Tab drukt, wordt het UIScript ingeschakeld, waarbij de knoppen worden weergegeven. Als u nogmaals op Tab drukt, wordt het gedeactiveerd en worden de knoppen verborgen.

Terwijl UIScript is gedeactiveerd, wordt de OnGUI-methode niet aangeroepen, wat op zijn beurt de prestaties verbetert.

Tip 5: Gebruik Profiler

Profiler is een van de belangrijkste tools als het gaat om het identificeren van knelpunten en fps-dalingen, waardoor het gemakkelijker wordt om de exacte oorzaak van de lage prestaties te vinden.

Audio

Audioclips kunnen worden geoptimaliseerd door ervoor te zorgen dat de importinstellingen correct zijn.

Optimale Instellingen voor audio-import zijn afhankelijk van de audiolengte, afspeelfrequentie en doelplatform.

Voorgestelde artikelen
De Billboard-generator voor eenheid
Update in Unity gebruiken
De prestaties van een mobiel spel in eenheid verbeteren
Unity Audio Clip importinstellingen voor de beste prestaties
Unity Optimaliseer je spel met Profiler
Twittertips voor eenheid
Hoe je een betere programmeur kunt worden in Unity