szacowanie czasu przetwarzania ramek przez procesor i procesor graficzny;

Oszacowanie czasu przetwarzania klatek przez procesor i procesor graficzny (czas renderowania) jest niezbędne do zrozumienia wydajności aplikacji i znalezienia wąskich gardeł. Gdy profilujesz aplikację za pomocą AGI, narzędzie System Profiler udostępnia dane śledzenia, których możesz użyć do oszacowania czasu wyświetlania klatek.

Czasy procesora

W AIGI możesz wyświetlić łączny i aktywny czas procesora na klatkę na ścieżce procesora w profilu systemu.

Łączny czas pracy procesora

Aby zmierzyć łączny czas procesora, wybierz zakres czasu, który obejmuje czas między kolejnymi zdarzeniami przesyłania klatek. Zdarzenia przesyłania klatek to eglSwapBuffers (w przypadku OpenGL) i vkQueuePresentKHR (w przypadku Vulkan).

Zrzut ekranu pokazujący zdarzenia eglSwapBuffer.
Rysunek 1. Czas między 2 zdarzeniami eglSwapBuffer.


Zrzut ekranu pokazujący zdarzenie vkQueuePresentKHR.
Rysunek 2. Czas między 2 zdarzeniami vkQueuePresentKHR.

Ten pomiar to szacowany łączny czas pracy procesora,ale niekoniecznie jest to czas aktywnej pracy procesora. Na przykład w przypadku aplikacji korzystających z GPU procesor może czekać na GPU, aż wykona ono swoje zadanie, zanim prześle nową klatkę. Często zdarza się to, gdy zdarzenie dequeueBuffer, eglSwapBuffer (w przypadku OpenGL) lub vkQueuePresent (w przypadku Vulkan) zajmuje dużą część czasu procesora. Czas oczekiwania jest uwzględniany w łącznym czasie pracy procesora, ale nie w aktywnej pracy procesora.

Zrzut ekranu pokazujący dużą ilość czasu bezczynności podczas zdarzeń dequeueBuffer i eglSwapBuffer.
Rysunek 3. Duży udział procesora w czasie zdarzeń dequeueBuffereglSwapBuffer.

Aktywny czas pracy procesora

Aktywny czas procesora określa, kiedy procesor wykonuje kod aplikacji bez bycia w stanie bezczynności.

Aby zmierzyć aktywny czas procesora, wyświetl wycinki W trakcie wykonywania tuż nad zdarzeniami procesora. Zlicz wszystkie fragmenty śladu między 2 zdarzeniami przesyłania ramek, które mają stan W trakcie wykonywania. Pamiętaj, aby dołączyć działające wątki.

Zrzut ekranu przedstawiający 2 okresy czasu procesora, które można wykorzystać do pomiaru aktywnego czasu procesora.
Rysunek 5. 2 okresy czasu procesora, które można wykorzystać do pomiaru aktywnego czasu procesora.


Zrzut ekranu aplikacji wielowątkowej, która ma inne wątki robocze, gdy wątek główny jest nieaktywny.
Rysunek 6. Aplikacja wielowątkowa, która ma inne wątki robocze, gdy wątek główny jest nieaktywny.

Innym sposobem pomiaru aktywnego czasu procesora jest wyświetlanie fragmentów aplikacji w śladach procesora. Te słupki wskazują, kiedy działa procesor i odpowiadają słupkom Uruchomiony.

Zrzut ekranu pokazujący stan działania przypiętego wątku, który odpowiada śledzeniu procesora.
Rysunek 7. Stan działania przypiętego wątku jest zgodny z wykorzystaniem procesora.

Aby ułatwić identyfikację fragmentów aplikacji, możesz dodać do niej znaczniki ATrace. Dzięki temu będą się one wyświetlać na ścieżce CPU w profilu systemowym.

Zrzut ekranu przedstawiający fragmenty ATrace na ścieżce CPU.
Rysunek 8. Fragmenty śladu na ścieżce procesora.

Szacowanie czasu renderowania klatek przez GPU

Aby oszacować czasy generowania klatek przez GPU, możesz użyć w profilu systemu fragmentów GPU lub liczników GPU. Szacowanie jest dokładniejsze, gdy używasz segmentów GPU.

Segmenty GPU

Jeśli w profilu systemu są dostępne informacje o układzie GPU, możesz uzyskać bardzo dokładne informacje o czasie renderowania klatki przez GPU, mierząc łączny czas, jaki aplikacja poświęca na wykonywanie zadań związanych z pojedynczą klatką.

Urządzenia Mali

Na urządzeniach Mali fragmenty GPU zawierają ścieżki fragmentu, niefragmentu i czasami dodatkowego niefragmentu. W przypadku mniej złożonych klatek praca związana z fragmentem i poza fragmentem jest wykonywana sekwencyjnie, więc można odróżnić pracę jednej ramki od drugiej, szukając przerw między aktywnymi działaniami GPU.

Jeśli znasz zadanie przesyłane do GPU, możesz zidentyfikować wzór przesłanych przejść renderowania, aby uzyskać informacje o tym, kiedy zaczyna się i kończy dany kadr.

Zrzut ekranu przedstawiający wiele klatek wykonywanych kolejno.
Rysunek 9. Wiele klatek wykonywanych kolejno.
Zrzut ekranu przedstawiający powiększony widok pracy AGI na pojedynczym ujęciu.
Rysunek 10. Powiększony pojedynczy kadr.

W przypadku aplikacji, które mają bardziej równoległy proces GPU, możesz uzyskać czasy renderowania klatek przez GPU, wyszukując w panelu Wybór dla każdego wycinka wszystkie klatki, które mają ten sam identyfikator submissionID.

W przypadku aplikacji opartych na Vulkan do tworzenia klatki można używać wielu przesłanych danych. Śledź identyfikatory przesyłania za pomocą ścieżki Zdarzenia Vulkan, która zawiera wycinek dla każdej przesyłanej treści. Po wybraniu sekcji przesłania zostaną wyróżnione wszystkie sekcje aktywności GPU, które odpowiadają przesłaniu.

Zrzut ekranu pokazujący równoległe przetwarzanie przez GPU, gdzie praca nad jedną klatką może nakładać się na pracę nad inną.
Rysunek 11. równoległe obciążenie GPU, w którym praca nad jedną klatką może nakładać się na pracę nad inną.


Zrzut ekranu pokazujący kilka zdarzeń Vulkan wybranych dla danego klatki.
Rysunek 12. Kilka zdarzeń Vulkan wybranych dla ramki.

Urządzenia z procesorami Adreno

Na urządzeniach z procesorem Adreno fragmenty GPU pojawiają się w śladzie GPU Queue 0 i są zawsze reprezentowane sekwencyjnie, dzięki czemu możesz przeglądać wszystkie fragmenty, które reprezentują przejścia renderowania dla klatki, i wykorzystywać je do pomiaru czasu renderowania klatki przez GPU.

Zrzut ekranu przedstawiający wiele klatek wykonywanych kolejno.
Rysunek 13. Wiele klatek wykonywanych kolejno.
Zrzut ekranu, na którym widać zbliżenie obrazu AGI z wieloma przetworzeniami.
Rysunek 14. Powiększenie klatki z wieloma przejażdżeniami renderowania.

Podobnie jak w przypadku Mali opisanym wcześniej: jeśli aplikacja korzysta z Vulkana, ścieżka Vulkan Events zawiera informacje o pracy przesyłanej do wykonania ramki. Aby wyróżnić przejścia renderowania, kliknij slajdy Vulkan Events powiązane z klatką.

Zrzut ekranu aplikacji opartej na Vulkan, w którym wybrano zdarzenia Vulkan dotyczące ramki.
Rysunek 15. Aplikacja na platformie Vulkan, w której wybrano zdarzenia Vulkan dla ramki.

W niektórych sytuacjach granice klatek GPU są trudniejsze do odróżnienia, ponieważ aplikacja jest mocno związana z procesorem graficznym. W takich sytuacjach, jeśli znasz zadanie przesyłane do GPU, możesz określić wzór, według którego wykonywane są przejścia renderowania, i na tej podstawie określić granice klatek.

Zrzut ekranu aplikacji, która intensywnie korzysta z procesora graficznego, z wzorem przejść renderowania, który pomaga zidentyfikować granice klatek.
Rysunek 16. Aplikacja mocno korzystająca z GPU z przetwarzaniem przejść, która pomaga w określaniu granic ramek.

Liczniki GPU

Jeśli informacje o podziele GPU nie są dostępne w śladzie, możesz oszacować czas GPU na podstawie licznika GPU.

Urządzenia Mali

Na urządzeniach z procesorem Mali możesz użyć ścieżki Wykorzystanie GPU, aby oszacować czas generowania klatek przez GPU w przypadku aplikacji, która nie jest intensywnie korzystająca z GPU. Aplikacje, które nie wymagają intensywnego wykorzystania karty graficznej, mają regularne okresy wysokiej i niskiej aktywności karty graficznej, a nie stale wysokiej aktywności. Aby oszacować czasy generowania klatek GPU za pomocą ścieżki Wykorzystanie GPU, zmierz czas trwania okresów wysokiej aktywności na ścieżce.

Zrzut ekranu z wykorzystaniem karty graficznej i kolejami kart na urządzeniu Mali.
Rysunek 17. Wykorzystanie GPU i kolejka GPU na urządzeniu Mali.

Jeśli aplikacja jest bardziej obciążająca dla GPU, wykorzystanie GPU może być stale bardzo wysokie. W takim przypadku możesz użyć ścieżek wykorzystywania kolejki fragmentówwykorzystywania kolejki bez fragmentów, aby monitorować aktywność GPU i szacować czasy generowania klatek przez GPU. Szukanie wzorców na ścieżkach fragmentu i niefragmentu pozwala uzyskać przybliżone oszacowanie, gdzie znajdują się granice ramki, i wykorzystać to do pomiaru czasu ramki GPU.

Zrzut ekranu pokazujący ścieżki z fragmentami i bez fragmentów.
Rysunek 18. Fragmenty i niefragmenty utworu.

Urządzenia z procesorami Adreno

Jeśli aplikacja nie jest obciążająca dla GPU, na urządzeniach z Adreno możesz oszacować czas renderowania klatki przez GPU w taki sam sposób jak w sekcji o urządzeniach Mali.

Zrzut ekranu pokazujący odsetek wykorzystania procesora graficznego i elementy kolejki GPU na urządzeniu z procesorem Adreno.
Rysunek 19. Odsetek wykorzystania GPU i kolejka GPU na urządzeniu z procesorem Adreno.

Jeśli aplikacja jest bardziej obciążająca dla procesora graficznego i ma stale wysoki odsetek wykorzystania GPU, możesz użyć ścieżek Instrukcje wierzchołka / sekundaInstrukcje fragmentu / sekunda, aby oszacować czas generowania klatek przez GPU. Szukanie wzorców w poziomach aktywności tych ścieżek pozwala uzyskać przybliżone oszacowanie, gdzie znajdują się granice ramki, i wykorzystać je do pomiaru czasu trwania ramki GPU.

Zrzut ekranu z instrukcjami dotyczącymi wierzchołka / drugiego toru
Rysunek 20. Vertex Instructions / Second.

Te inne ścieżki mogą zawierać podobne informacje:

  • Zacienione wierzchołki / sekunda
  • Zacienione fragmenty / Drugi
  • % czasu tworzenia cieniowania wierzchołków
  • % fragmentów cieniowania w czasie