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 spadkuDlaczego to jest wolneCo zrobić zamiast tego
Pobieranie pliku w pętliOdczyty 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 klatcePrzydział pamięci pod obraz — to nie jest darmowa operacjaTwórz powierzchnie raz i używaj ponownie
Renderowanie obiektów poza ekranemKażde wywołanie blit() wykonuje pracę nad kompozycją klatki niezależnie od tego, czy jej wynik jest widocznyPomijaj rysowanie obiektów, których nie widać
Sprawdzanie kolizji „każdy z każdym”Liczba checków rośnie kwadratowo wraz z liczbą obiektówZmniejszenie 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
Otwórz praktykę →