Глава 20 · Разработка игр с Pygame

Производительность: FPS и бюджет кадра

У каждого кадра есть жёсткий бюджет времени в миллисекундах — и почти всегда полезнее его измерить, чем гадать, что именно медленное.

Раздел 20.15 уже показал, что 60 FPS означает бюджет примерно 16.7 миллисекунды на кадр целиком — включая обработку ввода, обновление и отрисовку. Если код одного кадра занимает больше этого бюджета, кадры теряются, что бы ни было выставлено в clock.tick().

byudzhet_kadra.py
# Бюджет кадра для разных целевых FPS
for fps in (30, 60, 120):
    byudzhet_ms = 1000 / fps
    print(f"{{fps}} FPS -> {{byudzhet_ms:.2f}} мс на кадр")

Куда обычно уходит бюджет кадра

Частая причина просадкиПочему это медленноЧто делать вместо этого
Загрузка файла внутри циклаЧтение с диска в тысячи раз медленнее операций в памятиЗагружать все ассеты один раз до цикла (разделы 20.19, 20.24)
Создание новой Surface каждый кадрВыделение памяти под изображение — не бесплатная операцияСоздавать поверхности один раз и переиспользовать
Отрисовка объектов за пределами экранаКаждый вызов blit() выполняет работу по композиции кадра независимо от того, видно ли её результатПропускать отрисовку объектов, которых не видно
Проверка столкновений "каждый с каждым"Число проверок растёт квадратично с числом объектовСокращать число проверок (например, делить экран на зоны)

Как измерить, а не гадать

clock.get_fps() из раздела 20.15 — самый простой способ увидеть реальную производительность прямо во время игры. Для более точного разбора, какая именно часть кода медленная, в Python есть встроенный профилировщик cProfile — он показывает, сколько времени было потрачено в каждой функции, а не только итоговый FPS.

Сначала измерить, потом оптимизировать
Первая реакция на просадку FPS — переписать "на глаз" то, что кажется медленным. Гораздо надёжнее сначала измерить (через get_fps() или cProfile), где именно уходит время: интуиция о "медленном коде" в программировании вообще и в играх в частности ошибается на удивление часто.
Практика: считаем бюджет кадра
Проверяется прямо в браузере — установка Pygame не требуется
Открыть практику →