Wydajność — MRTK2

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 na urządzeniu 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, 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 uruchamiania & debugowania aplikacji. Mixed Reality Toolkit udostępnia narzędzie diagnostyczne profilera wizualnego, które zapewnia informacje w czasie rzeczywistym dotyczące bieżącego użycia pamięci i wydajności w widoku aplikacji. Profiler wizualizacji można skonfigurować za pośrednictwem ustawień systemu diagnostyki 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

W przypadku kompilowania dla Windows Mixed Reality wdróż przy użyciu kompilacji konfiguracji MASTER.

Visual Profiler, interfejs

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 scenie & zasobów. 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.

Ustawienia okna optymalizowania zestawu narzędzi MRTK

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

Przykładowy wykres profilera aparatu Unity

Aby zachować wygodną 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.

Przykładowa hierarchia profilera aparatu Unity

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 CPU & gpu , 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>Ustawienia projektu, 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>Ustawienia> oświetleniaUsuń zaznaczenie pola Globalne oświetlenie w czasie rzeczywistym

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

W przypadku opracowywania dla platformy Windows Mixed Reality, a w szczególności urządzenia HoloLens, włączenie udostępniania buforu głębokości w obszarze 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. Na urządzeniu HoloLens znacznie więcej niż w przypadku większości scenariuszy aplikacji jest znacznie większa niż wystarczająca.

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 obszarze Ustawienia edytora w profilu konfiguracji zestawu narzędzi MRTK.

Optymalizowanie danych usługi Mesh

Ustawienia optymalizujące dane siatki 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>odtwarzacz>ustawień> projektuInne ustawienia>Optymalizowanie danych siatki.

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 procesor CPU klasy mobilnej & moc obliczeniową procesora GPU.

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 grafiki komputerowej & potoków renderowania, 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 przez powiedzenie 10 operacji może zaoszczędzić znacznie więcej pracy w przypadku zmniejszenia cieniowania pikseli niż cieniowanie wierzchołka.

Jest to jeden z głównych powodów korzystania z cieniowania standardowego MRTK , ponieważ ten cieniowanie zazwyczaj wykonuje wiele mniej instrukcji na piksel & wierzchołku niż cień aparatu Unity Standard, jednocześnie osiągając porównywalne wyniki estetyczne.

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 do rysowania
Zarządzanie odzyskiwaniem pamięci Zmniejsz liczbę przezroczystych obiektów
Odwołania do pamięci podręcznej Unikaj efektów po przetwarzaniu/pełnoekranowym

Narysuj wywołanie instancingu

Jednym z najczęstszych błędów w środowisku Unity, które zmniejszają wydajność, jest klonowanie materiałów w czasie wykonywania. Jeśli obiekty GameObjects współużytkują ten sam materiał i/lub są tymi samymi siatkami, mogą być zoptymalizowane pod kątem pojedynczych wywołań rysowania za pomocą technik takich jak statyczne partie, dynamiczne partie i instancing procesora GPU. Jeśli jednak właściwości materiału renderera zostaną zmodyfikowane przez dewelopera w czasie wykonywania, środowisko 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 środowisko Unity utworzy nowy materiał w pamięci dla tego konkretnego modułu renderowania/obiektu GameObject. Każdy z 100 modułów będzie miał własny materiał i w związku z tym nie można ich scalić w jedno wywołanie rysowania, ale zamiast tego stanie się 100 żądaniami rysowania z procesora CPU do procesora GPU.

Aby pokonać tę przeszkodę i nadal przypisywać unikatowy kolor na moduł, deweloperzy powinni korzystać z 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 do wydajności aparatu Unity

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

W przypadku szacowania przybliżonego kompromisu wydajności między jednym cieniatorem a innym warto skompilować każdy cieniator 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 statystyk 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

Statystyka cieniowania standardowego aparatu Unity 1

Przykład statystyk cieniowania standardowego zestawu narzędzi MRTK

Standardowe statystyki cieniowania MRTK 2

Zobacz też

Unity

Windows Mixed Reality

Oculus

Optymalizacja siatki