Analizowanie i optymalizowanie wydajności gry

Z tego przewodnika dowiesz się, jak analizować i optymalizować wydajność gier na urządzeniach z Androidem, aby zapewnić użytkownikom płynną rozgrywkę. Obejmuje to identyfikowanie wąskich gardeł wydajności, rozróżnianie problemów z CPU i GPU oraz weryfikowanie wyników optymalizacji.

Niezależnie od tego, jak wciągająca jest gra, jeśli nie działa dobrze na urządzeniach mobilnych, gracze nie będą się nią cieszyć i nie odniesie ona sukcesu. Nawet w przypadku zabawnych gier mogą wystąpić problemy, takie jak niska liczba klatek na sekundę (FPS) lub przegrzewanie się urządzenia. Te problemy zniechęcają graczy. Dlatego poprawa wydajności gry jest niezbędna i musisz wiedzieć, jak ją zoptymalizować.

Proces optymalizacji skuteczności obejmuje te etapy:

  1. Mierzenie ogólnej skuteczności gry Określ ilościowo spadek wydajności w przypadku poszczególnych scen, aby wskazać anomalie.

  2. Sprawdzanie ograniczeń procesora i procesora graficznego. Określ przyczynę problemu, czy jest to ograniczenie CPU czy GPU.

    Narzędzia: Unreal Insight, Unity Profiler, Perfetto i narzędzia do pomiaru wydajności.

  3. Optymalizacja procesora Usuń zidentyfikowane problemy z wydajnością.

    Narzędzia: Unreal Insight, Unity Profiler, Perfetto i Simpleperf.

  4. Optymalizacja GPU Usuń zidentyfikowane wąskie gardła wydajności.

    Narzędzia: RenderDoc, Arm mobile studio, AGI, narzędzie konkretnego dostawcy.

  5. Testy A/B Przeprowadzaj testy A/B, aby dokładnie sprawdzać skuteczność wprowadzonych optymalizacji.

    Narzędzia: Unreal Insight, Unity Profiler, Perfetto i narzędzia do pomiaru wydajności, blokada częstotliwości procesora lub GPU oraz RenderDoc.

  6. Ten iteracyjny proces (1–5) jest kontynuowany, dopóki nie zostaną osiągnięte docelowe parametry FPS i parametry termiczne.

Wymagania wstępne

Analizowanie kompleksowej wydajności gry

Musisz sprawdzić ogólną wydajność gry i wykryć wszelkie pogorszenia wydajności lub nieprawidłowości w poszczególnych scenach. Zanim zoptymalizujesz grę, sprawdź jej obecną wydajność. Gry zawierają wiele interfejsów i scen, dlatego analizuj sceny o dużym wykorzystaniu procesora lub GPU albo układy, które działają w nieoczekiwany sposób, aby monitorować spadek wydajności i wykorzystanie procesora lub GPU w poszczególnych scenach.

  1. Określ ilościowo spadek wydajności: użyj narzędzi do pomiaru wydajności, aby zmierzyć ogólną wydajność gry. Mierz wydajność w poszczególnych scenach, aby identyfikować konkretne obszary, w których występuje pogorszenie jakości lub nieprawidłowości.
  2. Identyfikowanie problematycznych scen: analizuj dane, aby znajdować sceny o wysokim wykorzystaniu procesora lub GPU albo takie, w których układy ekranu nie zapewniają oczekiwanej wydajności.
  3. Zbieranie danych śledzenia: użyj narzędzi do śledzenia, aby zebrać szczegółowe dane o skuteczności zidentyfikowanych problematycznych scen.

Identyfikowanie wąskich gardeł procesora lub procesora graficznego

Jeśli gra nie osiąga docelowej liczby klatek na sekundę, sprawdź, czy jest ograniczona przez procesor czy kartę graficzną. Analizowanie zachowania procesora i GPU jest kluczowe w znajdowaniu możliwości optymalizacji, nawet gdy urządzenie nagrzewa się lub zużywa zbyt dużo energii podczas rozgrywki. Istnieją różne metody sprawdzania, czy system jest ograniczony przez procesor czy kartę graficzną.

  1. Analizowanie danych śledzenia: użyj wybranego narzędzia do analizowania danych śledzenia:

    • Unreal Insight (Unreal Engine): analizuj ślad, aby zobaczyć czasy dla GameThread, RenderThreadRHIThread.
      • Jeśli wartości GameThread lub RenderThread przekraczają limit czasu renderowania klatki (np. 33, 3 ms przy 30 kl./s), gra jest ograniczona przez procesor.
      • Jeśli RHIThread jest wykonywane przez dłuższy czas lub stanowi większość czasu renderowania klatki, gra jest ograniczona przez GPU.
    Oś czasu śledzenia Unreal Insight pokazująca czasy wykonywania wątków GameThread, RenderThread i RHIThread
    Rysunek 2. Ślad Unreal Insight z wątkami GameThread, RenderThread i RHIThread (kliknij, aby powiększyć).
    • Profiler Unity: jeśli wątek główny zużywa dużo czasu na znaczniki takie jak Gfx.WaitForPresentOnGfxThread, a wątek renderowania pokazuje Gfx.PresentFrame lub <GraphicsAPIName>.WaitForLastPresent, gra jest ograniczona przez procesor graficzny.
    Oś czasu profilera Unity pokazująca wątek główny czekający na Gfx.WaitForPresentOnGfxThread
    Rysunek 3. Przykład ograniczenia przez GPU w profilerze Unity (kliknij, aby powiększyć).
    • Perfetto: analizuj przypisania rdzeni procesora i szczegóły wykonywania wątków. Analiza ta ułatwia identyfikację wąskich gardeł wydajności dzięki szczegółowemu przeglądowi informacji o wykonywaniu wątków.
    • Obciążenie procesora: ślad wskazuje, że obciążenie na elementach GameThreadRenderThread w połączeniu z synchronizacją pionową powoduje opóźnienia w QueuePresent wątku RHI, co oznacza scenariusz ograniczony przez procesor.

      Ślad Perfetto pokazujący czasy wykonywania wątków GameThread, RenderThread i RHIThread
      Rysunek 4. Ślady Perfetto ze szczegółami wykonania na procesorze (kliknij, aby powiększyć).
    • Obciążenie GPU: jeśli czas przetwarzania przez GPU przekracza limit czasu renderowania klatki, np. 25 ms, gra jest ograniczona przez GPU. Ślad wskazuje, że czas ukończenia zadania przez GPU przekracza 25 ms, co oznacza, że jest to scenariusz ograniczony przez GPU.

      Ślad Perfetto pokazujący blok ukończenia GPU oczekujący na ukończenie GPU
      Rysunek 5. Szczegóły śladów Perfetto z narzutem GPU (kliknij, aby powiększyć).
  2. Użyj poleceń stat w Unreal Engine:

    • stat unit: porównaj czas przydzielony do wątków Game, Draw i RHI. Jeśli czasy gry i rysowania są niskie, ale czas RHI stale przekracza limit czasu renderowania klatki, gra jest ograniczona przez GPU. Jeśli na przykład wymagana liczba klatek na sekundę wynosi 30 klatek (co odpowiada 33, 33 ms na klatkę), a wątki gry i rysowania stale mieszczą się w zakresie 10–15 ms, ale RHI stale przekracza 30 ms, zdecydowanie sugeruje to scenariusz ograniczony przez GPU.
    Nakładka jednostki statystyk wyświetlająca czasy wykonywania klatek, gry, rysowania, procesora graficznego i RHIT
    Rysunek 6. Jednostka statystyczna ułatwia szacowanie warunków ograniczonych przez GPU.
    • stat VulkanRHI: sprawdź czas trwania operacji „Prześlij do kolejki” i „Wyświetl w kolejce”.
    Nakładka Stat VulkanRHI wyświetlająca liczniki cykli dla funkcji Queue Submit i Queue Present
    Rysunek 7. Stat VulkanRHI ułatwia szacowanie warunków ograniczonych przez GPU (kliknij, aby powiększyć).
    • stat slow: sprawdź czas przydzielony do wątków Game, Render i RHI, aby wskazać przeszkody.
  3. Sprawdź dane o skuteczności: skorzystaj z wyników kompleksowej analizy skuteczności gry. Na urządzeniu z Androidem:

    • Ograniczenie przez procesor: wykorzystanie procesora (znormalizowane) powyżej 15%, przy niskim wykorzystaniu GPU i niskiej liczbie klatek na sekundę.
    • Ograniczone przez GPU: wykorzystanie GPU przekracza 90%.

    Zwykle, jeśli liczba klatek na sekundę i wykorzystanie GPU są niskie, a wykorzystanie procesora przekracza 15%, sytuację można uznać za ograniczoną przez procesor.

    Tabele danych o wydajności z wyróżnionymi scenariuszami ograniczonymi przez procesor i procesor graficzny
    Rysunek 8. Wskaźniki wydajności z informacjami o wykorzystaniu procesora i procesora graficznego.

Optymalizacja wydajności procesora

Jeśli analiza wykaże, że gra jest ograniczona przez procesor, przeprowadź dalsze badanie, aby wskazać konkretne wątki lub interfejsy API powodujące wąskie gardło.

Szczegółowe wskazówki znajdziesz w artykule Wskazówki dotyczące optymalizacji procesora i procesora graficznego na Androidzie.

Optymalizowanie wydajności procesora graficznego

Jeśli analiza wykaże, że gra jest ograniczona przez GPU, przeprowadź dalsze badanie za pomocą debuggerów klatek, aby przeanalizować potok renderowania i wywołania rysowania.

Szczegółowe wskazówki znajdziesz w artykule Wskazówki dotyczące optymalizacji procesora i procesora graficznego na Androidzie.

Sprawdzanie skuteczności optymalizacji

  1. Przeprowadzaj testy A/B: utwórz kompilację z wdrożonymi optymalizacjami.
  2. Mierz skuteczność: używaj tych samych narzędzi i metod co w przypadku wstępnej analizy, aby mierzyć skuteczność zoptymalizowanej wersji.
  3. Porównaj wyniki: porównaj nowe dane o wydajności z danymi początkowymi, aby potwierdzić, że zidentyfikowane wąskie gardła zostały wyeliminowane i że osiągnięto docelowe wartości FPS i temperatury.
  4. Iteracja: powtarzaj kroki analizy i optymalizacji, aż osiągniesz odpowiednią skuteczność.

Zobacz również