Analizowanie formatów wierzchołków

Za pomocą profilowania klatek możesz zdiagnozować kilka możliwych problemów z wydajnością związanych z wierzchołkami. W panelu Polecenia możesz wyświetlić wszystkie wywołania rysowania, które gra wykonuje w danej klatce, oraz liczbę narysowanych elementów pierwotnych w każdym wywołaniu rysowania. Może to dać przybliżoną liczbę wierzchołków przesłanych w jednej klatce.

Widok profilowania klatki dla wywołania glDrawElements, po najechaniu kursorem na szczegóły parametrów wywołania rysowania
Rysunek 1. Widok profilowania klatek dla pojedynczegoglDrawElements połączenia, pokazujący 2718 narysowanych prymitywów trójkątnych

Kompresja atrybutów wierzchołków

Jednym z częstych problemów, z jakimi może się zmagać Twoja gra, jest duży średni rozmiar wierzchołka. Duża liczba wierzchołków przesłanych z dużym średnim rozmiarem wierzchołka powoduje dużą przepustowość odczytu pamięci wierzchołków, gdy są one odczytywane przez procesor graficzny.

Aby sprawdzić format wierzchołka dla danego wywołania rysowania, wykonaj te czynności:

  1. Wybierz interesujące Cię losowanie.

    Może to być typowe wywołanie rysowania sceny, wywołanie rysowania z dużą liczbą wierzchołków, wywołanie rysowania złożonego modelu postaci lub inny typ wywołania rysowania.

  2. Przejdź do panelu Pipeline (Potok) i kliknij IA (Input Assembly) w przypadku zestawu wejściowego. Określa format wierzchołków wchodzących do procesora graficznego.

  3. Obserwuj serię atrybutów i ich formatów, np. R32G32B32_SFLOAT to 3-elementowa 32-bitowa liczba zmiennoprzecinkowa ze znakiem.

Widok profilowania klatki dla zespołu wejściowego wywołania rysowania z nieskompresowanymi atrybutami wierzchołków.
Ilustracja 2. Zestaw danych wejściowych dla wywołania rysowania z nieskompresowanymi atrybutami, co daje rozmiar wierzchołka wynoszący 56 bajtów

Atrybuty wierzchołków można często skompresować przy minimalnym pogorszeniu jakości rysowanych modeli. Zalecamy w szczególności:

  • Kompresowanie pozycji wierzchołków do 16-bitowych liczb zmiennoprzecinkowych o połowicznej precyzji
  • Kompresowanie współrzędnych tekstury UV do 16-bitowych liczb całkowitych bez znaku
  • Kompresowanie przestrzeni stycznej przez kodowanie wektorów normalnych, stycznych i binormalnych za pomocą kwaternionów.

W przypadku typów o mniejszej precyzji mogą być też rozpatrywane inne atrybuty różne, ale w każdym przypadku indywidualnie.

Dzielenie strumienia Vertex

Możesz też sprawdzić, czy strumienie atrybutów wierzchołków są odpowiednio podzielone. W architekturach renderowania kafelkowego, takich jak mobilne procesory graficzne, pozycje wierzchołków są najpierw używane w procesie dzielenia na koszyki, aby utworzyć koszyki elementów pierwotnych przetwarzanych w każdym kafelku. Jeśli atrybuty wierzchołków są przeplatane w jednym buforze, wszystkie dane wierzchołków są odczytywane do pamięci podręcznej na potrzeby dzielenia na przedziały, mimo że używane są tylko pozycje wierzchołków.

Aby zmniejszyć przepustowość pamięci odczytu wierzchołków i zwiększyć wydajność pamięci podręcznej, a tym samym skrócić czas spędzony na etapie dzielenia na przedziały, dane wierzchołków należy podzielić na 2 osobne strumienie: jeden dla pozycji wierzchołków, a drugi dla wszystkich innych atrybutów wierzchołków.

Aby sprawdzić, czy atrybuty wierzchołka są odpowiednio podzielone:

  1. Wybierz interesujące Cię losowanie i zanotuj jego numer.

    Może to być typowe wywołanie rysowania sceny, wywołanie rysowania z dużą liczbą wierzchołków, wywołanie rysowania złożonego modelu postaci lub inny typ wywołania rysowania.

  2. Przejdź do panelu Pipeline (Potok) i kliknij IA (Input Assembly) w przypadku zestawu wejściowego. Określa format wierzchołków wchodzących do procesora graficznego.

  3. Obserwuj powiązania atrybutów wierzchołków. Zwykle rosną one liniowo (0, 1, 2, 3 itd.), ale nie zawsze tak jest. Pozycja wierzchołka jest zwykle pierwszym atrybutem wierzchołka na liście.

  4. W panelu Stan znajdź symbol LastDrawInfos i rozwiń pasujący numer losowania. Następnie rozwiń BoundVertexBuffers dla tego wywołania rysowania.

  5. Obserwuj bufory wierzchołków powiązane podczas danego wywołania rysowania, z indeksami pasującymi do powiązań atrybutów wierzchołków z wcześniejszego etapu.

  6. Rozwiń powiązania atrybutów wierzchołków wywołania rysowania i rozwiń bufory.

  7. Zwróć uwagę na VulkanHandle w przypadku buforów, które reprezentują pamięć bazową, z której pochodzą źródła danych wierzchołków. Jeśli VulkanHandle są różne, oznacza to, że atrybuty pochodzą z różnych buforów bazowych. Jeśli VulkanHandle są takie same, ale przesunięcia są duże (np. większe niż 100), atrybuty mogą nadal pochodzić z różnych podbuforów, ale wymaga to dalszego zbadania.

Widok profilowania klatek dla zestawu wejściowego i stanu wywołania rysowania pokazujący powiązany bufor wierzchołków
Ilustracja 3. Zestaw wejściowy dla wywołania rysowania, z panelem stanu po prawej stronie pokazującym, że atrybuty w powiązaniu 0 i 1, pozycja wierzchołka i wektor normalny, współdzielą jeden bufor bazowy

Więcej informacji o dzieleniu strumienia wierzchołków i sposobach rozwiązywania tego problemu w różnych silnikach gier znajdziesz w naszym poście na blogu.