Глава 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 не требуется