1.什么是帧(Frame)
想象一下小时候你手边的一本小人书,每一页都是静态的画面,单独看它就是一张图片,当你快速翻动如12、24、甚至60页,它立马给你一种在看动画片的错觉。这里的一页就可以叫做一帧,一秒内翻动的页数就叫帧率(FPS)
,如电影常用24FPS就是每秒播放24张画面。
在游戏开发里,帧也是相同的意思
- 时间片:每一帧代表一个游戏时间片,游戏逻辑在这个时间片里进行一轮计算逻辑
- 计算逻辑:包括玩家的输入、物理运算、AI逻辑、碰撞检测等,客户端对这一帧内所有运算结果渲染到游戏世界中
- 循环推进:游戏一帧一帧往前推进,就像你的人生一样不断往前推进
2.逻辑帧和渲染帧
游戏开发中常见将帧分为两种类型:逻辑帧和渲染帧,它们往往和"同步"、"掉帧"、"卡顿"息息相关
- 逻辑帧(Tick Frame): 又可以称为服务器帧、世界帧,驱动游戏世界的真实演化,通常固定时间间隔执行如50ms一帧(20FPS),逻辑帧对于游戏公平性、安全性尤为重要
- 渲染帧(Render Frame):是客户端用于绘制图像的帧,可能是30FPS、60FPS甚至是120FPS以适应高刷显示器,不一定和逻辑帧同步,但必须对齐关键状态(后面细聊)否则画面会出现"鬼畜"现象
当逻辑帧和渲染帧不一致怎么办?
- 高逻辑帧/低渲染帧:玩家会感觉卡顿、延迟明显
- 低逻辑帧/高渲染帧:客户端可以进行一些特殊处理让游戏画面平滑流畅(如插值、预测,后面细聊)
总结一句话:逻辑帧决定你”能不能打中敌人”,渲染帧决定你“看起来有没有打中敌人”
3.帧间隔 Delta Time
那么这个帧间隔有什么作用呢?
想象一下一个玩家在地图上移动,从A点移动到B点,每帧移动一定距离(此时你的画面渲染帧率为30FPS),当你提高你的渲染帧率为120FPS,如果玩家速度(每帧移动距离)不调整,那么一定会更快到达B点,这就导致在不同帧率下玩家从A到B花费的时间不同,给我们的感觉上就是"开挂了"
那此时帧间隔就派上用场了,将玩家位置更新和帧间隔联系上
position += velocity * delta
这样无论帧率如何波动,角色移动速度都能保持稳定,除此之外delta time在延迟补偿、动画同步、动作预测中也扮演着重要的角色(后面细讲)
4.固定帧率 vs 可变帧率
是指帧间隔是固定的还是可变的
- 固定帧率(Fixed Timestep):帧间隔固定,如20ms/帧(50FPS),优点是更新周期固定可预测,缺点是如果某帧执行超时会出现卡顿或延迟累积
- 可变帧率(Variable Timestep):每执行一帧计算一次delta,优点是灵活,缺点是会导致非确定性结果需要进行误差校正
在多人联机服务器中推荐使用固定帧率以保障不同服务器节点之间状态一致,在单机游戏或局域网游戏中使用可变帧率提升游戏效率和性能