Wydajność

Wprowadzenie

Najprostszym sposobem racjonalizacji wydajności jest użycie klatek lub ile razy aplikacja może renderować obraz na sekundę. Ważne jest, aby spełnić docelową szybkość klatek, zgodnie z opisem dla platformy (tj. Windows Mixed Reality, Oculus itp.). Na przykład w HoloLens docelowa szybkość klatek wynosi 60 FPS. Aplikacje o niskiej szybkości klatek mogą spowodować pogorszenie środowiska użytkownika, takie jak pogorszenia stabilizacji hologramu, śledzenia świata, śledzenia rąk i nie tylko. Aby ułatwić deweloperom śledzenie i osiąganie szybkości klatek jakości, zestaw narzędzi Mixed Reality Toolkit udostępnia różne narzędzia i skrypty.

Profiler wizualizacji

Aby stale śledzić wydajność w okresie opracowywania, zdecydowanie zaleca się, aby zawsze wyświetlać wizualizację o szybkości klatek podczas debugowania & aplikacji. Zestaw narzędzi Mixed Reality udostępnia narzędzie diagnostyczne Visual Profiler, które zapewnia informacje w czasie rzeczywistym dotyczące bieżącego użycia plików FPS i pamięci w widoku aplikacji. Profiler wizualizacji można skonfigurować za pośrednictwem systemu diagnostyki Ustawienia w obszarze Inspektor profilów MRTK.

Ponadto szczególnie ważne jest użycie programu Visual Profiler do śledzenia klatek podczas uruchamiania na urządzeniu w przeciwieństwie do uruchamiania w edytorze aparatu Unity lub emulatorze. Najdokładniejsze wyniki wydajności zostaną przedstawione podczas uruchamiania na urządzeniu z kompilacjami konfiguracji wydania.

Uwaga

Jeśli kompilowanie pod kątem Windows Mixed Reality, wdróż przy użyciu kompilacji konfiguracji MASTER

Visual Profiler Interface

Optymalizowanie okna

Okno optymalizacji zestawu narzędzi MRTK oferuje narzędzia do obsługi informacji i automatyzacji, które ułatwiają deweloperom rzeczywistości mieszanej skonfigurowanie środowiska w celu uzyskania najlepszych wyników i zidentyfikowania potencjalnych wąskich gardeł w zasobach sceny&. Niektóre kluczowe konfiguracje w środowisku Unity mogą pomóc w dostarczaniu znacznie bardziej zoptymalizowanych wyników dla projektów rzeczywistości mieszanej.

Ogólnie rzecz biorąc, te ustawienia obejmują konfiguracje renderowania, które są idealne dla rzeczywistości mieszanej. Aplikacje rzeczywistości mieszanej są unikatowe w porównaniu do tradycyjnego tworzenia grafiki 3D w tym, że istnieją dwa ekrany (tj. dwa oczy) do renderowania dla całej sceny.

Zalecane ustawienia, do których odwołuje się poniżej, można automatycznie skonfigurować w projekcie aparatu Unity, korzystając z okna optymalizowania zestawu narzędzi MRTK.

MRTK Optimize Window Settings

Unity Profiler

Profiler aparatu Unity to przydatne narzędzie do badania szczegółów wydajności aplikacji na poziomie ramek.

Czas spędzony na procesorze CPU

Example Unity Profiler Graph

Aby zachować komfortową szybkość klatek (zazwyczaj 60 ramek na sekundę), aplikacje muszą osiągnąć maksymalny czas ramki wynoszący 16,6 milisekund czasu procesora CPU. Aby ułatwić identyfikację kosztów funkcji MRTK, zestaw narzędzi Microsoft Mixed Reality Toolkit zawiera znaczniki ścieżek kodu pętli wewnętrznej (na ramkę). Te znaczniki używają następującego formatu, aby pomóc w zrozumieniu określonych funkcji, które są używane:

[MRTK] className.methodName

Uwaga

Mogą istnieć dodatkowe dane po nazwie metody. Służy do identyfikowania warunkowo wykonywanych, potencjalnie kosztownych funkcji, których można uniknąć przez niewielkie zmiany w kodzie aplikacji.

Example Unity Profiler Hierarchy

W tym przykładzie hierarchia została rozszerzona, aby pokazać, że metoda UpdateHandData klasy WindowsMixedRealityArticulatedHand zużywa 0,44 ms czasu procesora CPU podczas analizowania ramki. Te dane mogą służyć do określenia, czy problem z wydajnością jest związany z kodem aplikacji lub z innego miejsca w systemie.

Zdecydowanie zaleca się, aby deweloperzy instrumentację kodu aplikacji w podobny sposób. Podstawowe obszary fokusu dla instrumentacji kodu aplikacji znajdują się w programach obsługi zdarzeń, ponieważ te metody są naliczane do pętli aktualizacji zestawu narzędzi MRTK w miarę wywoływanych zdarzeń. Wysokie czasy ramek w pętli aktualizacji MRTK mogą wskazywać na kosztowny kod w metodach obsługi zdarzeń.

renderowanie wystąpień Single-Pass

Domyślna konfiguracja renderowania XR w środowisku Unity to wieloprzepustowa. To ustawienie powoduje, że środowisko Unity wykona cały potok renderowania dwa razy, raz dla każdego oka. Można to zoptymalizować, wybierając zamiast tego renderowanie pojedynczego wystąpienia z przekazywaniem . Ta konfiguracja wykorzystuje macierze docelowe renderowania , aby móc wykonać pojedyncze wywołanie rysowania, które wystąpień do odpowiedniego obiektu docelowego renderowania dla każdego oka. Ponadto ten tryb umożliwia wykonywanie wszystkich renderowania w jednym wykonaniu potoku renderowania. W związku z tym wybranie renderowania pojedynczego wystąpienia z przekazywaniem jako ścieżki renderowania dla aplikacji rzeczywistości mieszanej może zaoszczędzić dużo czasu zarówno na procesorze GPU procesora CPU&, jak i jest zalecaną konfiguracją renderowania.

Jednak w celu wystawienia pojedynczego wywołania rysowania dla każdej siatki do każdego oka, dostęp do procesora GPU musi być obsługiwany przez wszystkie cieniowania. Instancing umożliwia procesorowi GPU wielokrotne rysowanie wywołań w obu oczach. Wbudowane moduły cieniowania aparatu Unity, a także cieniowanie standardowe zestawu NARZĘDZI MRTK domyślnie zawierają niezbędne instrukcje dotyczące ściągnięcia w kodzie cieniowania. Jeśli jednak pisanie niestandardowych cieniowania dla aparatu Unity, może być konieczne zaktualizowanie tych cieniowania w celu obsługi renderowania pojedynczego wystąpienia z przekazywaniem.

Przykładowy kod dla cieniowania niestandardowego

struct appdata
{
    float4 vertex : POSITION;
    float2 uv : TEXCOORD0;

    UNITY_VERTEX_INPUT_INSTANCE_ID //Insert
};

struct v2f
{
    float2 uv : TEXCOORD0;
    float4 vertex : SV_POSITION;

    UNITY_VERTEX_OUTPUT_STEREO //Insert
};

v2f vert (appdata v)
{
    v2f o;

    UNITY_SETUP_INSTANCE_ID(v); //Insert
    UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert
    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert

    o.vertex = UnityObjectToClipPos(v.vertex);

    o.uv = v.uv;

    return o;
}

Ustawienia jakości

Aparat Unity udostępnia ustawienia wstępne umożliwiające kontrolowanie jakości renderowania dla każdego punktu końcowego platformy. Te ustawienia wstępne kontrolują, jakie funkcje graficzne można włączyć, takie jak cienie, anty aliasy, oświetlenie globalne i nie tylko. Zaleca się obniżenie tych ustawień i zoptymalizowanie liczby obliczeń wykonywanych podczas renderowania.

Krok 1: Aktualizowanie projektów środowiska Unity rzeczywistości mieszanej w celu używania ustawienia niskiego poziomu jakości
Edytuj>Project Ustawienia, a następnie wybierz kategorię >Jakość Wybierz niską jakość dla platformy UWP

Krok 2: Dla każdego pliku sceny aparatu Unity wyłącz globalne oświetlenie w czasie rzeczywistym
Okno>Renderowania>Oświetlenie Ustawienia>Uncheck globalne oświetlenie w czasie rzeczywistym

Udostępnianie buforu głębokości (HoloLens)

W przypadku opracowania dla platformy Windows Mixed Reality, a w szczególności HoloLens, włączenie udostępniania buforu głębokości w Ustawienia XR może pomóc w stabilizacji hologramu. Jednak przetwarzanie buforu głębokości może ponieść koszt wydajności, szczególnie w przypadku korzystania z formatu głębokości 24-bitowej. W związku z tym zdecydowanie zaleca się skonfigurowanie buforu głębokości do dokładności 16-bitowej.

Jeśli walka z występuje z powodu niższego formatu bitowego, upewnij się, że dalekowstrzymowa płaszczyzna wszystkich aparatów jest ustawiona na najniższą możliwą wartość dla aplikacji. Aparat Unity domyślnie ustawia dalekostrzymową płaszczyznę klipu na 1000 m. W HoloLens znacznie 50m płaszczyzna klipów jest na ogół większa niż wystarczająca w przypadku większości scenariuszy aplikacji.

Uwaga

Jeśli używasz formatu głębokości 16-bitowej, wymagany bufor wzornika nie będzie działać, ponieważ aparat Unity nie tworzy bufora wzornika w tym ustawieniu. Wybranie 24-bitowego formatu głębokości zazwyczaj spowoduje utworzenie 8-bitowego buforu wzornika, jeśli ma to zastosowanie na platformie grafiki punktu końcowego.

Jeśli używasz składnika Maska , który wymaga buforu wzornika, rozważ użycie funkcji RectMask2D , która nie wymaga buforu wzornika, a tym samym może być używana w połączeniu z formatem głębokości 16-bitowej.

Uwaga

Aby szybko określić, które obiekty w scenie nie zapisują w buforze głębokości wizualnie, można użyć narzędzia Bufor głębokości renderowania w edytorze Ustawienia w profilu konfiguracji zestawu narzędzi MRTK.

Optymalizowanie danych Mesh

Ustawienia Optymalizacja Mesh dane próbują usunąć nieużywane atrybuty wierzchołka w aplikacji. To ustawienie wykonuje, uruchamiając nad każdym cieniatorem przekazywanym w każdym materiale, który znajduje się w każdej siatki w kompilacji. Jest to dobre dla rozmiaru danych gry i wydajności środowiska uruchomieniowego, ale może drastycznie utrudnić czas kompilacji.

Zaleca się wyłączenie tego ustawienia podczas programowania i ponowne włączenie podczas tworzenia kompilacji "Master". Ustawienie można znaleźć w obszarze Edytuj>Project Ustawienia>PlayerInny> Ustawienia >Optymalizowanie danych Mesh.

Zalecenia ogólne

Wydajność może być niejednoznaczna i stale zmieniającym się wyzwaniem dla deweloperów rzeczywistości mieszanej, a spektrum wiedzy w celu racjonalizacji wydajności jest ogromne. Istnieją jednak pewne ogólne zalecenia dotyczące sposobu podejścia do wydajności aplikacji.

Warto uprościć wykonywanie aplikacji w elementach uruchamianych na procesorze CPU lub procesorze GPU , a tym samym określić, czy aplikacja jest powiązana przez jeden z składników. Mogą istnieć wąskie gardła obejmujące zarówno jednostki przetwarzania, jak i niektóre unikatowe scenariusze, które należy dokładnie zbadać. Jednak w przypadku rozpoczęcia pracy dobrze jest zrozumieć, gdzie aplikacja wykonuje najwięcej czasu.

Ograniczony procesor GPU

Ponieważ większość platform dla aplikacji rzeczywistości mieszanej korzysta z renderowania steroskopowego, bardzo często jest powiązana z procesorem GPU ze względu na charakter renderowania "dwuwędowego" ekranu. Futhermore, mobilne platformy rzeczywistości mieszanej, takie jak HoloLens lub Oculus Quest, będą ograniczone przez moc procesora GPU klasy & mobilnej.

W przypadku skupienia się na procesorze GPU istnieją zazwyczaj dwa ważne etapy, które aplikacja musi ukończyć każdą ramkę.

  1. Wykonywanie cieniowania wierzchołków
  2. Wykonaj cieniowanie pikseli (znane również jako cieniowanie fragmentów)

Bez głębokiego zagłębienia się w złożone pole potoków renderowania grafiki & komputerowej każdy etap cieniowania jest programem uruchamianym na procesorze GPU w celu utworzenia następujących elementów.

  1. Cieniowania wierzchołków przekształcają wierzchołki siatki w celu współrzędnych w przestrzeni ekranu (tj. kod wykonywany na wierzchołku)
  2. Cieniowanie pikseli oblicza kolor do rysowania dla danego fragmentu piksela i siatki (tj. wykonywanie kodu na piksel)

W odniesieniu do dostrajania wydajności zwykle bardziej owocne jest skupienie się na optymalizacji operacji w cieniowaniu pikseli. Aplikacja może wymagać tylko rysowania modułu, który będzie tylko 8 wierzchołków. Jednak miejsce na ekranie, które zajmuje moduł, jest prawdopodobnie w kolejności milionów pikseli. W związku z tym zmniejszenie kodu cieniowania, powiedzmy, 10 operacji może znacznie bardziej pracować, jeśli zmniejszysz cieniowanie pikseli niż cieniowanie wierzchołka.

Jest to jeden z głównych powodów korzystania z cieniowania standardowego zestawu narzędzi MRTK , ponieważ ten moduł cieniowania zazwyczaj wykonuje wiele mniej instrukcji na wierzchołek pikseli & niż cieniowanie standardowe aparatu Unity przy jednoczesnym osiągnięciu porównywalnych wyników estetycznych.

Optymalizacje procesora CPU Optymalizacje procesora GPU
Logika symulacji aplikacji Operacje renderowania
Uproszczenie fizyki Zmniejszanie obliczeń oświetlenia
Upraszczanie animacji Zmniejsz liczbę & wielokątów # obiektów rysowalnych
Zarządzanie odzyskiwaniem pamięci Zmniejsz liczbę obiektów przezroczystych
Odwołania do pamięci podręcznej Unikaj przetwarzania końcowego/efektów pełnoekranowych

Rysowanie wywołania instancing

Jednym z najczęstszych błędów w środowisku Unity, które zmniejszają wydajność, jest klonowanie materiałów w czasie wykonywania. Jeśli obiekty GameObject współużytkują ten sam materiał i/lub są tymi samymi siatkami, można je zoptymalizować w wywołaniach pojedynczego rysowania za pomocą technik takich jak wsadowe statyczne, dynamiczne dzielenie na partie i instancing procesora GPU. Jeśli jednak deweloper modyfikuje właściwości materiału renderera w czasie wykonywania, aparat Unity utworzy kopię klonowania przypisanego materiału.

Jeśli na przykład w scenie znajduje się 100 modułów, deweloper może chcieć przypisać unikatowy kolor do każdego w czasie wykonywania. Dostęp do pliku renderer.material.color w języku C# sprawi, że aparat Unity utworzy nowy materiał w pamięci dla tego konkretnego modułu renderowania/obiektu GameObject. Każdy z 100 modułów będzie miał swój własny materiał i dlatego nie można ich scalić w jedno wywołanie rysowania, ale zamiast tego stanie się 100 żądań rysowania z procesora CPU do procesora GPU.

Aby przezwyciężyć tę przeszkodę i nadal przypisywać unikatowy kolor na sześcian, deweloperzy powinni wykorzystać MaterialPropertyBlock.

private PropertyBlock m_PropertyBlock ;
private Renderer myRenderer;

private void Start()
{
     myRenderer = GetComponent<Renderer>();
     m_PropertyBlock = new MaterialPropertyBlock();
}

private void ChangeColor()
{
    // Creates a copy of the material once for this renderer
    myRenderer.material.color = Color.red;

    // vs.

    // Retains instancing capability for renderer
    m_PropertyBlock.SetColor("_Color", Color.red);
    myRenderer.SetPropertyBlock(m_PropertyBlock);
}

Narzędzia wydajności aparatu Unity

Aparat Unity zapewnia doskonałe narzędzia do wydajności wbudowane w edytor.

W przypadku szacowania przybliżonego kompromisu wydajności między jednym cieniatorem a innym warto skompilować każdy moduł cieniujący i wyświetlić liczbę operacji na etapie cieniowania. Można to zrobić, wybierając zasób cieniowania i klikając przycisk Kompiluj i pokaż kod . Spowoduje to skompilowanie wszystkich wariantów cieniowania i otwarcie programu Visual Studio z wynikami. Uwaga: wygenerowane wyniki statystyczne mogą się różnić w zależności od tego, jakie funkcje zostały włączone w przypadku materiałów korzystających z danego cieniowania. Aparat Unity skompiluje tylko warianty cieniowania używane bezpośrednio w bieżącym projekcie.

Przykład statystyk cieniowania standardowego aparatu Unity

Unity Standard Shader Statistics 1

Przykład statystyk cieniowania standardowego zestawu narzędzi MRTK

MRTK Standard Shader Statistics 2

Zobacz też

Unity

Windows Mixed Reality

Oculus

optymalizacja Mesh