Średnia liczba klatek na sekundę
Płynna i stabilna liczba klatek na sekundę jest niezbędna do zapewnienia wysokiej jakości rozgrywki na urządzeniach z Androidem. Podczas pomiaru wydajności gry należy mierzyć średnią liczbę klatek na sekundę jako podstawę, aby uzyskać podstawowe informacje o wrażeniach użytkownika. Aby zapewnić doskonałe wrażenia z gry, zoptymalizuj ją tak, aby osiągała średnią liczbę klatek na sekundę wynoszącą 60.
Liczba klatek na sekundę na 90. i 99. percentylu pod kątem stabilności
Nawet przy płynnej średniej liczbie klatek na sekundę wynoszącej 60 gra może mieć sporadyczne problemy z płynnością, mikroprzycięcia i nieprzewidywalne opóźnienia wejściowe, co negatywnie wpływa na wrażenia gracza.
Dlatego stabilność liczby klatek jest równie ważna jak śledzenie średniej liczby klatek na sekundę. W tym przypadku należy mierzyć liczbę klatek na sekundę na 90. i 99. percentylu jako odpowiednio stałą podstawę i wskaźnik przycięć. Te dane obejmują „końcową” część wydajności, dzięki czemu możesz zoptymalizować płynność rozgrywki.
Wskaźniki
- Średnia liczba klatek na sekundę (podstawa): ten podstawowy wskaźnik stanowi ogólną podstawę wydajności gry. Chociaż jest to standardowy punkt odniesienia, obliczanie średniej oznacza, że nie można wykryć sporadycznych spadków liczby klatek i mikroprzycięć, co sprawia, że nie wystarcza on do samodzielnego przedstawienia wrażeń gracza.
- Liczba klatek na sekundę na 90. percentylu (stała podstawa na 10. percentylu): wskazuje, że 90% klatek przekroczyło tę stałą podstawę, a tylko najwolniejsze 10% klatek wymagało dłuższego renderowania. Jeśli liczba klatek na sekundę na 90. percentylu jest wysoka i zbliżona do średniej, gra działa stabilnie przez zdecydowaną większość sesji.
- Liczba klatek na sekundę na 99. percentylu (wskaźnik przycięć na 1. percentylu): wskazuje, że 99% klatek przekroczyło ten wskaźnik przycięć, co pozwala wyizolować najwolniejszy 1% klatek. Ten wskaźnik jest niezbędny do wykrywania mikroprzycięć, opóźnień w ładowaniu zasobów i nagłych skoków renderowania z dużą liczbą zasobów, które powodują widoczne przycięcia.
Przykłady
Porównując średnią liczbę klatek na sekundę z danymi na 90. i 99. percentylu, możesz dokładnie zdiagnozować podstawowe zachowanie gry.
Scenariusz 1. Optymalna krzywa (zoptymalizowana gra)
- Średnia: 60 kl./s (16,6 ms)
- 90. percentyl: 58 kl./s (17,2 ms)
- 99. percentyl: 52 kl./s (19,2 ms)
- Analiza: dane są ściśle powiązane. Gra działa niezwykle płynnie i stabilnie. Nie występują mikroprzycięcia, a nawet najgorszy 1% klatek jest ledwo zauważalny dla ludzkiego oka.
Scenariusz 2. Wąskie gardło obciążenia (ograniczenie przez procesor lub GPU)
- Średnia: 45 kl./s (22,2 ms)
- 90. percentyl: 40 kl./s (25,0 ms)
- 99. percentyl: 38 kl./s (26,3 ms)
- Analiza: średnia liczba klatek na sekundę jest niższa, ale stabilna. Wartość na 99. percentylu nie spada drastycznie w porównaniu ze średnią. Wskazuje to, że system jest zasadniczo przeciążony ustawieniami graficznymi lub ograniczeniami rozdzielczości. Gra nie będzie się przycinać, ale będzie działać powolnie. Obniżenie ustawień graficznych zwykle powoduje równomierne zwiększenie tych danych.
Scenariusz 3. Niestabilne 60 kl./s (przycięcia spowodowane kompilacją shaderów lub przesyłaniem strumieniowym zasobów) )
- Średnia: 60 kl./s (16,6 ms)
- 90. percentyl: 45 kl./s (22,2 ms)
- 99. percentyl: 15 kl./s (66,6 ms)
- Analiza: to najgorszy scenariusz. Chociaż średnia liczba klatek na sekundę wydaje się doskonała, wartość na 99. percentylu wskazuje na poważny problem. Wartość na 99.percentylu wynosząca 66,6 ms oznacza, że gra całkowicie się zawiesza na kilka klatek naraz. Wskazuje to na poważne wartości odstające, które są zwykle spowodowane wąskimi gardłami procesora, opóźnieniami w przesyłaniu strumieniowym zasobów (np. wolna pamięć RAM lub pamięć masowa) lub przycięciami spowodowanymi kompilacją shaderów.
Pomiary
Aby skutecznie mierzyć średnią liczbę klatek na sekundę oraz liczbę klatek na sekundę na 90. i 99. percentylu, możesz użyć tych 2 metod. Pierwsza metoda polega na analizowaniu śladów systemu za pomocą narzędzia do profilowania wydajności Android
Performance Analyzer (APA). Druga metoda polega na użyciu istniejącego polecenia adb dumpsys SurfaceFlinger --timestats.
1. Pomiar za pomocą narzędzia APA
Za pomocą narzędzia APA możesz zarejestrować ślad systemu i dokładnie przeanalizować dane dotyczące klatek za pomocą zapytań SQL. Aby zmierzyć dane, wykonaj te czynności:
Zarejestruj ślad za pomocą narzędzia APA: uruchom grę i użyj narzędzia APA, aby zarejestrować ślad systemu w segmencie, który chcesz przeanalizować (np. w punkcie rozgrywki, w którym podejrzewasz spadki liczby klatek). Gdy urządzenie zostanie połączone, a rejestrowanie śladu się zakończy, dane śladu zostaną wczytane w interfejsie APA.
Ekran rejestrowania śladu lub ekran wczytanego śladu Kliknij kartę SQL w narzędziu APA: gdy otworzy się ekran analizy śladu, kliknij kartę SQL w górnej lub bocznej części interfejsu, aby otworzyć środowisko procesora śladu, w którym możesz bezpośrednio wysyłać zapytania o dane.
Wklej zapytanie SQL na karcie SQL narzędzia APA: skopiuj to zapytanie SQL i wklej je w polu do wprowadzania danych zapytania. To zapytanie identyfikuje proces SurfaceFlinger, oblicza interwały klatek na podstawie rzeczywistych sygnatur czasowych aktualizacji wyświetlacza oraz wyprowadza średnią liczbę klatek na sekundę, liczbę klatek na sekundę na 10. percentylu (90. percentyl) i liczbę klatek na sekundę na 1. percentylu (99. percentyl).
WITH target_process AS ( -- 1. Get SurfaceFlinger process ID where frames were identified in debugging step 3 SELECT upid FROM process WHERE name = '/system/bin/surfaceflinger' ), actual_present_times AS ( -- 2. Calculate the hardware display timestamps when SurfaceFlinger actually updated the screen SELECT (ts + dur) AS present_ts FROM actual_frame_timeline_slice WHERE upid IN (SELECT upid FROM target_process) AND dur > 0 ), present_intervals AS ( -- 3. Calculate intervals between physical screen refreshes SELECT (LEAD(present_ts) OVER (ORDER BY present_ts ASC) - present_ts) / 1000000.0 AS p2p_ms FROM actual_present_times ), valid_intervals AS ( -- 4. Filter for valid frame intervals SELECT p2p_ms FROM present_intervals WHERE p2p_ms IS NOT NULL AND p2p_ms > 0 ), ordered_frames AS ( -- 5. Sort in ascending order to calculate percentiles SELECT p2p_ms, ROW_NUMBER() OVER (ORDER BY p2p_ms ASC) AS row_num, COUNT(1) OVER () AS total_frames FROM valid_intervals ) -- 6. Output final metrics SELECT (SELECT COUNT(1) FROM valid_intervals) AS total_presented_frames, ROUND(1000.0 / NULLIF((SELECT AVG(p2p_ms) FROM valid_intervals), 0), 2) AS average_fps, ROUND(1000.0 / NULLIF((SELECT p2p_ms FROM ordered_frames WHERE row_num = CAST(total_frames * 0.90 AS INT)), 0), 2) AS low_10_fps, ROUND(1000.0 / NULLIF((SELECT p2p_ms FROM ordered_frames WHERE row_num = CAST(total_frames * 0.99 AS INT)), 0), 2) AS low_1_fps;Kliknij „Uruchom zapytanie”: kliknij przycisk Uruchom zapytanie (lub ikonę wykonania) obok pola do wprowadzania danych zapytania. Po zakończeniu wykonywania zapytania zmierzone dane dotyczące łącznej liczby klatek (
total_presented_frames), średniej liczby klatek na sekundę (average_fps), liczby klatek na sekundę na 10. percentylu (low_10_fps) i liczby klatek na sekundę na 1. percentylu (low_1_fps) zostaną wyświetlone w tabeli w panelu wyników.
Ekran z wykonanym zapytaniem SQL i 4 wynikowymi danymi wyświetlonymi w tabeli
2. Pomiar za pomocą narzędzia adb (dumpsys SurfaceFlinger)
Aby skutecznie mierzyć średnią liczbę klatek na sekundę oraz liczbę klatek na sekundę na 90. i 99. percentylu, możesz użyć polecenia Android
dumpsys surfaceflinger timestats. To narzędzie podaje średnią liczbę klatek na sekundę i histogram czasu presentToPresent dla wszystkich renderowanych warstw. Czas presentToPresent klatki to interwał między bieżącą klatką a poprzednią klatką.
Oto szczegółowe instrukcje zbierania i obliczania tych danych w przypadku Twojej gry:
Rozpocznij rejestrowanie: uruchom to polecenie z flagami enable i clear , aby rozpocząć rejestrowanie informacji:
adb shell dumpsys SurfaceFlinger --timestats -clear -enableZrzut informacji: gdy gra będzie działać wystarczająco długo, uruchom ponownie polecenie z flagą dump, aby wyświetlić informacje:
adb shell dumpsys SurfaceFlinger --timestats -dumpFiltruj według warstwy: zrzut informacji zawiera dane dotyczące wszystkich warstw renderowanych przez SurfaceFlinger. Musisz znaleźć sekcję odpowiadającą Twojej grze, filtrując według
layerName(np. layerName = SurfaceView[com.example.yourgame...]).layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833Określ średnią liczbę klatek na sekundę: średnia liczba klatek na sekundę dla każdej warstwy jest obliczana automatycznie i wyświetlana bezpośrednio w zrzucie (np. averageFPS = 30.179).
... averageFPS = 30.179 ...Oblicz liczbę klatek na sekundę na 90. i 99. percentylu: aby znaleźć dane na 90. i 99. percentylu, musisz przeanalizować dane totalFrames i histogram czasu
presentToPresentpodane w zrzucie.totalFrames = 1000 ... presentToPresent histogram is as below: 0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0 13ms=0 14ms=0 15ms=0 16ms=850 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0 24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=100 34ms=0 36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=35 54ms=0 58ms=0 62ms=0 66ms=10 70ms=0 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=5 106ms=0 110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0 150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0 650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0A. Przykład koncepcyjny (tabela dystrybucji skumulowanej) Załóżmy,że sesja gry zarejestrowała łączną liczbę klatek wynoszącą 1000. Aby znaleźć dane na 90. i 99. percentylu, oblicz progi milisekundowe, w których skumulowana liczba klatek osiąga odpowiednio 900 klatek (90%) i 990 klatek (99%), licząc od najniższego przedziału milisekund.
Czas renderowania klatki (ms) Liczba klatek (histogram) Skumulowana liczba klatek Stan / obliczenie percentyla 16ms 850 850 85,0% 33ms 100 950 95,0%
(Osiągnięto docelową wartość 900 na 90.percentylu! → 1000/33 = 30,3 kl./s)50ms 35 985 98,5% 66ms 10 995 99,5%
(Osiągnięto docelową wartość 990 na 99.percentylu! → 1000/66 = 15,1 kl./s)102ms 5 1000 100% B. Logika implementacji (pseudokod) Jeśli automatyzujesz tę analizę za pomocą skryptu w Pythonie lub analizatora logów, logikę wyodrębniania wartości na 90. i 99. percentylu z histogramu możesz zaimplementować w ten sposób:
# Define target thresholds based on total frame count p90_target = totalFrames * 0.90 p99_target = totalFrames * 0.99 cumulative_frames = 0 p90_fps = None p99_fps = None # Iterate through the parsed SurfaceFlinger histogram data (sorted by millisecond) for ms_bucket, frame_count in present_to_present_histogram: cumulative_frames += frame_count # Capture P90 when cumulative frames cross the 90% threshold if p90_fps is None and cumulative_frames >= p90_target: p90_fps = 1000 / ms_bucket # Capture P99 when cumulative frames cross the 99% threshold if p99_fps is None and cumulative_frames >= p99_target: p99_fps = 1000 / ms_bucket break # Optimization: stop iterating once both targets are foundZatrzymaj rejestrowanie: po zebraniu wszystkich niezbędnych informacji wyłącz timestats za pomocą flagi disable:
adb shell dumpsys SurfaceFlinger --timestats -disable
Powolne sesje
Powolne sesje wskazują na powszechne problemy z wydajnością w rzeczywistych warunkach. Sesja jest „powolna”, jeśli ponad 25% klatek spada poniżej progu (np. 20 kl./s). Chociaż ten wskaźnik jest przydatny do wykrywania krytycznych problemów z kompilacją, sam nie gwarantuje wysokiej jakości i stabilności. Gra może uniknąć progu powolnej sesji, ale nadal może mieć mikroprzycięcia, które pogarszają płynność rozgrywki przy 60 kl./s.
Chociaż „powolna sesja” i „liczba klatek na sekundę” są obliczane na podstawie czasu renderowania klatki, pełnią różne role. Dane dotyczące średniej liczby klatek na sekundę oraz liczby klatek na sekundę na 90. i 99. percentylu mierzą jakość i stabilność wydajności, wykrywając natychmiastowe spadki i niespójne tempo, które mogą zostać pominięte przez dane dotyczące powolnej sesji.
Podsumowanie
Skuteczna optymalizacja wydajności wymaga kompleksowej strategii. Deweloperzy powinni używać powolnych sesji jako podstawowego radaru do wykrywania poważnego pogorszenia wydajności, a następnie analizować średnią liczbę klatek na sekundę oraz liczbę klatek na sekundę na 90. i 99. percentylu, aby zdiagnozować podstawowe przyczyny i sprawdzić rzeczywistą płynność rozgrywki. Dzięki integracji tych danych możesz mieć pewność, że Twoja aplikacja zapewnia spójne, stabilne i wyjątkowe wrażenia użytkownika.
Dodatkowe materiały
Aby dowiedzieć się więcej o zaawansowanych technikach profilowania, implementowaniu interfejsu Frame Pacing API i strategiach optymalizacji specyficznych dla silnika, zapoznaj się z oficjalną dokumentacją dla deweloperów Androida:
- Android Vitals: powolne sesje: dowiedz się, jak Google Play mierzy i raportuje długotrwałe okresy powolnego renderowania, które bezpośrednio wpływają na wrażenia użytkownika. „Powolna sesja” to sesja użytkownika, w której ponad 25% klatek jest powolnych (np. renderowanie trwa dłużej niż 50 ms, co odpowiada 20 kl./s).
- Android Developers: optymalizacja wydajności gry: zapoznaj się z centralnym centrum optymalizacji gier na Androida. Ten obszerny przewodnik zawiera sprawdzone metody i narzędzia do profilowania (takie jak APA i Perfetto), które pomogą Ci zmaksymalizować ogólną wydajność gry.