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

Кадры в секунду и время кадра

FPS и время кадра — две стороны одной величины, а clock.tick() лишь придерживает цикл, но не ускоряет его.

FPS (frames per second, кадров в секунду) — сколько раз в секунду игра успевает пройти полный цикл Input → Update → Render и показать новый кадр игроку. При прочих равных, если дисплей и система вывода способны показать дополнительные кадры, более высокая частота кадров может сделать движение визуально плавнее — но у частоты кадров есть естественный физический предел, завязанный на экран и время, которое требуется коду каждого кадра.

Время кадра

Время кадра (frame time) — это то, сколько миллисекунд занял один проход цикла. FPS и время кадра — две стороны одной величины:

vremya_kadra.py
# frame_time — в секундах, fps — кадров в секунду
frame_time = 1 / 60          # 60 кадров в секунду -> секунд на кадр
fps = 1 / frame_time         # и обратно: секунд на кадр -> кадров в секунду

print(frame_time)   # 0.016666... секунды, то есть примерно 16.7 мс на кадр
print(fps)          # 60.0

clock.tick(60) из раздела 20.2 не ускоряет игру — наоборот, он искусственно придерживает цикл, если тот пытается выполниться быстрее 60 раз в секунду, и ничего не может сделать, если код одного кадра сам по себе занимает больше времени, чем отведённый бюджет. Реальный, измеренный FPS можно узнать через clock.get_fps(), но не сразу: он усредняет последние десять вызовов clock.tick() и до десятого кадра честно возвращает 0.0. Ноль в первых кадрах — это не сломанный счётчик, а ещё не набранная статистика.

Нет ограничения частоты — цикл ест 100% процессора
Если ничего не сдерживает частоту цикла, он превращается в простой busy loop и выполняется настолько быстро, насколько способен процессор — часто тысячи кадров в секунду, без какой-либо пользы для игрока, зато с полной загрузкой ядра процессора и повышенным расходом батареи на ноутбуке или телефоне (раздел 20.13). В игровом цикле этой книги решением служит clock.tick(FPS) в конце каждого кадра — другие движки и игры могут управлять темпом иначе: через vsync, фиксированный timestep-планировщик или собственную систему тайминга движка.
Практика: FPS и бюджет кадра
Проверяется прямо в браузере — установка Pygame не требуется
Открыть практику →