Analizowanie harmonogramu wątków

Aby sprawdzić, czy wątki procesu gry są odpowiednio wykorzystywane i planowane pod kątem optymalnej wydajności, musisz wziąć pod uwagę kilka kwestii.

  • Tempo klatek
  • Wielowątkowość i paralelizacja wątków
  • Powiązanie z rdzeniem procesora

Wielowątkowość

Wiele gier i silników gier korzysta z wielowątkowości, aby dzielić pracę procesora na logiczne zadania, które mogą być wykonywane w pewnym stopniu niezależnie. Typowa konfiguracja obejmuje wątek gry do obsługi danych wejściowych i logiki gry, wątek renderowania do przygotowywania i przesyłania obiektów do narysowania oraz wątki robocze do innych zadań, takich jak animacje czy dźwięk.

Aby wykorzystać wzrost wydajności wynikający z wielowątkowości, zalecamy paralelizację wątków. Przykładem może być sytuacja, w której wątki gry i renderowania działają częściowo lub całkowicie równolegle na różnych rdzeniach. Nie zawsze będzie to możliwe, np. w przypadku zależności od udostępnionych danych. Jeśli jednak jest to możliwe, może to skrócić czas pracy procesora, a tym samym zwiększyć liczbę klatek na sekundę.

Gra z dobrze zrównoleglonymi głównym wątkiem i wątkiem renderowania, a także wątkiem instancji roboczej i wątkiem audio
Rysunek 1. Gra z dobrze zrównoleglonymi wątkami głównym i renderowania oraz wątkiem instancji roboczej i wątkiem dźwięku

Powiązanie z rdzeniem procesora

Jednym z czynników, który znacząco wpływa na wydajność zbiorów zadań procesora, jest sposób ich planowania na rdzeniach. Można to podzielić na 2 komponenty:

  • Czy wątki gry działają na rdzeniu najbardziej odpowiednim do ich zbioru zadań.
  • Czy wątki gry często przełączają się między rdzeniami.

Nowoczesne urządzenia często korzystają z architektury zwanej heterogenicznym przetwarzaniem, w której rdzenie mają różne poziomy wydajności:

  • Jeden lub kilka rdzeni oferuje najwyższą wydajność szczytową, ale zużywa więcej energii. Są one czasami nazywane „dużymi” rdzeniami.
  • Inne rdzenie mają niższą wydajność szczytową, ale są bardziej energooszczędne. Są one czasami nazywane „małymi” rdzeniami.
  • Opcjonalnie: jeden lub więcej rdzeni zapewnia równowagę między wydajnością a zużyciem energii. Są one czasami nazywane „średnimi” rdzeniami.

Możesz sprawdzić zachowanie wątków procesora w sekcji Wykorzystanie procesora , włączając Procesor w konfiguracji profilu podczas tworzenia śladu. Powiększając sekcję śladu o długości <200 ms, możesz wyświetlić poszczególne procesy działające na rdzeniach procesora urządzenia. Zwykle mniejsze rdzenie odpowiadają mniejszym indeksom (np. procesory „0”–„3”), a większe rdzenie – większym indeksom (np. procesory „6”–„7”). Jeśli są dostępne rdzenie średnie, będą one zajmować indeksy pomiędzy (np. procesory „5”–„6”). Jest to powszechna konwencja, ale nie jest to gwarantowane.

Jeśli zauważysz, że niektóre wątki są planowane na procesorach, które nie spełniają ich wymagań dotyczących wydajności lub zużycia energii, rozważ ręczne ustawienie powiązania z procesorem dla tych wątków.

Gra, w której wątek główny i wątek renderowania działają głównie na dużych rdzeniach (CPU 6–7), zaznaczona na jasnoniebiesko
Rysunek 2. Gra z wątkami głównym i renderowania działającymi głównie na dużych rdzeniach (procesory 6–7), oznaczonymi jasnoniebieskim kolorem

Możesz też sprawdzić, czy wątki przełączają się między rdzeniami. Takie przełączanie rdzeni wiąże się z pewnym narzutem wynikającym z przełączania kontekstu i utraty stanu w pamięci podręcznej/rejestrach rdzenia.

Gra z wątkiem głównym (Thread-7) i wątkiem renderowania (Thread-8), które przełączają się między rdzeniami (kolor fioletowy)
Rysunek 3. Gra z wątkami głównym (Thread-7) i renderowania (Thread-8), które przełączają się między rdzeniami, oznaczonymi fioletowym kolorem

Ustawienie powiązania z procesorem dla wątku powoduje, że system planuje go na danym rdzeniu, gdy gra jest na pierwszym planie. Podczas wykonywania tej czynności należy wziąć pod uwagę kilka czynników:

  • Oprogramowanie platformy nie może dynamicznie dostosowywać umieszczania zadań do czynników środowiska wykonawczego, takich jak obciążenie i ograniczanie termiczne.
  • Testy wydajności na różnych urządzeniach mogą wykazywać bardzo różne charakterystyki wydajności, zwłaszcza jeśli urządzenia znacznie różnią się ceną lub datą premiery.

    Nowsze lub droższe urządzenie może wygodnie wykonywać dane obciążenie na małym rdzeniu, ale starsze lub tańsze urządzenie może wymagać większego rdzenia, aby dotrzymać terminów wykonania tego samego obciążenia.

  • Wymuszanie powiązań z dużymi rdzeniami może niepotrzebnie zwiększyć zużycie baterii i obciążenie termiczne.

Z tych powodów na ogół najlepiej jest unikać ręcznego ustawiania powiązań z procesorem.