Nie używaj klatek do mierzenia wydajności
Dlaczego to w ogóle ma znaczenie?
Jakiś czas temu uczestniczyłem w jednej z konferencji branźowych. Podczas jednego z wykładów prezenter powiedział coś w stylu: "Zmieniliśmy tylko tę jedną rzecz i zyskaliśmy 5 klatek na sekundę". Pomyślałem wtedy: "Super, ale jak znaczący był to wzrost?".
Kiedy mówimy o budżecie wydajności, posługiwanie się klatkami na sekundę (FPS) jako jednostką jest całkowicie zrozumiałe. Na przykład stwierdzenie: "Celujemy w 60 klatek na sekundę w naszej grze" jest jasne i precyzyjne. Problem pojawia się, gdy ktoś mówi, że "zyskał kilka klatek na sekundę", takie sformułowanie może być mylące, ponieważ znaczenie tego wzrostu nie zawsze jest jednakowe.
Przyspieszenie z 10 do 15 FPS to zauważalna poprawa, natomiast przejście ze 120 do 125 FPS może być praktycznie niezauważalne. Warto więc zastanowić się, co tak naprawdę oznacza wzrost liczby klatek i jak interpretować go w kontekście rzeczywistej wydajności.
Czas Klatki (Frame Time) a Ilość Klatek (Frame Rate)
Kiedy mówimy, że nasza gra działa np. w 60 FPS, mamy na myśli tzw. Frame Rate, który mówi nam o tym, ile gra jest w stanie wyrenderować klatek, w przeciągu jednej sekundy. Na tej podstawie możemy obliczyć tzw. Frame Time, czyli określić ile czasu sprzęt potrzebuje na wyrenderowanie jednej klatki, aby utrzymać określoną liczbę FPS.
Ponieważ mówimy tu o bardzo krótkich odcinkach czasu, zazwyczaj wyrażamy je w milisekundach (1 ms = 0,001 sekundy).
Na przykład:
- Jeśli gra działa w 60 FPS, to czas pojedynczej klatki jest równy 16.7 ms
- Jeśli gra działa w 120 FPS, to czas pojedynczej klatki jest równy 8.34 ms
Do obliczenia którejkolwiek z tych liczb, możemy posłużyć się prostymi wzorami:
\[\frac{1000}{fps} = ms\] \[\frac{1000}{ms} = fps\]Jak zapewne zauważyłeś, im wyższa liczba klatek na sekundę, tym krótszy jest czas pojedynczej klatki. Jest to w pewien sposób oczywiste, jeśli chcemy wygenerować więcej klatek w tym samym czasie, każda z nich musi zostać wyrenderowana szybciej.
Stąd, jeśli ktoś mówi, że zyskał 20 klatek
- Może to być zysk równy 66.67 ms, jeśli znajdujemy się pomiędzy 10 a 30 FPS
- Może to być zysk równy 1.66ms, jeśli znajdujemy się pomiędzy 100 a 120 FPS
Bez dodatkowego kontekstu, ta informacja nic nam nie mówi.
Dlaczego Frame Time jest lepszy, gdy rozmawiamy o wydajności?
Podczas pisania kodu, najważniejsze jest dla nas utrzymanie docelowej ilości klatek, którą chcemy uzyskać. Jeśli ktoś powie, że nasz cel to 60 klatek na sekundę, to od razu wiemy, że mamy do dyspozycji 16,67 milisekundy na wykonanie wszystkich operacji niezbędnych do działania gry. Od tego momentu wszystkie pomiary wydajności odnosimy właśnie do tego czasu wyrażonego w milisekundach. Jeśli uda nam się zoptymalizować coś i zyskać 1 milisekundę, to zawsze będzie to dokładnie 1 milisekunda, niezależnie od liczby wygenerowanych klatek. Taka oszczędność ma konkretną, mierzalną wartość, co znacznie ułatwia analizowanie wydajności i określanie poziomu optymalizacji potrzebnego, by zmieścić się w wyznaczonym budżecie czasowym.
Z drugiej strony, gdy ktoś mówi "Zyskaliśmy 5 FPS", to tak naprawdę nie wiele nam mówi. Może to oznaczać ogromną różnicę w płynności rozgrywki albo niemal niezauważalną zmianę. Zysk 5 FPS przy 20 FPS to coś istotnego, ale ten sam wzrost przy 120 FPS jest praktycznie niezauważalny. Dlatego właśnie posługiwanie się czasem klatki (w milisekundach) daje znacznie bardziej spójny i jednoznaczny sposób oceny poprawy wydajności niż operowanie samą liczbą FPS.
Podsumowanie
- Kiedy mówimy o docelowej liczbie klatek na sekundę, posługiwanie się FPS jako jednostką, jest całkowicie w porządku.
- Gdy mówisz, jak dużo poprawiła dana operacja, używaj milisekund. To daje słuchaczom absolutną i spójną liczbę, która zawsze ma to samo znaczenie.
- Jeśli chcesz wspomnieć wzrost w FPS, zawsze załącz dodatkowy kontekst (np. z jakiej wartości do jakiej), aby uniknąć niezrozumienia.

Comments powered by Disqus.