通俗理解游戏开发中的增量时间deltaTime

为什么要 乘 deltatime

一. 帧

首先我们得知道动画是什么。动画,动画,动态的图画,即当图画连续动起来就能形成动画,那么在人类眼中,1秒中需要24张图画快速更换才能在大脑中形成视觉暂缓而成的动画。这里我们就把图画的24张叫做24帧,也就是说人眼中需要1秒24帧的动画才能流畅播放。

二. 游戏开发函数 update

update方法 是计算机运算中的每帧都会运行一次
因为硬件设备不同性能,A设备1秒能60帧,B设备1秒能120帧。也就是说:

  • A能触发update方法60次,B能触发update方法120次。

假如我们设定初始 游戏中 基础移动速度每秒3米,speed=3
有个移动的操作逻辑,小白可能如下写法 (伪代码):

update()
{
	// 增量距离: 将要移动的 距离 = 速度3m/s * 时长1s
	distance = speed * 1;
	// 累计距离 成为新的位置
	position = position + distance;
}

上面有什么问题呢?注意update是 每帧都会运行一次
A设备1秒内运行了 60次,移动了60 * 3 = 180米。
B设备1秒内运行了120次,移动了120 * 3 = 360米。

  • 问题一:我们本来设想的是每秒移动3米,没有达成预期效果。
  • 问题二:同样一个操作,凭什么B比A移动距离远!?游戏不公平!

三. 解决方案

先说A设备,上面 distance = speed * 1; 这公式中的1 秒是错误的。
每帧执行update时长可不是1秒, 而是上帧到这帧 所消耗的时长(1秒拆解60份),即 1/60 秒。

update()
{
	// 增量距离 = 速度 * 增量时间
	distance = speed * 1/60;
	position = position + distance;
}

修改后的效果:
A设备1秒内运行了 60次,移动了60 * 3 * (1/ 60) = 3 米。
达成初始预期的 speed 每秒3米的基础速度。
总结,就是 你一个任务会执行60次update, 那我就在每次的update中只完成60分之1 的任务量

B设备,同理,只不过 每次执行update的用时是 1/120 秒。

update()
{
	// 增量距离 = 速度 * 增量时间
	distance = speed * 1/120;
	position = position + distance;
}

总结

A设备 上帧到这帧 所消耗的时长 1/60秒,B设备的 1/120秒,就是 增量时间 deltaTime。它并不是固定的,根据设备运行动态变动的,随时都不一样的,可能30,48,69,130… ,可通过时钟计数器差值计算得到。一般游戏引擎会封装好给我们直接使用,如下(伪代码):

update(deltaTime)
{
	// 增量距离 = 速度 * 增量时间
	deltaDistance = speed * deltaTime;
	position = position + deltaDistance ;
}

辛苦书写,如果帮到你了,赞一个吧,支持一下吧! :)

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐