NES TDD

317. Скрипты запуска PyPy

Добавляем явные скрипты запуска PyPy для ручного выполнения.

Урок 317 из 356 · tests/chapter_10_performance/test_317_pypy_launchers.py

Файлы для создания в корне репозитория

launcher.sh
launcher.cmd

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

PyPy может повысить пропускную способность ядра эмулятора, поскольку значительная часть эмулятора — это код Python, выполняющийся в плотных циклах. Вместо изменения pyproject.toml или принуждения всех студентов использовать PyPy по умолчанию, этот шаг добавляет явные ручные скрипты запуска.

После создания этих скриптов запуска студентам следует использовать их для ручных экспериментов по производительности вместо прямого запуска main.py через CPython.

Использование в Linux/macOS

sh launcher.sh

или, если было добавлено право на выполнение:

chmod +x launcher.sh
./launcher.sh

Использование в командной строке Windows

launcher.cmd

Ожидаемый ручной сигнал

Счётчик FPS, добавленный ранее, должен улучшиться, когда ядро эмулятора выигрывает от PyPy. После более быстрого пути загрузки framebuffer в pygame PyPy может заставить эмулятор работать быстрее реальной скорости NES. В ходе разработки курса совместный эффект более быстрой отрисовки pygame и PyPy давал примерно 90-120 FPS на ручном пути с ROM.

Точное число зависит от машины и состояния ROM, но теперь вывод FPS в терминале — это доказательство для сравнения:

fps=30.0    # example after faster pygame drawing on CPython
fps=100.0   # example after faster pygame drawing + PyPy launcher

Если FPS теперь выше скорости NES, это хорошее доказательство того, что следующий шаг должен добавить выравнивание кадров / контроль ожидаемой скорости, чтобы ручная игра не работала слишком быстро.

Ожидаемая команда, делегируемая обоими запускаторами

uv run --python pypy python main.py

Пример для Linux/macOS

#!/usr/bin/env sh

# Run NES with PyPy through uv.
# Usage:
#     sh launcher.sh
# or:
#     chmod +x launcher.sh
#     ./launcher.sh

uv run --python pypy python main.py

Пример для Windows CMD

@echo off

REM Run NES with PyPy through uv.
REM Usage:
REM     launcher.cmd

uv run --python pypy python main.py

Важное правило тестирования

Эти тесты не должны выполнять скрипты запуска. Их запуск запустил бы ручной интерфейс pygame и потребовал бы локальный файл ROM. Мы лишь проверяем файлы как текст.

Вне рамок

  • изменение Python по умолчанию в pyproject.toml
  • запуск PyPy из pytest
  • открытие окон pygame
  • измерение FPS
  • оптимизация рендеринга

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

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