О фиксированной частоте обновления физики
Кто-то мог заметить неприятный баг в предыдущей игре, когда персонаж внезапно проваливается сквозь платформу и бесконечно падает в бездну. Особенно часто это возникало при переключении вкладок или сворачивании браузера.
Проблема кроется в дискретности обновления игры. Каждый игровой такт, физическая система прикладывает силы к объектам сцены и перемещает их в зависимости от набранной скорости и времени, которое прошло с предыдущего такта игрового цикла. Далее, при возникновении коллизий, физика расталкивает твердые тела чтобы одно не проваливалось сквозь другое. Все эти этапы происходят до отрисовки, поэтому на экране игрок видит как персонаж устойчиво стоит на платформе.
Но что если пауза между кадрами будет слишком большой? К примеру, если устройство пользователя не справится с нагрузкой и игра начнет тормозить. В таком случае, за одну итерацию объект может переместиться настолько далеко, что система обнаружения коллизий не увидит никакого столкновения. Один объект будто бы перескочит через другой. Именно это и происходит в нашей игре.
Решение может заключаться в жесткой фиксации количества итераций физического пайплайна и другой игровой логики, связанной с перемещением объектов по сцене. То есть, вне зависимости от частоты кадров и возможных просадок в производительности, всегда нужно запускать физику одинаковое количество раз с фиксированной дельтой по времени.
Реализовать это можно через добавление вложенного цикла внутрь основного цикла игры и счетчика, накапливающего время выполнения. Цикл крутится уменьшая счетчик на фиксированное количество миллисекунд пока значение не упадет до меньшего или равного нулю. Таким образом, если игра работает медленнее чем нужно, то физика отработает несколько раз, а если игра работает слишком быстро, то она не отработает вообще.