保持单位在代码中可见
选择一种时间单位并始终保持一致。如果速度以像素/秒表示,增量以秒表示,位置就按“速度 × 增量”前进。可以手动做一个十秒测试:速度设为每秒 80 像素的标记,无论绘制多少帧,都应在游戏世界中移动约 800 像素。
不要把 performance.now() 返回的毫秒数直接与每秒速度混用;除非先除以 1,000。变量名应标明单位,例如 deltaSeconds 或 speedPixelsPerSecond,避免后续调整时不知不觉把移动量放大一千倍。
限制卡顿对运动的影响
对于简单的动作游戏,将增量限制在刻意选定的最大值;负载很高时,接受模拟短暂变慢。对于需要可重复步进的物理模拟,应累积时间并按固定步长推进,同时限制追赶更新的次数,避免恢复过程本身占满页面。两种方法各有取舍,应根据游戏手感和规则选择。
在更新之间人为加入暂停,再比较直线移动和路径末端的碰撞。如果物体穿过了薄障碍,可能需要更小的子步长或扫掠碰撞检测;单独改变渲染频率无法修复这个规则层面的问题。
关于游戏中的增量时间的常见问题
增量时间是否使物理具有确定性?
不能。更新间隔可变仍可能造成不同的积分结果。固定模拟步长可以提高可重复性,但输入时机和浮点运算细节仍然会产生影响。
哪个时钟应该提供经过的时间?
使用动画回调提供的时间戳或 performance.now();MDN说明二者都是高分辨率计时来源。短帧间隔不要使用日历时间,因为系统时钟调整与模拟时间无关。
延伸阅读
发现信息过时了? 报告需要更正的内容