Samsung Galaxy XR is here, powered by Android XR! Ten post na blogu jest częścią Tygodnia wyróżnienia Androida XR, podczas którego udostępniamy materiały – posty na blogu, filmy, przykładowy kod i inne – które pomogą Ci poznać Androida XR, tworzyć aplikacje na tę platformę i przygotowywać je do działania.
W tym tygodniu firma Samsung wprowadziła na rynek urządzenie Galaxy XR, które powstało we współpracy z Google i Qualcomm. To ekscytujący czas dla deweloperów, dlatego chcemy pomóc Ci uzyskać jak najlepszą wydajność aplikacji XR.
Niska wydajność gier i aplikacji na urządzeniach innych niż XR może być frustrująca dla użytkownika, ale w świecie XR wydajność nie jest tylko opcjonalna – jest kluczowa dla sukcesu aplikacji. Jeśli nie osiągniesz docelowej liczby klatek w XR, może to spowodować znacznie poważniejsze problemy, takie jak choroba lokomocyjna.
W tym przewodniku omówimy najważniejsze optymalizacje wydajności, które musisz poznać, aby tworzyć aplikacje na Androida XR. Dowiesz się, które funkcje zapewniają największy wzrost wydajności, kiedy ich używać i jak działają razem, aby pomóc Ci osiągnąć docelową liczbę klatek.
Oto nasze cele:
- Minimalna: 72 kl./s (część naszych wskazówek dotyczących jakości odtwarzania)
- Opcjonalnie: 90 kl./s z budżetem 11 ms na klatkę.
Więcej informacji o tym, dlaczego utrzymanie tak wysokiej liczby klatek jest ważne, znajdziesz w naszych wytycznych dotyczących wydajności.
Funkcje wydajnościowe związane z XR
Zaczniemy od omówienia 2 funkcji zwiększających wydajność, które są dostępne tylko w XR: renderowania foveated i podpróbkowania Vulkan.
Renderowanie foveated
Renderowanie foveated to optymalizacja, która ma 2 tryby. Pierwszy to tryb statyczny, który renderuje środek ekranu w wyższej rozdzielczości i stopniowo obniża rozdzielczość w miarę oddalania się od środka.
Drugi to tryb śledzenia wzroku, który renderuje obszar, na który patrzysz, z pełnymi szczegółami, jednocześnie obniżając jakość obrazu wyświetlanego w polu widzenia peryferyjnego. Zasadniczo naśladuje to sposób działania ludzkiego wzroku, który pozwala nam widzieć drobne szczegóły tylko w obszarze, na którym się skupiamy.
Renderowanie foveated znacznie zmniejsza obciążenie GPU bez pogarszania postrzeganej przez użytkownika jakości obrazu. Zaletą renderowania foveated jest to, że użytkownicy nie zauważą obniżonej jakości w widzeniu peryferyjnym, ale GPU z pewnością odnotuje poprawę wydajności.
Wyobraź sobie, że tworzysz wystawę muzealną ze skomplikowanymi artefaktami 3D. Bez renderowania foveated trudno byłoby utrzymać 90 kl./s, próbując renderować wszystko w polu widzenia. Dzięki renderowaniu foveated możesz zachować szczegóły o wysokiej liczbie wielokątów tam, gdzie patrzy użytkownik, ale środowisko w tle jest renderowane w niższej jakości. Użytkownicy nie zauważą różnicy, ale Ty zyskasz możliwość dodania do sceny większej liczby szczegółów.
Podpróbkowanie Vulkan
Podpróbkowanie Vulkan jest najlepszym przyjacielem renderowania foveated. Podczas gdy renderowanie foveated decyduje o tym, co renderować na różnych poziomach jakości, podpróbkowanie Vulkan określa, jak efektywnie renderować różne poziomy jakości za pomocą map gęstości fragmentów.
W połączeniu z renderowaniem foweacyjnym podpróbkowanie Vulkan zapewnia dodatkowe 0, 5 ms wydajności. Pomaga też wygładzić poszarpane krawędzie w widzeniu peryferyjnym, dzięki czemu cały obraz wygląda wyraźniej.
Na przykład w symulatorze lotu, w którym użytkownicy skupiają się na przyrządach i elementach sterujących, połączenie renderowania foveated z podpróbkowaniem Vulkan oznacza, że szczegółowe elementy sterujące są renderowane ostro, ale struktura kokpitu peryferyjnego zużywa mniej zasobów. Te dodatkowe 0,5 ms nie wydaje się dużą różnicą, ale może decydować o tym, czy znajdzie się miejsce na dodatkowy element interaktywny, czy też w intensywnych momentach będą gubione klatki.
Funkcje GPU do złożonych scen
Oprócz renderowania foveated i podpróbkowania Vulkan istnieją pewne funkcje GPU, które zmniejszają niepotrzebne obciążenie dzięki inteligentnemu tworzeniu instancji i odrzucaniu. Są one szczególnie skuteczne w przypadku złożonych scen z powtarzającą się geometrią lub znaczną okluzją.
GPU Resident Drawer
GPU Resident Drawer automatycznie używa instancji GPU, aby zmniejszyć liczbę wywołań rysowania i zwolnić czas procesora. Zamiast więc informować GPU o każdym obiekcie osobno, CPU grupuje podobne obiekty.
Ta funkcja jest najbardziej skuteczna w przypadku dużych scen z powtarzającymi się siatkami, takich jak drzewa w lesie, meble w biurowcu czy rekwizyty rozrzucone w otoczeniu.
Wyobraź sobie scenę w lesie z 200 drzewami, które mają tę samą siatkę podstawową. Bez GPU Resident Drawer masz 200 wywołań rysowania, które obciążają GPU, co odciąża CPU. Gdy włączysz tę funkcję, GPU będzie inteligentnie tworzyć instancje tych drzew, co powinno zmniejszyć liczbę wywołań rysowania do 5–10. To ogromna oszczędność mocy GPU, którą można wykorzystać na logikę rozgrywki lub obliczenia fizyki.
Odrzucanie obiektów zasłoniętych przez GPU
Odrzucanie zasłoniętych obiektów przez GPU wykorzystuje GPU zamiast CPU do identyfikowania i pomijania renderowania ukrytych obiektów. Automatycznie wykrywa, co jest zasłonięte (ukryte) za innymi obiektami, dzięki czemu nie marnujesz zasobów GPU na rzeczy, których użytkownik nie widzi.
Ta funkcja jest szczególnie przydatna we wnętrzach z wieloma pomieszczeniami, w gęsto zabudowanych środowiskach lub w scenach architektonicznych, w których ściany, podłogi i obiekty naturalnie blokują widok.
Załóżmy, że tworzysz środowisko Multi-room. Gdy użytkownik jest w salonie, po co marnować cykle GPU na renderowanie szczegółowej kuchni, która jest całkowicie ukryta za ścianą? Odrzucanie obiektów zasłoniętych przez GPU automatycznie pomija renderowanie ukrytych obiektów, co pozwala przeznaczyć więcej budżetu wydajności na to, co jest faktycznie widoczne.
Monitorowanie skuteczności
Samo korzystanie z tych funkcji nie wystarczy. Musisz też mierzyć skuteczność optymalizacji, aby móc określić ilościowo ich wpływ i sprawdzić, czy zmiany rzeczywiście działają.
Performance Metrics API
Interfejs Performance Metrics API umożliwia monitorowanie w czasie rzeczywistym wykorzystania pamięci przez aplikacje oraz wydajności procesora i GPU. Zapewnia on kompleksowe dane z warstw kompozytora i środowiska wykonawczego, dzięki czemu możesz dokładnie zobaczyć, co dzieje się w aplikacji.
Przed wprowadzeniem zmian ustal punkt odniesienia, zastosuj optymalizację, zmierz jej wpływ i powtórz proces. Dzięki temu podejściu opartemu na danych wiesz, że rzeczywiście poprawiasz skuteczność, a nie tylko zgadujesz.
Przed włączeniem renderowania foveated czas renderowania klatki przez GPU może wynosić 13 ms, co przekracza budżet 11 ms. Włącz renderowanie foveated, zmierz ponownie i miej nadzieję, że spadnie do 9 ms. To 4 ms, które możesz wykorzystać na dodanie szczegółów do sceny, poprawę jakości obrazu w innych miejscach lub po prostu zapewnienie płynniejszego działania w przypadku szerszego zakresu treści.
Bez tych danych optymalizujesz na ślepo. Interfejs Performance Metrics API dostarcza rzetelnych informacji o tym, co faktycznie pomaga w konkretnym przypadku użycia.
Debuger klatek
Frame Debugger to wbudowane narzędzie Unity, które pozwala dokładnie zrozumieć, jak renderowana jest scena, klatka po klatce. Pokazuje sekwencję wywołań rysowania i umożliwia ich przechodzenie, aby sprawdzić, czy optymalizacje działają prawidłowo.
Chcesz sprawdzić, czy SRP Batcher działa? W debugerze klatek poszukaj wpisów „RenderLoopNewBatcher”. Sprawdzanie, czy GPU Resident Drawer prawidłowo grupuje dane? Poszukaj wpisów „Hybrid Batch Group”. Te wizualne potwierdzenia pomogą Ci sprawdzić, czy ustawienia optymalizacji rzeczywiście działają.
Przejrzyj pierwsze 50 wywołań rysowania w scenie. Jeśli widzisz, że podobne obiekty są rysowane pojedynczo, a nie grupowo, oznacza to, że instancjonowanie lub grupowanie nie działa prawidłowo. Narzędzie do debugowania klatek natychmiast uwidacznia te problemy, dzięki czemu możesz je rozwiązać.
Dodatkowe optymalizacje
Oprócz optymalizacji, które opisaliśmy powyżej, nasz pełny przewodnik po skuteczności zawiera też kilka innych dodatkowych optymalizacji. Oto krótkie podsumowanie:
- Ustawienia URP: wyłącz HDR i przetwarzanie końcowe w przypadku XR na urządzeniach mobilnych. Te funkcje mają minimalny wpływ na wygląd w porównaniu z kosztem wydajności na sprzęcie mobilnym, dzięki czemu uzyskasz wymierne korzyści pod względem wydajności przy ledwo zauważalnych różnicach wizualnych.
- SRP Batcher: zmniejsza obciążenie procesora w przypadku scen z wieloma materiałami, które używają tego samego wariantu cieniowania. Minimalizując zmiany stanu renderowania między wywołaniami rysowania, możesz znacznie skrócić czas pracy procesora poświęcany na renderowanie.
- Częstotliwość odświeżania wyświetlacza: dynamicznie dostosowuje się w zakresie od 72 do 90 kl./s w zależności od złożoności sceny. Zmniejsz liczbę klatek podczas złożonych sekwencji, aby zachować stabilność, a następnie zwiększ ją w prostszych momentach, aby zapewnić płynną interakcję.
- Tekstury głębi/nieprzezroczyste: wyłącz je, chyba że są potrzebne do efektów cieniowania. Powodują niepotrzebne operacje kopiowania GPU, które marnują wydajność, nie przynosząc korzyści w przypadku większości aplikacji.
- Skala renderowania URP: to ustawienie umożliwia renderowanie w niższej rozdzielczości w celu zwiększenia wydajności lub w wyższej rozdzielczości w celu poprawy jakości obrazu.
Szczegółowe instrukcje dotyczące tych i innych optymalizacji znajdziesz w naszym pełnym przewodniku po wydajności Unity na Androidzie XR.
Podsumowanie
Wydajność aplikacji XR to nie tylko kwestia techniczna. To różnica między wygodnym, angażującym doświadczeniem a takim, które wywołuje u użytkowników mdłości lub dyskomfort. Omówione przez nas optymalizacje to zestaw narzędzi, który pomoże Ci osiągnąć kluczowe cele dotyczące liczby klatek na sekundę na najnowszych urządzeniach z XR.
Oto plan działania:
- Zacznij od renderowania foveated i podpróbkowania Vulkan. Te funkcje XR zapewniają natychmiastowe i zauważalne oszczędności GPU.
- Jeśli masz złożone sceny z powtarzającą się geometrią lub przestrzeniami wewnętrznymi, dodaj GPU Resident Drawer i Occlusion Culling.
- Monitoruj wszystko za pomocą interfejsu Performance Metrics API, aby mieć pewność, że zmiany rzeczywiście pomagają.
- Poznaj dodatkowe optymalizacje URP, które pozwolą Ci zwiększyć wydajność
Ważne jest, aby stale mierzyć i ulepszać. Nie każda optymalizacja przyniesie takie same korzyści w każdym projekcie, dlatego użyj interfejsu Performance Metrics API, aby dowiedzieć się, co faktycznie pomaga w konkretnym przypadku użycia.
Co dalej: rozwijanie umiejętności
Chcesz dowiedzieć się więcej? Zapoznaj się z tymi materiałami:
- Przewodnik po wydajności Unity na Androidzie XR – szczegółowe instrukcje implementacji wszystkich funkcji opisanych tutaj.
- Pierwsze kroki z Unity i Androidem XR – skonfiguruj środowisko programistyczne i zacznij tworzyć.
- Dokumentacja dla deweloperów Androida XR – szczegółowe przewodniki po wszystkich funkcjach Androida XR.
-
Wiadomości o usłudzeZ przyjemnością informujemy, że oficjalna obsługa silników Unreal Engine i Godot jest już dostępna na Androidzie XR. Wprowadzamy też nowe narzędzia, które mają zwiększyć produktywność i umożliwić korzystanie z nowych funkcji XR: Android XR Engine Hub i Android XR Interaction Framework.
Luke Hopkins, Ryan Bartley • Czas czytania: 4 min -
Wiadomości o usłudzeDzisiaj, podczas Android Dev Summit, ogłaszamy szeroką dostępność wielu narzędzi i interfejsów API, które mają na celu usunięcie codziennych problemów i zapewnienie większej elastyczności podczas tworzenia świetnych aplikacji na Androida.
Matthew McCullough • Czas czytania: 4 min -
Wiadomości o usłudzeAndroid Studio Rabbit 2 jest teraz stabilny i gotowy do użycia w środowisku produkcyjnym. Ta wersja zawiera kluczowe funkcje, które ułatwią Ci programowanie, takie jak Bring Your Own Agent, nowe funkcje emulatora XR, aktualizacja LeakCanary, nowe narzędzie do zarządzania umiejętnościami agenta, inspekcja kodu przez AI i inne.
Matthew Warner • Czas czytania: 3 min
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.