Oneshot Gems
立即玩

游戏开发者指南

让运动取决于时间,而不是帧数

增量时间是更新之间经过的时间。将速度乘以经过的秒数可以让对象在一秒钟内移动相似的距离,无论浏览器绘制 45 帧还是 144 帧。棘手的部分是决定当经过的时间变得异常大时要做什么。如果一个选项卡被挂起或者一个代价高昂的任务阻塞了主线程,盲目地应用整个间隙可能会产生数学上一致但玩起来不愉快的跳跃。

本页内容

保持单位在代码中可见

选择一种时间单位并始终保持一致。如果速度以像素/秒表示,增量以秒表示,位置就按“速度 × 增量”前进。可以手动做一个十秒测试:速度设为每秒 80 像素的标记,无论绘制多少帧,都应在游戏世界中移动约 800 像素。

不要把 performance.now() 返回的毫秒数直接与每秒速度混用;除非先除以 1,000。变量名应标明单位,例如 deltaSeconds 或 speedPixelsPerSecond,避免后续调整时不知不觉把移动量放大一千倍。

限制卡顿对运动的影响

对于简单的动作游戏,将增量限制在刻意选定的最大值;负载很高时,接受模拟短暂变慢。对于需要可重复步进的物理模拟,应累积时间并按固定步长推进,同时限制追赶更新的次数,避免恢复过程本身占满页面。两种方法各有取舍,应根据游戏手感和规则选择。

在更新之间人为加入暂停,再比较直线移动和路径末端的碰撞。如果物体穿过了薄障碍,可能需要更小的子步长或扫掠碰撞检测;单独改变渲染频率无法修复这个规则层面的问题。

关于⁨游戏中的增量时间⁩的常见问题

增量时间是否使物理具有确定性?

不能。更新间隔可变仍可能造成不同的积分结果。固定模拟步长可以提高可重复性,但输入时机和浮点运算细节仍然会产生影响。

哪个时钟应该提供经过的时间?

使用动画回调提供的时间戳或 performance.now();MDN说明二者都是高分辨率计时来源。短帧间隔不要使用日历时间,因为系统时钟调整与模拟时间无关。

延伸阅读

发现信息过时了? 报告需要更正的内容

继续玩下去。

免费浏览器游戏,随时等你开玩。发现喜欢的游戏,让它成为你的下一个最爱。

跟随好奇心探索