Doporučení k výkonu pro Unity

Tento článek vychází z doporučení k výkonu pro hybridní realitu, ale zaměřuje se na vylepšení specifická pro Unity.

Nedávno jsme vydali aplikaci s názvem Základy kvality, která řeší běžné problémy s výkonem, návrhem a prostředím a jejich řešení pro HoloLens 2 aplikace. Tato aplikace je skvělou vizuální ukázkou pro následující obsah.

Nejdůležitějším prvním krokem při optimalizaci výkonu aplikací hybridní reality v Unity je ujistit se, že používáte doporučené nastavení prostředí pro Unity. Tento článek obsahuje obsah s některými nejdůležitějšími konfiguracemi scén pro vytváření výkonných aplikací Mixed Reality. Některá z těchto doporučených nastavení jsou také zvýrazněná níže.

Jak profilovat pomocí Unity

Unity poskytuje integrovaný profiler Unity , který je skvělým prostředkem pro shromažďování cenných přehledů o výkonu vaší konkrétní aplikace. I když můžete profiler spustit v editoru, tyto metriky nepředstavují skutečné runtime prostředí, takže výsledky by se měly používat opatrně. Doporučujeme vzdáleně profilovat aplikaci při spuštění na zařízení, abyste měli co nejpřesnější a nejpřesnější přehledy.

Unity poskytuje skvělou dokumentaci pro:

  1. Jak vzdáleně připojit profiler Unity k aplikacím pro UPW
  2. Jak efektivně diagnostikovat problémy s výkonem pomocí profileru Unity

Profilace GPU

Profiler Unity

Po připojení Unity Profileru a po přidání profileru GPU (viz Přidání profileru v pravém horním rohu) můžete zjistit, kolik času strávíme na procesoru & GPU uprostřed profileru. To vývojáři umožní rychle aproximovat, pokud je jeho aplikace ohraničená procesorem nebo GPU.

Procesor Unity vs. GPU

Poznámka

Pokud chcete použít profilaci GPU, musíte zakázat úlohy grafiky v nastavení přehrávače Unity. Další podrobnosti najdete v modulu Profiler využití GPU v Unity.

Ladicí program rámce Unity

Ladicí program Rámce Unity je také výkonný a přehledný nástroj, který můžete použít. Poskytne vám dobrý přehled o tom, co GPU dělá jednotlivé snímky. Na co je potřeba se zaměřit, jsou další cíle vykreslování a příkazy blit, které se mezi nimi kopírují, protože ty jsou u HoloLensu velmi nákladné. V ideálním případě by se v HoloLensu neměly používat žádné cíle vykreslování mimo obrazovku. Ty se obvykle přidávají při povolování nákladných funkcí vykreslování (například MSAA, HDR nebo celoobrazovkové efekty, jako je bloom), kterým byste se měli vyhnout.

Překryv snímkové frekvence HoloLens

Stránka Výkon systému portálu Zařízení obsahuje dobrý přehled výkonu procesoru a GPU zařízení. Můžete povolit zobrazení čítače snímkové frekvence v náhlavní soupravě a Zobrazit graf snímkové frekvence v náhlavní soupravě. Tyto možnosti povolí čítač FPS a graf, který vám poskytne okamžitou zpětnou vazbu ve všech spuštěných aplikacích na vašem zařízení.

PIX

PIX lze použít také k profilování aplikací Unity. K dispozici jsou také podrobné pokyny k používání a instalaci PIX pro HoloLens 2. Ve vývojovém buildu se stejné obory, které vidíte v ladicího programu Rámce Unity, zobrazí také v PIX a dají se podrobněji zkontrolovat a profilovat.

Poznámka

Unity poskytuje možnost snadno upravit rozlišení cíle vykreslování vaší aplikace za běhu prostřednictvím XRSettings.renderViewportScale vlastnost. Konečný obrázek prezentovaný na zařízení má pevné rozlišení. Platforma vzorkuje výstup s nižším rozlišením a vytvoří obrázek s vyšším rozlišením pro vykreslování na displejích.

UnityEngine.XR.XRSettings.renderViewportScale = 0.7f;

Doporučení k výkonu procesoru

Níže uvedený obsah se zabývá podrobnějšími postupy výkonu, které jsou určené zejména pro vývoj v Unity & C#.

Odkazy na mezipaměť

Při inicializaci doporučujeme ukládat odkazy na všechny relevantní komponenty a objekty GameObjects do mezipaměti, protože volání opakujících se funkcí, jako jsou GetComponent<T>() a Camera.main , jsou vzhledem k nákladům na paměť pro uložení ukazatele dražší. . Camera.main jenom používá funkci FindGameObjectsWithTag(), která v grafu scény nákladně hledá objekt kamery se značkou MainCamera .

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    private Camera cam;
    private CustomComponent comp;

    void Start() 
    {
        cam = Camera.main;
        comp = GetComponent<CustomComponent>();
    }

    void Update()
    {
        // Good
        this.transform.position = cam.transform.position + cam.transform.forward * 10.0f;

        // Bad
        this.transform.position = Camera.main.transform.position + Camera.main.transform.forward * 10.0f;

        // Good
        comp.DoSomethingAwesome();

        // Bad
        GetComponent<CustomComponent>().DoSomethingAwesome();
    }
}

Poznámka

Vyhněte se getComponent(string)
Při použití funkce GetComponent() existuje několik různých přetížení. Je důležité vždy používat implementace založené na typech a nikdy přetížení hledání založené na řetězcích. Vyhledávání podle řetězce ve scéně je výrazně dražší než hledání podle typu.
(Dobrý) Komponenta GetComponent(typ)
(Dobrý) T GetComponent<T>()
(Špatně) Komponenta GetComponent(string)>

Vyhněte se nákladným operacím

  1. Vyhněte se používání LINQ

    Přestože LINQ může být čistý a snadno čitelný a zapisovatelný, obecně vyžaduje více výpočtů a paměti, než kdybyste algoritmus napsali ručně.

    // Example Code
    using System.Linq;
    
    List<int> data = new List<int>();
    data.Any(x => x > 10);
    
    var result = from x in data
                 where x > 10
                 select x;
    
  2. Běžná rozhraní API Unity

    Provádění některých rozhraní API Unity, i když jsou užitečná, může být nákladné. Většina z nich zahrnuje vyhledávání v celém grafu scény, kde najdete odpovídající seznam herních objektů. Těmto operacím se obecně lze vyhnout ukládáním odkazů do mezipaměti nebo implementací komponenty správce pro objekty GameObjects ke sledování odkazů za běhu.

        GameObject.SendMessage()
        GameObject.BroadcastMessage()
        UnityEngine.Object.Find()
        UnityEngine.Object.FindWithTag()
        UnityEngine.Object.FindObjectOfType()
        UnityEngine.Object.FindObjectsOfType()
        UnityEngine.Object.FindGameObjectsWithTag()
        UnityEngine.Object.FindGameObjectsWithTag()
    

Poznámka

Funkce SendMessage() a BroadcastMessage() by měly být eliminovány za každou cenu. Tyto funkce můžou být v pořadí až 1000krát pomalejší než přímá volání funkcí.

  1. Pozor na boxování

    Boxování je základní koncept jazyka C# a modulu runtime. Jedná se o proces zabalení proměnných hodnotových typů, jako charjsou , , boolatd., intdo proměnných s referenčním typem. Když je proměnná typu hodnota "boxed", je zabalená do objektu System.Object, který je uložený ve spravované haldě. Paměť je přidělena a nakonec po vyřazení musí být zpracována uvolňováním paměti. Tato přidělení a přidělení účtují náklady na výkon a v mnoha scénářích jsou zbytečné nebo je lze snadno nahradit levnější alternativou.

    Abyste se vyhnuli balení, ujistěte se, že proměnné, pole a vlastnosti, ve kterých ukládáte číselné typy a struktury (včetně Nullable<T>), jsou místo použití objektu silně zadávány jako konkrétní typy, například int, float? nebo MyStruct. Pokud tyto objekty zadáváte do seznamu, nezapomeňte použít seznam se silnými typy, například List<int> místo nebo List<object>ArrayList.

    Příklad balení v jazyce C#

    // boolean value type is boxed into object boxedMyVar on the heap
    bool myVar = true;
    object boxedMyVar = myVar;
    

Opakující se cesty kódu

Všechny opakující se funkce zpětného volání Unity (tj. Aktualizace), které se spouštějí mnohokrát za sekundu nebo rámec, by měly být zapsány pečlivě. Všechny nákladné operace zde budou mít obrovský a konzistentní dopad na výkon.

  1. Prázdné funkce zpětného volání

    Ačkoli níže uvedený kód může vypadat nevinně, aby opustil ve vaší aplikaci, zejména proto, že každý skript Unity se automaticky inicializuje pomocí metody Update, může se tato prázdná zpětná volání stát nákladnou. Unity pracuje tam a zpět mezi nespravovanou a spravovanou hranicí kódu, mezi kódem UnityEngine a kódem aplikace. Přepínání kontextu přes tento most je poměrně nákladné, i když není co provést. To se stává obzvláště problematické, pokud má vaše aplikace 100s GameObjects s komponentami, které mají prázdné opakující se zpětná volání Unity.

    void Update()
    {
    }
    

Poznámka

Update() je nejčastějším projevem tohoto problému s výkonem, ale ostatní opakující se zpětná volání Unity, například následující, můžou být stejně špatná, ne-li horší: FixedUpdate(), LateUpdate(), OnPostRender", OnPreRender(), OnRenderImage() atd.

  1. Operace, které upřednostní spuštění jednou za snímek

    Následující rozhraní UNITY API jsou běžnými operacemi pro mnoho holografických aplikací. I když to není vždy možné, výsledky z těchto funkcí se obvykle dají vypočítat jednou a výsledky znovu využít v aplikaci pro daný rámec.

    a) Je vhodné mít vyhrazenou třídu nebo službu Singleton, která zpracuje váš pohled Raycast na scénu a pak znovu použije tento výsledek ve všech ostatních komponentách scény, místo provádění opakovaných a identických operací Raycastu pro každou komponentu. Některé aplikace můžou vyžadovat raycasty z různých počátků nebo pro různé vrstvové masky.

        UnityEngine.Physics.Raycast()
        UnityEngine.Physics.RaycastAll()
    

    b) Vyhněte se operacím GetComponent() v opakovaných zpětných voláních Unity, jako je Update(), ukládáním odkazů do mezipaměti v části Start() nebo Awake()

        UnityEngine.Object.GetComponent()
    

    c) Pokud je to možné, je vhodné vytvořit instanci všech objektů při inicializaci a použít sdružování objektů k recyklaci a opakovanému použití objektů GameObjects během běhu vaší aplikace.

        UnityEngine.Object.Instantiate()
    
  2. Vyhněte se rozhraním a virtuálním konstruktorům

    Volání funkcí prostřednictvím rozhraní a přímých objektů nebo volání virtuálních funkcí může být často mnohem dražší než použití přímých konstruktorů nebo volání přímých funkcí. Pokud virtuální funkce nebo rozhraní není nutné, měli byste je odebrat. Výkon těchto přístupů však stojí za kompromis, pokud jejich použití zjednodušuje spolupráci na vývoji, čitelnost kódu a udržovatelnost kódu.

    Obecně se doporučuje neoznačovat pole a funkce jako virtuální, pokud není jasné, že je potřeba tento člen přepsat. Zvlášť opatrní byste měli být v případě vysokofrekvenčních cest kódu, které se volají mnohokrát za snímek nebo dokonce jednou na jeden snímek, jako UpdateUI() je například metoda.

  3. Vyhněte se předávání struktur podle hodnoty

    Na rozdíl od tříd jsou struktury typy hodnot a při předání přímo funkci se jejich obsah zkopíruje do nově vytvořené instance. Tato kopie přidá náklady na procesor a také další paměť v zásobníku. U malých struktur je účinek minimální, a proto přijatelný. U funkcí opakovaně vyvolaných každý rámec i funkce, které mají velké struktury, však pokud je to možné, upravte definici funkce tak, aby předávala odkaz. Další informace najdete tady.

Různé

  1. Fyzika

    a) Obecně platí, že nejjednodušším způsobem, jak zlepšit fyziku, je omezit množství času stráveného fyzikou nebo počet iterací za sekundu. Tím se sníží přesnost simulace. Viz TimeManager v Unity.

    b) Typy kolidérů v Unity mají značně odlišné charakteristiky výkonu. Následující pořadí uvádí nejvýkonnější kolidéry s nejméně výkonnými kolidéry zleva doprava. Je důležité se vyhnout koliderům Mesh, které jsou podstatně dražší než primitivní kolidéry.

    Sphere < Kapsle < Box <<< Mesh (Konvexní) < Mesh (non-Konvex)

    Další informace najdete v tématu Osvědčené postupy pro fyziku Unity .

  2. Animace

    Zakažte nečinné animace zakázáním komponenty Animator (zakázání herního objektu nebude mít stejný účinek). Vyhněte se vzorům návrhu, kdy animátor sedí ve smyčce a nastavuje hodnotu na stejnou věc. Tato technika má značné režijní náklady, které nemají žádný vliv na aplikaci. Zde najdete další informace.

  3. Složité algoritmy

    Pokud vaše aplikace používá složité algoritmy, jako je inverzní kinematika, hledání cest atd., hledejte jednodušší přístup nebo upravte příslušná nastavení výkonu.

Doporučení k výkonu procesoru na GPU

Obecně platí, že výkon procesoru na GPU se týká volání kreslení odeslaných na grafickou kartu. Aby se zlepšil výkon, musí být volání kreslení strategicky a) redukována nebo b) restrukturalizována pro dosažení optimálních výsledků. Vzhledem k tomu, že samotné volání draw jsou náročná na prostředky, omezí se jejich snížení na celkovou požadovanou práci. Kromě toho změny stavu mezi voláními kreslení vyžadují nákladné kroky ověření a překladu v ovladači grafiky, a proto může restrukturalizace volání kreslení aplikace omezit změny stavu (tj. různé materiály atd.) zvýšit výkon.

Unity má skvělý článek, který poskytuje přehled a ponoří se do dávkového losování volání pro jejich platformu.

Vykreslování instance s jedním průchodem

Vykreslování instance s jedním průchodem v Unity umožňuje snížit počet volání kreslení pro každé oko na jednu instanci volání kreslení. Kvůli koherenci mezipaměti mezi dvěma voláními kreslení dochází také k určitému zlepšení výkonu gpu.

Povolení této funkce v projektu Unity

  1. Otevřete Nastavení OpenXR (přejděte na Upravit>nastavení> projektuXR Plugin Management>OpenXR).
  2. V rozevírací nabídce Režim vykreslování vyberte Single Pass Instanced.

Podrobnosti o tomto přístupu vykreslování najdete v následujících článcích z Unity.

Poznámka

K jednomu běžnému problému s vykreslováním instance s jedním průchodem dochází v případě, že vývojáři už mají existující vlastní shadery, které nejsou napsané pro instanci. Po povolení této funkce si vývojáři můžou všimnout, že se některé objekty GameObject vykreslují jenom jedním okem. Důvodem je to, že přidružené vlastní shadery nemají odpovídající vlastnosti pro instanci.

Postup řešení tohoto problému najdete v tématu Single Pass Stereo Rendering pro HoloLens od Unity.

Statické dávkování

Unity dokáže dávkot velké množství statických objektů, aby se omezila volání na gpu. Statické dávkování funguje u většiny objektů Rendereru v Unity, které 1) sdílejí stejný materiál a 2) jsou všechny označené jako Statické (Vyberte objekt v Unity a zaškrtněte políčko v pravém horním rohu inspektoru). Objekty GameObject označené jako statické nelze přesouvat během běhu aplikace. Statické dávkování proto může být obtížné využít u HoloLensu, kde je potřeba umístit, přesunout, škálovat atd. U imerzivních náhlavních souprav může statické dávkování výrazně snížit počet volání a tím zvýšit výkon.

Další podrobnosti najdete v tématu Statické dávkovánív části Dávkování volání kreslení v Unity .

Dynamické dávkování

Vzhledem k tomu, že je problematické označit objekty jako statické pro vývoj HoloLens, může být dynamické dávkování skvělým nástrojem pro kompenzaci této chybějící funkce. Může být také užitečný pro imerzivní náhlavní soupravy. Dynamické dávkování v Unity však může být obtížné, protože GameObjects musí a) sdílet stejný materiál a b) splňovat dlouhý seznam dalších kritérií.

Úplný seznam najdete v části Dávkování volání kreslení v Unity v části Dynamické dávkování. Nejčastěji se objekty GameObjects stávají neplatnými, aby byly dynamicky dávková, protože přidružená data sítě nesmí být větší než 300 vrcholů.

Další techniky

Dávkování může proběhnout pouze v případě, že více objektů GameObject může sdílet stejný materiál. Obvykle to bude blokováno potřebou GameObjects mít jedinečnou texturu pro jejich příslušný materiál. Je běžné kombinovat textury do jedné velké textury, metoda označovaná jako Atlasování textur.

Kromě toho je vhodnější kombinovat sítě do jednoho Objektu GameObject, kde je to možné a rozumné. Každý vykreslovač v Unity bude mít svá přidružená volání kreslení v porovnání s odesláním kombinované sítě pod jedním rendererem.

Poznámka

Úprava vlastností Renderer.material za běhu vytvoří kopii materialu a tím potenciálně přeruší dávkování. Použijte Renderer.sharedMaterial k úpravě vlastností sdíleného materiálu napříč objekty GameObjects.

Doporučení k výkonu GPU

Další informace o optimalizaci vykreslování grafiky v Unity

Šířka pásma a rychlosti naplnění

Při vykreslování snímku na GPU je aplikace vázána šířkou pásma paměti nebo rychlostí naplnění.

  • Šířka pásma paměti je rychlost čtení a zápisů, které může GPU provádět z paměti.
    • V Unity změňte kvalitu textury v nastavení upravit>nastavení>kvality projektu.
  • Rychlost výplně označuje pixely, které může gpu nakreslit za sekundu.

Optimalizace sdílení hloubkové vyrovnávací paměti

Pokud chcete optimalizovat stabilitu hologramu, doporučujeme povolit sdílení hloubkové vyrovnávací paměti. Při povolení hloubkové reprojekce v pozdní fázi s tímto nastavením doporučujeme vybrat 16bitový formát hloubky místo 24bitové hloubky. 16bitové hloubkové vyrovnávací paměti výrazně sníží šířku pásma (a tím i výkon) související s provozem hloubkové vyrovnávací paměti. To může být velké zlepšení jak v oblasti snížení výkonu, tak i v oblasti výkonu. Existují však dva možné negativní výsledky pomocí 16bitového formátu hloubky.

Boj proti Z

Díky věrnosti omezeného rozsahu hloubky je u 16bitových bitů větší pravděpodobnost výskytu bitů než u 24bitových bitů. Chcete-li se těmto artefaktům vyhnout, upravte roviny téměř/vzdáleného klipu kamery Unity tak, aby se zohlednila nižší přesnost. U aplikací založených na HoloLensu může vzdálená rovina klipu 50 m místo výchozích 1000 m Unity obecně eliminovat jakékoli z-boj.

Zakázaná vyrovnávací paměť vzorníku

Když Unity vytvoří texturu vykreslování s 16bitovou hloubkou, nevytvoří se žádná vyrovnávací paměť vzorníku. Výběrem 24bitového formátu hloubky, jak je popsáno v dokumentaci k Unity, se vytvoří 24bitová z-vyrovnávací paměť a 8bitová vyrovnávací paměť vzorníku (pokud je 32bitová verze použitelná na zařízení (například HoloLens), což je obecný případ).

Vyhněte se efektům na celé obrazovce

Techniky, které pracují na celé obrazovce, můžou být nákladné, protože jejich řádová velikost je miliony operací každého snímku. Doporučuje se vyhnout se účinkům následného zpracování , jako je anti-aliasing, bloom a další.

Optimální nastavení osvětlení

Globální osvětlení v reálném čase v Unity může poskytovat vynikající vizuální výsledky, ale zahrnuje nákladné výpočty osvětlení. Doporučujeme zakázat globální osvětlení v reálném čase pro každý soubor scény Unity prostřednictvímnastavení>osvětlení vykreslování>okna> Zrušte zaškrtnutí globálního osvětlení v reálném čase.

Kromě toho se doporučuje zakázat všechny stínové přetypování, protože to také přidává nákladné průchody GPU do scény Unity. Stíny je možné zakázat podle světla, ale můžete je také ovládat holisticky prostřednictvím nastavení kvality.

Upravit>Nastavení projektu a pak vyberte kategorii >Kvalita Vyberte nízkou kvalitu pro platformu UPW. Můžete také jednoduše nastavit vlastnost Stíny na Zakázat stíny.

U modelů v Unity doporučujeme používat pečené osvětlení.

Snížit počet poly

Počet mnohoúhelníku se sníží o

  1. Odebrání objektů ze scény
  2. Decimace majetku, která snižuje počet mnohoúhelníků pro danou síť
  3. Implementace systému LOD (Level of Detail) do vaší aplikace, který vykresluje vzdálené objekty s nižší verzí polygonu stejné geometrie

Principy shaderů v Unity

Jednoduchou aproximací pro porovnání shaderů ve výkonu je identifikace průměrného počtu operací, které každý provádí za běhu. To se dá v Unity snadno provést.

  1. Vyberte prostředek shaderu nebo materiál a pak v pravém horním rohu okna inspektoru vyberte ikonu ozubeného kola a pak vyberte "Vybrat shader".

    Výběr shaderu v Unity

  2. S vybraným assetem shaderu vyberte tlačítko Zkompilovat a zobrazit kód pod oknem inspektoru.

    Kompilace kódu shaderu v Unity

  3. Po kompilaci vyhledejte ve výsledcích část statistiky s počtem různých operací pro vrchol i pixel shader (Poznámka: shadery pixelů se často označují také jako shadery fragmentů).

    Operace standardního shaderu Unity

Optimalizace pixel shaderů

Při pohledu na výsledky kompilované statistiky pomocí výše uvedené metody bude shader fragmentů obecně provádět v průměru více operací než shader vrcholů. Shader fragmentů, označovaný také jako pixel shader, se na výstupu obrazovky spouští na pixel, zatímco shader vrcholů se spouští pouze pro vrchol všech sítí, které jsou nakresleny na obrazovku.

Proto mají shadery fragmentů nejen kvůli všem výpočtům osvětlení více instrukcí než shadery vrcholů, ale jsou téměř vždy spouštěné na větší datové sadě. Pokud je například výstupem obrazovky obrázek 2 ku 2k, pak může být shader fragmentů spuštěn 2 000*2 000 = 4 000 000 krát. Při vykreslování dvou očí se toto číslo zdvojnásobí, protože existují dvě obrazovky. Pokud má aplikace hybridní reality více průchodů, efektů následného zpracování na celou obrazovku nebo vykreslování více sítí na stejný pixel, toto číslo se výrazně zvýší.

Snížení počtu operací v shaderu fragmentů proto může obecně dosáhnout mnohem vyššího výkonu oproti optimalizaci v shaderu vrcholů.

Alternativy shaderu Unity Standard

Místo použití fyzického vykreslování (PBR) nebo jiného vysoce kvalitního shaderu se podívejte na využití výkonnějšího a levnějšího shaderu. Sada Mixed Reality Toolkit poskytuje standardní shader MRTK, který je optimalizovaný pro projekty hybridní reality.

Unity také poskytuje neosvícené, rozsvícené, rozptýlené a další zjednodušené možnosti shaderu, které jsou ve srovnání s shaderem Unity Standard rychlejší. Podrobnější informace najdete v tématu Využití a výkon předdefinovaných shaderů .

Přednačítá se shader

K optimalizaci doby načítání shaderu použijte předběžné načítání Shaderu a další triky. Zejména předběžné načtení shaderu znamená, že kvůli kompilaci shaderu za běhu neuvidíte žádné závorky.

Omezení překreslení

V Unity můžete zobrazit překreslení scény přepnutím nabídky režimu kreslení v levém horním rohu zobrazení scény a výběrem možnosti Překreslit.

Obecně platí, že překreslení lze zmírnit tím, že objekty předem vytěsníte, než se odešlou do GPU. Unity poskytuje podrobnosti o implementaci occlusion Culling pro jejich modul.

Doporučení k paměti

Nadměrné přidělení paměti & operace uvolnění může mít nepříznivé účinky na holografickou aplikaci, což vede k nekonzistentnímu výkonu, zmrazeným rámcům a dalšímu škodlivému chování. Při vývoji v Unity je obzvláště důležité porozumět aspektům paměti, protože správa paměti je řízena uvolňováním paměti.

Uvolnění paměti

Holografické aplikace ztratí výpočetní čas pro uvolňování paměti, když je GC aktivovaný za účelem analýzy objektů, které už nejsou v rozsahu během provádění, a jejich paměť musí být uvolněna, aby bylo možné ho znovu použít. Konstantní alokace a rušení přidělení budou obecně vyžadovat, aby systém uvolňování paměti běžel častěji, což snižuje výkon a uživatelské prostředí.

Unity poskytla vynikající stránku, která podrobně vysvětluje, jak funguje uvolňování paměti, a tipy pro psaní efektivnějšího kódu, pokud jde o správu paměti.

Jedním z nejběžnějších postupů, které vedou k nadměrnému uvolňování paměti, je neuchování odkazů na komponenty a třídy ve vývoji pro Unity. Všechny odkazy by se měly zachytit během start() nebo Probuzený() a znovu je použít v pozdějších funkcích, jako je Update() nebo LateUpdate().

Další rychlé tipy:

  • Použití třídy StringBuilder jazyka C# k dynamickému vytváření složitých řetězců za běhu
  • Pokud už volání Debug.Log() nepotřebujete, odeberte je, protože se stále spouštějí ve všech verzích sestavení aplikace.
  • Pokud vaše holografická aplikace obecně vyžaduje hodně paměti, zvažte volání System.GC.Collect() během fází načítání, například při zobrazení obrazovky načítání nebo přechodu.

Sdružování objektů

Sdružování objektů je oblíbená technika pro snížení nákladů na průběžné přidělování a přidělování objektů. To se provádí přidělením velkého fondu identických objektů a opětovným použitím neaktivních dostupných instancí z tohoto fondu místo neustálého vytváření a ničení objektů v průběhu času. Fondy objektů jsou skvělé pro opakovaně použitelné komponenty, které mají během aplikace proměnlivou životnost.

Výkonnost spouštění

Zvažte spuštění aplikace s menší scénou a pak pomocí sceneManager.LoadSceneAsync načtěte zbytek scény. Díky tomu se vaše aplikace dostane do interaktivního stavu co nejrychleji. Při aktivaci nové scény může docházet k velkému nárůstu využití procesoru a může dojít k zadrhávanému nebo zadrhávanému obsahu. Jedním ze způsobů, jak to obejít, je nastavit vlastnost AsyncOperation.allowSceneActivation na "false" na scéně, která se načítá, počkat na načtení scény, vymazat obrazovku na černou a pak ji nastavit zpět na true, aby se dokončila aktivace scény.

Nezapomeňte, že při načítání spouštěcí scény se uživateli zobrazí holografická úvodní obrazovka.

Viz také