概述
非网络延迟(latency)
网络游戏中非网络延迟分类:
-
输入采样延迟(input sampling latency)
-
渲染流水线延迟(render pipeline latency)
驱动程序 -> 命令缓冲区 -> GPU -
多线程渲染流水线延迟(multithrended render pipeline latency)
-
垂直同步(VSync)
显示器刷新率 < FPS
例如:屏幕下半是新图像,上半是上一次刷新的图像 -
显示延迟(display lag)
显示器处理输入延迟 -
像素响应时间(pixel response time)
网络延迟
-
处理延迟(processing delay)
-
传输延迟(transmission delay)
从数据链路层到物理介质层的时间延迟 -
排队延迟(queuing delay)
在接收队列花费的时间时间 -
传播延迟(propagation delay)
在信息在物理介质中的传输速度
处理网络延迟
服务器是唯一拥有真实和正确游戏状态的主机。
例:某角色执行跳跃动作
玩家感知时间 - 真实状态时间 = 1/2 RTT
为保证整个系统状态一致,采用保守算法(conservation algorithm)
在采用保守算法的前提下:
客户端画面可能产生非连续变化(被网络限制而产生的卡顿法)
[处理延迟] 方法1 : 客户端插值
客户端插值(client side interpolation)
- 尽可能使IP == PP,效果更真实
- PP与网络延迟和网络带宽有关
- 因此使用客户端插值的游戏玩家感知的延迟与网络有关
*客户端仅仅模拟两个真实状态之间的变化过程,以达到平滑的视觉效果
[处理延迟] 方法2 : 客户端预测
客户端预测(client side prediction)
- 客户端运行与服务器相同的模拟代码
- 只运行额外1/2RTT的模拟
Q:如何计算1/2RTT ?
A:服务器给数据包时打上时间戳,便于客户端计算当前RTT
[处理延迟] 方法3: 航位推测法
航位推测法(dead reckoning)
核心思想:
- 非玩家对象:模拟AI
- 玩家对象:假设玩家继续不断进行(继续完成)当前正在执行的动作
1.乐观算法(optimistic algorithm)
当客户端检测到本地模拟错位时,
- 即时状态更新(instant state update)
- 插值(interpolation)
每帧更新一个偏移量,最终与目标状态相同 - 二阶状态调整(second-order state adjustment)
对急剧变化的参数(如加速度)进心平缓修正
2.针对本地玩家特殊处理
客户端不是使用航位推测法模拟1/2RTT,而是使用玩家A的精确输入来模拟1/2RTT(为保证本地玩家操作的真实感)
3.将移动状态保存到列表中
用于收到服务器状态后的移动回放
4.通过技巧和优化隐藏延迟
利用前置特效,进度条等方法隐藏延迟
[处理延迟] 方法4: 服务器端回退
- 发送给服务器的每个移动数据包中保存客户端视角(在射击游戏中服务器可根据光线/瞄准角度确定是否击中)
- 服务器存储相关对象最近几帧位置进行预测或回退
最后
以上就是花痴墨镜为你收集整理的【游戏开发】多人游戏网络同步相关技术(延迟处理)的全部内容,希望文章能够帮你解决【游戏开发】多人游戏网络同步相关技术(延迟处理)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复