Unity基础 —— 帧率与 Time.deltaTime 的关系
目录
帧率与 Time.deltaTime 的关系
在游戏开发中,确保运动的设备无关性(Frame Rate Independence)是核心准则。无论玩家电脑的配置高低,游戏内的物理运动速度必须保持一致。
1. 基本概念
- 帧率 (FPS, Frames Per Second): 每秒内 CPU 和 GPU 完成渲染循环的次数。
- 60 FPS 意味着每帧耗时约为 16.67ms。
- 30 FPS 意味着每帧耗时约为 33.33ms。
- Time.deltaTime: Unity 中表示完成上一帧所消耗的时间(单位为秒)。
- 它是每一帧渲染周期的“采样长度”。
2. 为什么要使用 deltaTime?
假设我们要让一个物体以每秒 $5m$ 的速度向右移动。
错误做法(基于帧移动):
// 如果每帧移动 5m
transform.Translate(Vector3.right * 5f);
- 在 60 FPS 电脑上: 1秒移动 $60 \times 5 = 300m$。
- 在 30 FPS 电脑上: 1秒移动 $30 \times 5 = 150m$。
- 结论: 性能越好的电脑,物体跑得越快,这会导致游戏逻辑崩溃。
正确做法(基于时间移动):
// 将速度与 deltaTime 相乘
transform.Translate(Vector3.right * 5f * Time.deltaTime);
- 在 60 FPS 上: 每一帧移动 $5 \times 0.0166 = 0.0833m$。
- 在 30 FPS 上: 每一帧移动 $5 \times 0.0333 = 0.1666m$。
- 结论: * 60 帧下每帧移动距离短,但每秒次数多。
- 30 帧下每帧移动距离长,但每秒次数少。
- 最终 1 秒移动的总距离均为: $Speed \times \sum(deltaTime) \approx Speed \times 1s$。
3. 公式推导
在物理学中,位移 $S$ 的公式是:
$$S = v \times t$$
在 Unity 的 Update 中,我们每帧执行一次位移累加:
$$S_{total} = \sum (v \times \Delta t_n)$$
因为 $v$ 是常量,提公因式后:
$$S_{total} = v \times (\Delta t_1 + \Delta t_2 + ... + \Delta t_n)$$
由于所有 $\Delta t$ 之和即为总时间,所以无论 $\Delta t$ 的具体数值如何波动,最终位移始终与时间挂钩。
4. 特殊场景:Update vs FixedUpdate
- Update: 每帧执行一次。由于渲染负载波动,其
Time.deltaTime是不固定的。 - FixedUpdate: 物理引擎更新。它的执行间隔是固定的(默认为 0.02s)。
- 在
FixedUpdate中,你应该使用Time.fixedDeltaTime(虽然在 Unity 内部,你在FixedUpdate里直接写Time.deltaTime也会自动返回固定间隔值)。
- 在
5. 面试常见追问
- Q: 如果某一行代码写在 Update 里,但没加 deltaTime 会怎样?
- A: 该逻辑会变成“每帧执行一次”。例如旋转、位移或数值增长,在高性能设备上会变得极快,在低端设备上则极慢。
- Q: 帧率非常低(例如个位数)时,deltaTime 会带来什么问题?
- A: 会导致物理穿透。因为
deltaTime过大,物体单帧位移过长,可能直接穿过超薄的碰撞体。解决方法是开启物理检测的Continuous碰撞模式。
- A: 会导致物理穿透。因为
- Q: 只有位移需要乘 deltaTime 吗?
- A: 不止。任何希望随时间平滑变化的数值(如:技能冷却 CD 的减少、血量缓慢回复、旋转角度)都应该乘以
Time.deltaTime。
- A: 不止。任何希望随时间平滑变化的数值(如:技能冷却 CD 的减少、血量缓慢回复、旋转角度)都应该乘以

浙公网安备 33010602011771号