Optimeringstip til enhed
Unity er en spilmotor, der ikke kun er populær blandt indie-udviklere, men også blandt store virksomheder.
Den har en brugervenlig grænseflade, en kraftfuld renderingspipeline, et letanvendeligt komponentsystem, og endelig understøtter det en lang række platforme.
Men med en brugervenlig grænseflade er det endnu nemmere at overkomplicere dit spil (f.eks. ved at placere en masse unødvendige objekter osv.), så det er vigtigt at have optimering i tankerne under hele udviklingsforløbet.
Her er vigtige tips til de 3 hovedkategorier (Rendering, Scripting, og Audio), som vil hjælpe dig med at forbedre dit spils ydeevne:
Gengivelse
Tip 1: Hold objekterne med Renderer-komponenten uskaleret
Uskalerede objekter er dem, der har en skala på (1, 1, 1). I så fald behøver Unity ikke at foretage yderligere beregninger for at omskalere objektet i hver ramme.
Eksempel: Lad os sige, at du har en model af et hus, der er for stor eller for lille til dit niveau. Den naturlige ting at gøre er at skalere det sådan her:
Det meste af tiden er det ok at skalere objektet i scenevisningen, men hvis du planlægger at have mange duplikerede forekomster af det objekt, er det at foretrække at ændre skalaen i importindstillingerne.
Den første ting du skal gøre er at skalere modellen, indtil den passer til dine behov (f.eks. blev bygningen ovenfor skaleret fra (1, 1, 1) til (0,49482, 0,49482, 0,49482)), og vælg derefter modellen i projektet se og bemærk skalafaktoren i Importindstillingerne (normalt er det enten 1 eller 0,1).
Indstil den nye værdi, som skal svare til standardskalafaktoren gange med den nye skala (i mit tilfælde er det 1 x 0,49482 = 0,49482), og tryk derefter på Anvend. Gå nu tilbage til modellen i scenevisningen og sæt skalaen tilbage til (1, 1, 1).
Objektet er nu skaleret, som du har brug for, mens standardskalaen (1, 1, 1) bevares.
Dette tip er især vigtigt for animerede objekter, der bruger SkinnedMeshRenderer, da denne komponent er dyrere at gengive, og at have en skala på (1, 1, 1) forenkler gengivelsesprocessen.
Tip 2: Brug så få lys som muligt
Der er 3 typer lys i Unity (Retningsbestemt lys, Punktlys og Spotlight). Med hensyn til ydeevne er Retningsbestemt lys den billigste til gengivelse, derefter Point og til sidst Spotlight.
Generelt vil du ikke have mere end 1 retningsbestemt lys pr. scene, og for spot- og punktlys skal du prøve at have så få som muligt (eller slet ingen).
Med hensyn til skygger i realtid, mens det forbedrer det visuelle aspekt af spillet, har det en højtydende overhead, så generelt er det bedre at deaktivere dem eller bage dem ind i lightmaps og light sonder.
Tip 3: Brug transparente shaders med forsigtighed
Brug kun transparente eller partikelskyggere på overflader, der skal være gennemsigtige (f.eks. hegn, røgpartikler osv.)
Objekter med gennemsigtighed kræver et ekstra gengivelsespass, som kan reducere ydeevnen, især på platforme med begrænsede ressourcer, såsom mobil eller web.
Scripting
Tip 1: Altid cache komponentreferencer
Du skal altid cache komponentreferencer, hvis du planlægger at få adgang til dem hver opdatering.
Tjek f.eks. scriptet nedenfor:
Dårlig
using UnityEngine;
public class Script1 : MonoBehaviour
{
float someValue = 0;
// Update is called once per frame
void Update()
{
someValue = GetComponent<Script2>().someValue2;
}
}
Her har vi Script1 som henter variablen "someValue2" fra Script2 og tildeler den til en lokal variabel.
At kalde kun én GetComponent hver frame vil ikke have nogen indflydelse på ydeevnen, men du bør tage en vane med at cache de komponenter, der vil blive brugt ofte.
Der er to måder at cache en komponent i et script på, enten oprette en offentlig variabel og tildele den i Inspector-visning, eller oprette en privat variabel og tildele den fra Start eller Vågen. Tjek eksemplet nedenfor:
godt
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;
}
}
Meget bedre, Script2 kan nu tilgås hver opdatering uden ydelsesomkostninger.
Gør det samme for indbyggede komponenter, såsom BoxCollider, Rigidbody osv. (undtagen Transform og GameObject, de er allerede cachelagret som standard, så du kan få adgang til dem med det samme).
Tip 2: Brug SendMessage med forsigtighed
SendMessage lader dig kalde en specifik funktion (hvis den findes) på hver MonoBehaviour, der er knyttet til et spilobjekt.
For eksempel, når du skyder et våben i spillet, kan du hurtigt påføre skade, når kuglen rammer fjenden, uden at du behøver at bruge GetComponent og andre ekstra ting.
Denne metode bør dog ikke kaldes for ofte, da den er ret computerkrævende.
Tip 3: Brug GameObject.Find og GameObject.FindWithTag med forsigtighed
GameObject.Find, GameObject.FindWithTag og GameObject.FindGameObjectsWithTag lader dig hurtigt søge efter objekterne i scenen. Disse metoder er meget langsommere end GetComponent og bør kun bruges under initialisering.
Tip 4: Undgå at bruge OnGUI
Historisk set var OnGUI den eneste måde at lave menuer i Unity. Men siden blev der tilføjet et alternativ kaldet UI Canvas, som er meget bedre med hensyn til ydeevne og tilbyder meget mere funktionalitet.
Ikke desto mindre er OnGUI stadig en levedygtig måde at lave UI i Unity, og hvis du absolut skal bruge det, skal du huske på, at OnGUI kaldes mindst to gange pr. frame (dobbelt så meget som Update og LateUpdate), så lad være med at bruge det til alle beregninger udover UI.
En ting du kan gøre er at have et separat script, der kun har OnGUI i det og aktivere/deaktivere det, når det er nødvendigt.
For eksempel:
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;
}
}
}
Både UIScript og Script1 er knyttet til det samme GameObject. Script1 styrer, hvornår menuen skal vises.
Når afspilleren trykker på Tab, er UIScript aktiveret og viser knapperne. Hvis du trykker på Tab igen, deaktiveres den, og knapperne skjules.
Mens UIScript er deaktiveret, kaldes OnGUI-metoden ikke, hvilket igen forbedrer ydeevnen.
Tip 5: Brug Profiler
Profiler er et af de vigtigste værktøjer, når det kommer til at identificere flaskehalse og fps-fald, hvilket gør det nemmere at finde den nøjagtige årsag til den lave ydeevne.
Lyd
Lydklip kan optimeres ved at sikre, at deres importindstillinger er korrekte.
Optimale Lydimportindstillinger afhænger af lydlængden, afspilningsfrekvensen og målplatformen.