Rozdział 20 · Tworzenie gier z Pygame
Wydajność: FPS i budżet
Każda klatka ma trudny budżet czasu w milisekundach i prawie zawsze bardziej przydatne jest mierzenie niż zgadywanie, co jest wolne.
Rozdział 20.15 już wykazała, że 60 FPS oznacza budżet około 16,7 milisekundy na klatkę
Cały proces, w tym przetwarzanie wejściowe, aktualizację i renderowanie. Jeśli kod pojedynczej klatki zajmuje czas
Więcej niż ten budżet, personel jest tracony, bez względu na to, co zostanie ujawnione w
clock.tick().
byudzhet_kadra.py
# Budżet klatek dla różnych FPS
for fps in (30, 60, 120):
byudzhet_ms = 1000 / fps
print(f"{{fps}} FPS -> {{byudzhet_ms:.2f}} ms na klatkę")
Gdzie zwykle trafia budżet na personel?
| Częsta przyczyna spadku | Dlaczego to jest wolne | Co zrobić zamiast tego |
|---|---|---|
| Pobieranie pliku w pętli | Odczyty dysku są tysiące razy wolniejsze niż operacje z pamięcią | Załaduj wszystkie zasoby raz przed pętlą (Sekcje 20.19, 20.24) |
| Stwórz nową Surface każdej klatce | Przydział pamięci pod obraz — to nie jest darmowa operacja | Twórz powierzchnie raz i używaj ponownie |
| Renderowanie obiektów poza ekranem | Każde wywołanie blit() wykonuje pracę nad kompozycją klatki niezależnie od tego, czy jej wynik jest widoczny | Pomijaj rysowanie obiektów, których nie widać |
| Sprawdzanie kolizji „każdy z każdym” | Liczba checków rośnie kwadratowo wraz z liczbą obiektów | Zmniejszenie liczby testów (np. podzielenie ekranu na strefy) |
Jak mierzyć, a nie zgadywać
clock.get_fps() z sekcji 20.15 — najprostszy sposób
aby zobaczyć rzeczywistą wydajność w trakcie gry. Dla dokładniejszej analizy, która dokładnie część kodu jest wolna, w Python jest wbudowany profiler
cProfile — pokazuje, ile czasu zostało spędzone w każdej funkcji, a nie tylko końcowy FPS.
Najpierw zmierz, potem optymalizuj
Pierwszą reakcją na FPS spadku poziomu jest przepisanie „na oko”
get_fps() lub cProfile), dokąd dokładnie zmierza czas: intuicja dotycząca „wolnego kodu”Praktyka: Obliczanie budżetu personelu
Zeskanowanie bezpośrednio w przeglądarce – nie wymaga instalacji Pygame