Частота кадров и время скрипта
Target framerate задаёт верхнюю частоту отправки снимков worker, от 30 до 240.
Встроенные диагностические режимы stream и preview принимают --fps N;
значение по умолчанию — 60. Отдельный CLI-файл не поставляется.
В GUI используется текущее значение Settings, которое можно менять во время сеанса.
Интервал отсчитывается от отправки предыдущего снимка по монотонным часам.
Время callbacks, IPC и отрисовки входит в этот интервал. Для 240 FPS бюджет
составляет примерно 4,167 мс: если обработка заняла 2 мс, остаётся около 2,167 мс.
Ожидание использует high-resolution waitable timer, с обычным таймером как
fallback на системах без поддержки этого флага. Во время ожидания обрабатываются
сообщения preview, закрытие окна и запрос Stop. Опрос выходного pipe также
использует таймер на 1 мс вместо Sleep, округляемого системным tick. Timestamps
снимков получаются из монотонных часов с точностью миллисекунды. Переход к
полностью событийной обработке pipe требует отдельного замера.
При превышении бюджета следующий снимок отправляется сразу. Несколько
догоняющих кадров подряд не отправляются. Реальная частота зависит от нагрузки
и планировщика Windows; Target framerate не гарантирует FPS игры или экрана.
on_timer(uint tick) для совместимости вызывается каждые три host-кадра.
Это счётчик кадров, а не миллисекундный таймер. Для действий через фиксированное
время используйте time::seconds() текущего снимка и проверяйте разницу
с сохранённым временем предыдущего действия. Не блокируйте callback ожиданием.
Нельзя считать tick * constant реальным временем при переменной частоте кадров.
Проверки: tests/frame_pacing.cpp проверяет точные сроки, вычет времени работы,
изменение частоты и отставание; tests/frame_pacing.ps1 проверяет потоковые сеансы
30/60/144/240 и ошибочные параметры. Длительный игровой прогон остаётся отдельной
проверкой стабильности и не заменяется тестами расчёта времени.