症状很典型:同一份代码,在这台机器上角色慢悠悠,换台机器快得像滑冰;或者游戏一卡,人物「瞬移」一段。
原因是把位移写成了每帧固定量:
position.x += 5
_process 每帧调一次,60 帧的机器一秒加 300,144 帧的机器一秒加 720。速度直接被帧率绑住了。
正解是乘上 delta。delta 是上一帧到这一帧的秒数,乘完之后位移变成「每秒多少像素」,跟帧率脱钩:
position.x += speed * delta
物理相关的移动放 _physics_process,它按固定步长跑,delta 更稳定;只在 _process 里做显示层的东西。混着用会出现「画面看着抖、判定却没问题」这类别扭现象。
还有一层是加速。真做了加速度,别写成 velocity += accel(漏乘 delta),应该是 velocity += accel * delta,然后再 position += velocity * delta。两层都乘,单位才对得上。
一个容易忽略的例外:输入采样本身不该乘 delta。Input.get_vector 拿到的是方向,不是位移,乘上去会让输入强度随帧率变化。
验证方法很土但有效:在项目设置里把最大帧率临时限到 30,跑一遍看移动速度,再放回 60 跑一遍。两次差不多,说明写对了。
