Materiały i shadery

Postępuj zgodnie z tymi sprawdzonymi metodami, aby zoptymalizować wykorzystanie materiałów i cieniatorów w grze na Androida.

Materiały i cieniowanie to podstawowe elementy nowoczesnej sztuki 3D. Gry 3D, które działają dobrze na największej liczbie urządzeń, zaczynają się od grafiki 3D, która została tak zaprojektowana z myślą o jak najlepszym wykorzystaniu procesorów graficznych. W tym przewodniku omawiamy optymalizację materiałów i cieniowania na urządzeniach mobilnych oraz sprawdzone metody, dzięki którym możesz zwiększyć wydajność gry i zminimalizować zużycie energii.

Część tego artykułu została przygotowana na podstawie pracy współtworzonej przez Arm Limited.

cieniowanie przyjazne dla urządzeń mobilnych silnika gry

Mechanizmy gier różnią się sposobem, w jaki łączą materiały z cieniowaniem. Silnik Unity może utworzyć wiele programów do cieniowania, ale do każdego materiału może być przypisany tylko jeden cieniowanie. Unreal Engine 4 może stosować różne cieniowanie do materiału w zależności od platformy docelowej.

Definicję programów do cieniowania i materiałów do cieniowania znajdziesz w artykule o sprawdzonych metodach dotyczących materiałów i cieniowania dla wykonawców.

Jeśli używasz silnika gry, takiego jak Unity czy Unreal Engine 4, użyj wbudowanych cieniowań pod kątem sprzętu mobilnego. Obejmują one uproszczone implementacje funkcji zwiększające wydajność na urządzeniach mobilnych. W miarę możliwości podczas konfigurowania materiałów wyłącz funkcje, których nie używasz. Mogą to być na przykład zabarwienie kolorów lub mapy szczegółów. Wyłączenie nieużywanych funkcji umożliwia silnikowi pominięcie ich w ostatecznym programie cieniowania, co poprawi wydajność.

Jedność

Unity zawiera wiele silników renderowania. W przypadku nowoczesnych gier mobilnych najlepszą opcją jest Universal Render Pipeline (URP). URP zawiera standardowy zestaw narzędzi do cieniowania, które automatycznie skalują się w zakresie złożoności w zależności od platformy docelowej. Starsze mechanizmy renderowania Unity zawierają kolekcję programów do cieniowania, które są przeznaczone na platformy mobilne. Te moduły do cieniowania należą do kategorii Urządzenia mobilne.

Unreal Engine 4

Mechanizm Unreal Engine wybierze mobilny program do cieniowania na podstawie wybranej platformy docelowej. Wizualne dane wyjściowe z mobilnych programów do cieniowania mogą się różnić od domyślnego cieniowania Model 5. Możesz zmienić poziom renderowania w edytorze Unreal, aby symulować dane wyjściowe renderowania przez mobilne cieniowanie. Pomimo pewnych różnic w przypadku materiałów na wszystkich platformach Unreal wykorzystuje ten sam proces w przypadku materiałów, więc cieniowanie dla urządzeń mobilnych zwykle ma podobny wygląd i sposób działania co domyślne.

Ustawianie renderowania podglądu na urządzeniach mobilnych w edytorze Unreal
Rysunek 1. Ustaw renderowanie podglądu na urządzeniach mobilnych w edytorze Unreal.

Minimalizuj próbkowanie tekstur

Gry kierowane na urządzenia mobilne powinny używać jak najmniejszej liczby tekstur w swoich materiałach. Każda dodana tekstura wymaga dodatkowego próbkowania tekstur, co zużywa przepustowość pamięci i zwiększa zużycie energii. Unreal Engine 4 zaleca maksymalnie 5 tekstur materiałowych do użytku na urządzeniach mobilnych. Nawet 5 próbek tekstur może być zbyt kosztowny w przypadku szerokiego zastosowania na wielu urządzeniach. Strategie minimalizacji liczby próbek tekstur:

  • Użyj uporządkowania tekstur, aby połączyć tekstury jednokanałowe. Więcej informacji o tej technice znajdziesz w przewodniku po teksturach.
  • Zamiast danych dotyczących takich parametrów jak chropowatość czy metaliczny charakter możesz zastąpić stałą liczbową, zamiast odczytywać dane z tekstury.
  • Aby pominąć tekstury potrzebne do obsługi obliczeń w bardziej skomplikowanych modelach oświetlenia, użyj nieoświetlonego cienia lub prostego modelu oświetlenia.

Wyłączaj oświetlenie, gdy to możliwe

Kolory rozświetlone i nieoświetlone to powszechny podział na cieniowanie i materiały. Oświetlenie w czasie rzeczywistym wymaga dodatkowych obliczeń w shaku. W zależności od typu zaimplementowanego systemu oświetleniowego mogą być potrzebne tekstury materiałowe, które wykorzystują więcej miejsca w pamięci i większą przepustowość łącza. W przypadku gier mobilnych, a zwłaszcza takich, które są kierowane na mniej wydajny sprzęt, ograniczenie wykorzystania oświetlenia w czasie rzeczywistym jest ważne dla uzyskania optymalnej wydajności. Staraj się projektować pod kątem grafiki, które dobrze sprawdzają się bez oświetlenia w czasie rzeczywistym, np. grafiki stylizowanej lub kreskówkowej.

Porównanie modelu renderowanego z oświetleniem i bez niego.
Rysunek 2. Przykład renderowania modelu z oświetleniem w czasie rzeczywistym (po lewej) i bez oświetlenia w czasie rzeczywistym (po prawej).

Zminimalizuj wykorzystanie przejrzystości

W miarę możliwości używaj nieprzezroczystych materiałów. Renderowanie obiektu z przezroczystością jest zawsze droższe niż jego odpowiednik nieprzezroczysty. Konstrukcja sprzętu do grafiki mobilnej sprawia, że przezroczystość jest stosunkowo droższa w obsłudze niż na komputerach i konsolach do gier. Rysowanie w grze wielu przezroczystych obiektów, zwłaszcza renderowanych na sobie, źle wpływa na wydajność.

Wielokrotne rysowanie tego samego piksela jest określane jako przerysowywanie. Należy unikać nakładania wielu warstw przezroczystości. Wiele gier ma narzędzia diagnostyczne do wizualizacji przerysowania, aby pomóc w wykryciu i wyeliminowaniu problemu. Te narzędzia pomogą Ci zwiększyć wydajność gry i zidentyfikować obszary, w których występują problemy, które powodują spadek liczby klatek.

Przykład narzędzia do wizualizacji przeciągnięcia w edytorze Unity
Rysunek 3. Przykład narzędzia do wizualizacji przeciągnięć w edytorze Unity.
Przykład narzędzia do wizualizacji przeciągnięcia w edytorze Unreal
Rysunek 4. Przykład narzędzia do wizualizacji przeciągnięcia w edytorze Unreal.

Użyj odpowiedniej metody alfa.

Najpopularniejszymi metodami implementacji przejrzystości są mieszanie alfa i testy alfa.

W ramach testów alfa materiał obiektu jest w 100% nieprzezroczysty lub przezroczysty. Możesz skonfigurować próg wartości alfa dla tego odcięcia. W Unity ten rodzaj przezroczystości nosi nazwę Wytnij. W Unreal Engine 4 jest to tryb mieszania Zamaskowany.

Mieszanie alfa zapewnia materiałowi obiektu szeroki zakres przezroczystości i może sprawić, że obiekt będzie wyglądać na częściowo przezroczysty. W Unity ten rodzaj przejrzystości określa się jako przezroczysty. W Unreal Engine 4 nazywa się on tryb mieszania przezroczysty.

Porównanie mieszania alfa i testów alfa
Rysunek 5. Przykładowy obraz (po lewej) wyrenderowany za pomocą mieszania alfa (w środku) i testów alfa (po prawej).

Mieszanie alfa daje zwykle lepszy wygląd niż testy alfa. Jednak w przypadku niektórych rodzajów siatek, np. liści, mieszanie alfa może wyglądać dziwnie, gdy siatka jest ruchoma. Problem ten wynika z perspektywy, że liście i gałęzie są renderowane w niewłaściwej kolejności. Testy alfa minimalizują ten efekt, kosztem zwiększonego aliasu i ostrych krawędzi na liściach i gałęziach.

Mieszanie alfa i testowanie alfa mogą zająć inny czas, zanim ta sama siatka jest wyrenderowana. W przypadku sieci typu mesh, w których jeden z trybów zapewnia akceptowalny wynik wizualny, należy sprawdzić, czy któraś z metod jest skuteczniejsza od drugiej.

Złożoność programu do cieniowania profilu

Funkcje renderowania, takie jak próbkowanie tekstur, oświetlenie i przezroczystość, zwiększają złożoność cieniowania i zmniejszają wydajność renderowania. Do oceny złożoności cieniowania możesz użyć narzędzi wbudowanych w silniki gier oraz zewnętrznych narzędzi graficznych.

Unreal Engine 4 zawiera tryb widoku ShaderZłożoność, który pozwala oszacować koszty obiektów w danej scenie.

Tryb widoku złożoności cieni w edytorze Unrealistycznymi
Rysunek 6. Tryb widoku Shader Complexity w edytorze Unreal.

Możesz też skorzystać z funkcji Statystyki materiału w Unreal, aby profilować koszty materiałów w miarę ich tworzenia.

Statystyki dotyczące materiału wyświetlają się w edytorze Unreal
Rysunek 7. W edytorze Unreal pojawią się Statystyki dotyczące materiału.

Oblicz w cieniowaniu wierzchołków

Obliczenia cieniowania renderowania są zwykle dzielone między cieniowanie wierzchołków i fragment (nazywany też pikselem). Liczba renderowanych fragmentów będzie zwykle większa od liczby wierzchołków. Jeśli w cieniowaniu wierzchołków można wykonywać kosztowne obliczenia, będą one wykonywane rzadziej niż w tym programie.

Jeśli jednak dane te są zużywane przez cieniowanie fragmentów, muszą zostać przekazane z tego modułu. Jeśli ilość przesyłanych danych jest zbyt duża, wykonanie obliczeń w narzędziu do cieniowania fragmentów może przynieść wyższą wydajność. Do oceny wykorzystania kafelków możesz użyć narzędzi do profilowania, aby określić optymalną lokalizację programu do cieniowania dla zbioru obliczeń. Unreal Engine 4 udostępnia funkcję niestandardowych promieni UV, która może pomóc w profilowaniu.

Unikaj kosztownych działań matematycznych

Operacje matematyczne są używane w programach do cieniowania do kontrolowania zachowania i wyglądu danych wyjściowych programu. Typowe działania to arytmetyka, potęga, piętro, logarytm itp. Operacje matematyczne nie są sobie równe w obliczu ich kosztów obliczeniowych. Program do cieniowania wypełniony kosztownymi operacjami będzie działać wolniej, zwłaszcza na starszych urządzeniach. Przykłady stosunkowo niedrogich operacji:

  • Dodawanie
  • Odejmowanie
  • Mnożenie

Droższe operacje to między innymi:

  • Oddział
  • Cechy transcendentalne (sin, cos, power, log, tan)

Częsta skuteczność profilu

wąskie gardła wydajności nie zawsze są oczywiste. Nie zakładaj, gdzie znajdują się problematyczne obszary, i do oceny wydajności renderowania używaj narzędzi do profilowania. Wykonaj wszystkie testy przed i po każdej optymalizacji, aby dokładnie ocenić jej wpływ.