NES TDD

315. Счётчик FPS в main

Добавляем простой периодический счётчик FPS в main.py.

Урок 315 из 356 · tests/chapter_10_performance/test_315_main_fps_counter.py

Файл для обновления

main.py

Зачем нужен этот шаг

Прежде чем оптимизировать рендеринг pygame или скорость эмулятора, ручной запускатор должен показывать в терминале простой сквозной сигнал FPS.

Счётчик FPS должен измерять полный ручной путь кадра

Console.step_until_next_frame()
Console.render_framebuffer()
draw_framebuffer(...)
pygame.display.flip()

Предлагаемый пример реализации

import time

FPS_REPORT_INTERVAL_SECONDS = 1.0

...

running = True
last_fps_report_time = time.perf_counter()
frames_since_last_report = 0

while running:
    ...

    executed = console.step_until_next_frame()
    framebuffer = console.render_framebuffer()
    draw_framebuffer(window, framebuffer, SCALE)
    pygame.display.flip()

    frames_since_last_report += 1
    now = time.perf_counter()
    elapsed = now - last_fps_report_time

    if elapsed >= FPS_REPORT_INTERVAL_SECONDS:
        fps = frames_since_last_report / elapsed
        print(f"fps={fps:.1f}")
        frames_since_last_report = 0
        last_fps_report_time = now

Важно

Это намеренно просто. Здесь не разделяется время эмуляции и время рендеринга. Это лишь даёт заметный сигнал в терминале перед работой по оптимизации.

Почему тесты формы исходного кода? main.py открывает pygame и запускает ручной цикл. Автоматические тесты не должны вызывать main(), открывать окно или требовать коммерческий ROM.

Вне рамок

  • оптимизация отрисовки pygame
  • выравнивание кадров / ограничение скорости
  • профилирование отдельных подсистем
  • запуск PyPy
  • вызов main() из pytest

Запустить этот урок

uv run pytest tests/chapter_10_performance/test_315_main_fps_counter.py -v