Wydajność

Wprowadzenie

Najprostszym sposobem racjonalizacji wydajności jest wykorzystanie szybkość klatek lub to, ile razy aplikacja może renderować obraz na sekundę. Ważne jest, aby osiągnąć docelową szybkość klatek, jak opisano w przypadku platformy docelowej (tj. Windows Mixed Reality, Oculusitp.). Na przykład w HoloLens docelowa szybkość klatek to 60 MLD. Aplikacje o niskiej prędkości klatek mogą powodować pogorszenie jakości obsługi użytkowników, takich jak ustabilizowanie hologramów,śledzenie świata, śledzenie rąk i inne. Aby ułatwić deweloperom śledzenie i osiąganie wysokiej jakości szybkość klatek, zestaw narzędzi Mixed Reality Toolkit udostępnia różne narzędzia i skrypty.

Profiler wizualny

Aby stale śledzić wydajność przez cały okres projektowania, zdecydowanie zaleca się, aby zawsze wyświetlać wizualizację ze szybkośćą klatek podczas uruchamiania & debugowania aplikacji. Zestaw Mixed Reality Toolkit udostępnia narzędzie diagnostyczne Programu Visual Profiler, które dostarcza w czasie rzeczywistym informacje o bieżącym użyciu pamięci i urządzenia w widoku aplikacji. Program Visual Profiler można skonfigurować za pomocą narzędzia Diagnostics System Ustawienia w obszarze MrTK Profiles Inspector.

Ponadto szczególnie ważne jest, aby używać programu Visual Profiler do śledzenia szybkość klatek podczas uruchamiania na urządzeniu, w przeciwieństwie do uruchamiania w edytorze aparatu Unity lub emulatorze. Najbardziej dokładne wyniki wydajności będą przedstawione podczas uruchamiania na urządzeniu z kompilacjami konfiguracji wydania.

Uwaga

W przypadku kompilowania Windows Mixed Reality wdrożenia za pomocą kompilacji konfiguracji MASTER

Interfejs profilera wizualnego

Okno optymalizacji

Okno optymalizacji zestawu narzędzi MRTK oferuje informacje i narzędzia automatyzacji, które ułatwiają deweloperom rzeczywistości mieszanej konfigurowanie środowiska w celu najlepszego wykonywania wyników i identyfikowanie potencjalnych wąskich gardeł w scenie & zasobów. Niektóre kluczowe konfiguracje w a aparatu 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 z tradycyjnym opracowywaniem grafiki 3D, w tym że istnieją dwa ekrany (tj. dwa oczy), aby renderować 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 optymalizacji mrtk.

Okno optymalizacji MRTK Ustawienia

Unity Profiler

Profiler aparatu Unity jest przydatnym narzędziem do badania szczegółów wydajności aplikacji na poziomie klatek po ramce.

Czas spędzony na procesorze CPU

Przykładowy profil aparatu Unity Graph

Aby utrzymać wygodne szybkość klatek (zazwyczaj 60 klatek na sekundę), aplikacje muszą osiągnąć maksymalny czas klatek 16,6 milisekund czasu procesora CPU. Aby ułatwić identyfikację kosztów funkcji zestawu narzędzi 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

Po nazwie metody mogą być dostępne dodatkowe dane. Służy to do identyfikowania warunkowo wykonywanych, potencjalnie kosztownych funkcji, których mogą uniknąć niewielkie zmiany w kodzie aplikacji.

Przykład hierarchii 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ą pomóc w ustaleniu, czy problem z wydajnością jest związany z kodem aplikacji, czy z innego miejsca w systemie.

Zdecydowanie zaleca się, aby deweloperzy instrumentują kod aplikacji w podobny sposób. Podstawowe obszary fokusu instrumentacji kodu aplikacji znajdują się w procedurach obsługi zdarzeń, ponieważ te metody są obciążane pętlą aktualizacji mrTK w przypadku wywoływania zdarzeń. Duże czasy ramek w pętli aktualizacji MRTK mogą wskazywać na kosztowny kod w metodach obsługi zdarzeń.

Single-Pass renderowania wystąpienia

Domyślna konfiguracja renderowania dla XR w a aparatu Unity to Multi-pass. To ustawienie instruuje platformę Unity, aby wykonywała cały potok renderowania dwa razy, raz dla każdego oka. Można to zoptymalizować, wybierając zamiast tego renderowanie z wystąpieniem pojedynczego przebiegu. Ta konfiguracja wykorzystuje docelowe tablice renderowania, aby móc wykonać pojedyncze wywołanie rysowania, które wystąpienia do odpowiedniego obiektu docelowego renderowania dla każdego oka. Ponadto ten tryb umożliwia wykonywanie całego renderowania w jednym wykonaniu potoku renderowania. W związku z tym wybranie renderowania z pojedynczym przebiegu wystąpieniem jako ścieżki renderowania dla aplikacji rzeczywistości mieszanej może zaoszczędzić znaczną część czasu na procesorze & GPU i jest zalecaną konfiguracją renderowania.

Jednak w celu wystawienia pojedynczego wywołania rysowania dla każdej siatki dla każdego oka tworzenie procesora GPU musi być obsługiwane przez wszystkie cieniowania. Tworzenie sygnatur umożliwia procesorowi GPU multipleksowanie wywołań rysowania w obu oku. Wbudowane cieniowanie aparatu Unity oraz program do cieniowania MRTK Standard domyślnie zawierają niezbędne instrukcje dotyczące instancingu w kodzie modułu cieniującego. W przypadku pisania niestandardowych cieniowania dla aparatu Unity może być konieczne zaktualizowanie tych cieniowania w celu obsługi renderowania z wystąpieniem pojedynczego przebiegu.

Przykładowy kod 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

Unity udostępnia ustawienia wstępne do kontrolowania jakości renderowania dla każdego punktu końcowego platformy. Te ustawienia wstępne sterują tym, jakie funkcje graficzne można włączyć, takie jak cienie, anty aliasy, globalne i inne. Zaleca się obniżenie tych ustawień i zoptymalizowanie liczby obliczeń wykonywanych podczas renderowania.

Krok 1. Aktualizowanie projektów aparatu Unity rzeczywistości mieszanej w celu używania ustawienia poziomu niskiej jakości
Edytuj > Project Ustawienia pozycję , a następnie wybierz kategorię Jakości> wybierz pozycję Niska jakość dla platformy UWP

Krok 2. Dla każdego pliku sceny aparatu Unity wyłącz globalną w czasie rzeczywistym
Okno > Renderowanie > Oświetlenie Ustawienia > Usuń zaznaczenie globalnego pola wyboru w czasie rzeczywistym

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

W przypadku opracowywania dla platformy Windows Mixed Reality a w szczególności HoloLens włączanie udostępniania buforu głębokości w ramach funkcji XR Ustawienia może pomóc w ustabilizowaniu hologramów. Jednak przetwarzanie buforu głębokości może wiązać się z kosztami wydajności, szczególnie w przypadku korzystania z 24-bitowego formatu głębokości. Dlatego zdecydowanie zaleca się skonfigurowanie buforu głębokości do dokładności 16-bitowej.

Jeśli zrównuje się z powodu formatu dolnego bitu, upewnij się, że płaszczyzna klipu wszystkich aparatów jest ustawiona na najmniejszą możliwą wartość dla aplikacji. Unity domyślnie ustawia płaszczyznę klipu o wartości 1000 m. Na HoloLens płaszczyzna przycinania o 50 m jest zazwyczaj większa niż wystarczająca dla większości scenariuszy aplikacji.

Uwaga

W przypadku korzystania z 16-bitowego formatu głębokości wymagane efekty buforu wzornika nie będą działać, ponieważ w tym ustawieniu unity nie tworzy buforu wzornika. Wybranie formatu głębokości 24-bitowej zwykle spowoduje utworzenie 8-bitowego bufora wzornika, jeśli ma to zastosowanie na platformie grafiki punktu końcowego.

Jeśli używasz składnika Maskuj, który wymaga bufora wzornika, rozważ użycie zamiast niego funkcji RectMask2D, która nie wymaga bufora wzornika i w związku z tym może być używana w połączeniu z 16-bitowym formatem głębokości .

Uwaga

Aby szybko określić, które obiekty w scenie nie zapisują wizualnie do buforu głębokości, można użyć narzędzia Render Depth Buffer w obszarze edytora Ustawienia profilu konfiguracji mrTK.

Optymalizowanie danych siatki

Ustawienia Optymalizuj dane siatki próbują usunąć nieużywane atrybuty wierzchołków w aplikacji. Ustawienie wykonuje tę operację, uruchamiając każdy moduł cieniowania w każdym materiale, który znajduje się w każdej siatce w kompilacji. Jest to dobre w przypadku rozmiaru danych w grze i wydajności środowiska uruchomieniowego, ale może znacząco utrudnić czas kompilacji.

Zaleca się wyłączenie tego ustawienia podczas tworzenia i ponowne włączenie podczas tworzenia kompilacji głównej. To ustawienie można znaleźć w obszarze Edytuj > Project Ustawienia > Player Other Ustawienia Optimize Mesh Data > > (Optymalizacja danych siatki).

Zalecenia ogólne

Wydajność może być niejednoznaczny i stale zmieniającym się wyzwaniem dla deweloperów rzeczywistości mieszanej, a spektrum wiedzy na temat 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 ograniczona przez którykolwiek składnik. Mogą to być wąskie gardła obejmujące zarówno jednostki przetwarzania, jak i niektóre unikatowe scenariusze, które należy dokładnie zbadać. Jednak na początek dobrze jest zrozumieć, gdzie aplikacja jest wykonywana przez większość czasu.

Ograniczone procesory GPU

Ponieważ większość platform dla aplikacji rzeczywistości mieszanej korzysta z renderowania stereoskopowego,bardzo często jest to związane z procesorem GPU ze względu na charakter renderowania ekranu o "podwójnej szerokości". Fuoreore, mobilne platformy rzeczywistości mieszanej, takie jak HoloLens lub Oculus Quest, będą ograniczone przez procesory CPU klasy mobilnej & mocy obliczeniowej procesora GPU.

Podczas koncentrowania się na procesorze GPU zwykle istnieją dwa ważne etapy, które aplikacja musi ukończyć w każdej ramce.

  1. Wykonywanie cieniowania wierzchołków
  2. Wykonaj moduł cieniowania pikseli (znany również jako moduł cieniowania fragmentu)

Bez dogłębnego wgłębniania się w złożone pole grafiki komputerowej & renderowaniapotoków, każdy etap cieniowania jest programem uruchamianym na procesorze GPU w celu uzyskania następujących informacji.

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

W odniesieniu do dostrajania wydajności zwykle bardziej można skupić się na optymalizacji operacji w programie do cieniowania pikseli. Aplikacja może wymagać tylko narysowania sześcianu, który będzie zawierać tylko 8 wierzchołków. Jednak obszar ekranu zajmowany przez moduł jest prawdopodobnie w kolejności milionów pikseli. W związku z tym zmniejszenie kodu cieniowania o powiedzmy 10 operacji może zaoszczędzić znacznie więcej pracy w przypadku zmniejszenia cieniowania pikseli niż program do cieniowania wierzchołków.

Jest to jeden z głównych powodów korzystania z modułu cieniującego MRTK Standard, ponieważ ten moduł cieniowania wykonuje o wiele mniej instrukcji na piksel & wierzchołka niż moduł cieniujący Unity Standard, jednocześnie uzyskując porównywalne wyniki dotyczące wyglądu.

Optymalizacje procesora CPU Optymalizacje procesora GPU
Logika symulacji aplikacji Operacje renderowania
Upraszczanie fizyki Zmniejszanie obliczeń oświetlenia
Upraszczanie animacji Zmniejszanie liczby wielokątów & liczby obiektów rysować
Zarządzanie odzyskiwaniem pamięci Zmniejszanie liczby obiektów przezroczystych
Odwołania do pamięci podręcznej Unikanie efektów przetwarzania po przetwarzaniu/na pełnym ekranie

Rysowanie wywołania 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 GameObject mają ten sam materiał i/lub mają tę samą siatkę, można je zoptymalizować do wywołań pojedynczego rysowania za pomocą technik, takich jak statyczne przetwarzanie wsadowe, dynamiczne przetwarzanie wsadowe i tworzenie tworzenia procesora GPU. Jeśli jednak deweloper zmodyfikuje właściwości materiału programu renderującego 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ć do każdego z nich unikatowy kolor w czasie wykonywania. Dostęp do właściwości renderer.material.color w języku C# spowoduje, że unity utworzy nowy materiał w pamięci dla tego konkretnego programu renderowego/GameObject. Każdy ze 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 wywołań rysowania od procesora CPU do procesora GPU.

Aby pokonać tę przeszkodę i nadal przypisywać unikatowy kolor do każdego modułu, deweloperzy powinni korzystać z właściwości 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

Unity udostępnia doskonałe narzędzia do wydajności wbudowane w edytor.

W przypadku szacowania wstępnych kompromisów wydajności między jednym cieniem i innym warto skompilować każdy moduł cieniowania i wyświetlić liczbę operacji na etap 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: Uzyskane wyniki statystyczne mogą się różnić w zależności od tego, jakie funkcje zostały włączone w materiałach korzystających z danego cieniowania. Unity skompiluje tylko warianty cieniowania używane bezpośrednio w bieżącym projekcie.

Przykład statystyk modułu cieniowania standardowego aparatu Unity

Unity Standard Shader Statistics 1

Przykład standardowej statystyki modułu cieniowania zestawu narzędzi MRTK

MrTK Standard Shader Statistics 2

Zobacz też

Unity

Windows Mixed Reality

Oculus

Optymalizacja siatki