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

> 将经过的时间应用于游戏运动，选择安全的追赶策略，并在不同的刷新率和停顿后测试运动。

- URL: https://oneshotgems.ai/zh-Hans/topics/delta-time-in-games
- 类别: 游戏开发者指南
- 类型: 指南
- 更新日期: 2026年10月5日

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

## 保持单位在代码中可见

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

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

## 限制卡顿对运动的影响

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

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

## 常见问题

**增量时间是否使物理具有确定性？** 不能。更新间隔可变仍可能造成不同的积分结果。固定模拟步长可以提高可重复性，但输入时机和浮点运算细节仍然会产生影响。

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

## 跟随好奇心探索

- [构建可靠的浏览器游戏循环](https://oneshotgems.ai/zh-Hans/topics/browser-game-loop): 构建浏览器游戏更新并围绕动画帧进行绘制，而不将模拟速度与玩家的显示刷新率联系起来。
- [为小型游戏选择碰撞检查](https://oneshotgems.ai/zh-Hans/topics/game-collision-detection): 选择适合您游戏的碰撞表示，减少不必要的配对检查，并诊断穿过障碍物的物体。
- [对游戏物理使用固定时间步长](https://oneshotgems.ai/zh-Hans/topics/fixed-timestep-game-physics): 通过固定的模拟步骤、有限的追赶工作以及失速和碰撞测试将物理更新与渲染分开。

## 延伸阅读

- [MDN：requestAnimationFrame() 的计时](https://developer.mozilla.org/en-US/docs/Web/API/Window/requestAnimationFrame)
- [MDN：Performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now)

---
规范页面: https://oneshotgems.ai/zh-Hans/topics/delta-time-in-games
