通俗理解游戏开发中的增量时间deltaTime
通俗理解游戏开发中的增量时间deltaTime,为什么要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 ;
}
辛苦书写,如果帮到你了,赞一个吧,支持一下吧! :)
更多推荐
所有评论(0)