Благодарю за подробное описание.> чтобы игрок не замечал дискретного шага времени.
> Обычно это 30 Гц. Связь с частотой монитора косвенная:
> оба пытаются подстроиться под "частоту обновления" человеческого глаза (24-25Гц).
Вот в первом предложении цитаты - ключевой момент.
Ставится целью удовлетворить пользователя, вписать происходящее в виртуальном мире игры в особенности восприятия игрока. Далее программисты эту задачу решают. Кто-то справляется, согласовав модель с картинкой и ожиданиями пользователя. У других ТП начинает имитировать деятельность: подкрутите то, потом это.
> Связь между подсистемами косвенная, на уровне планировщика потоков ОС.
А с этим на "дефолтной" игровой платформе свои нюансы. Квант по умолчанию 15 мс, а способ изменить такое недоразумение Микрософт документировала лишь лет через 10 после начала массового использования. Без вызова timeBeginPeriod(1) случалась дилемма: Sleep(1) приводит к пропуску кадра, а без него загрузка 100%.
> Если вызывать подсистемы последовательно в одном цикле, то добиться фиксированной частоты
> затруднительно. То время на себя перетянет физика, то графика. То динамичная
> сцена замирает в ожидании окончания построения видеокадра (в теневом буфере -
> при двойной буферизации), то картинка замирает в ожидании пересчета всего мира.
> Тогда подсистемы нужно делать с плавающим кадром, с интерполяцией по переменной
> величине времени между кадрами (deltaTime) для каждой подсистемы соответственно. Но у
> плавающего кадра свои проблемы. А в век многоядерных всего-и-вся это как-то
> совсем нерационально.
Так первые шутеры возникли задолго до многоядерности. Там разносить по потокам было чревато потерями на лишние переключения контекста. Для дублирования данных было мало памяти. Ждать синхроимпульс в DX7 - 100% загрузка процессора, насколько помню. Тогда отключение VSync, наверное, действительно имело смысл, а с тех пор обросло легендами и мифами.