CS50游戏开发Pong-3案例LÖVE2D框架dt(delta time)变量疑问
dt变量的来源
你看到的dt是LÖVE2D引擎传入love.update回调函数的形参,不需要你手动声明或引入:
- 代码中定义的
function love.update(dt)是LÖVE2D框架规定的生命周期函数,这个函数不会由你手动调用,而是引擎每帧渲染前自动执行的 - 引擎执行
love.update时,会自动把「距离上一帧执行完成的时间差(单位为秒)」作为实参传入这个函数,你在函数体里用到的dt就是这个传入的参数值,属于函数的局部变量,自然不需要额外提前定义 - 对应
love.update函数上方的注释也明确提到了这一点:dt完全由LÖVE2D引擎提供
dt变量的作用
dt的核心作用是保证不同性能的设备上,游戏物体的移动速度一致:
- 你代码里定义的
PADDLE_SPEED = 200指的是 paddle 理想状态下每秒移动200个虚拟像素单位 - 如果不用dt做缩放,性能好的设备每秒能跑更多帧,每帧都给paddle加固定的移动值,就会出现性能越好的设备paddle移动速度越快的问题,不同设备的游戏体验完全不一致
- 乘以dt之后,每帧的移动距离会根据当前帧的间隔自动适配:比如某帧间隔是1/60秒,那这帧paddle就移动
200 * 1/60 ≈ 3.33像素,哪怕某台设备一秒只能跑30帧,单帧间隔是1/30秒,单帧就移动200 * 1/30 ≈ 6.66像素,不管帧率多少,每秒累计移动的距离永远是200像素,完全和设备性能无关
内容的提问来源于stack exchange,提问作者Abel Barbosa
相关产品推荐
相关产品推荐

