了解Edgegap的工作原理

了解Edgegap的工作原理

插值

插值平滑了其他玩家在服务器更新之间的移动,而不是将他们猛拉(瞬移)到每个新位置。客户端在渲染时会稍微滞后于过去,并绘制两个已知状态之间的路径。这虽然对远程玩家增加了一点延迟,但换来了看起来连续的运动效果。

又称

实体插值

由

由

由

雅库布·莫蒂尔

雅库布·莫蒂尔

雅库布·莫蒂尔

,

产品总监

产品总监

产品总监

已发布

已发布

已发布

插值需要付出什么代价,又能带来什么好处?

插值是用时间来换取确定性。一个经过插值的玩家只会在服务器实际发送的位置之间移动,因此不存在预测错误,也不会有画面回弹。同时它的运行开销也很低:客户端不需要为该玩家运行任何游戏逻辑,只需在两个状态之间进行混合(SnapNet)。

其代价就是延迟。Valve 的 Source 引擎默认延迟为 100 毫秒,这样即使丢失了一次更新,仍有两个更新可以用于混合(Valve)。较新的库会根据网络状况的变化来调整延迟,而不是使用固定值。SnapNet 的目标是让每个实体恰好在下一个更新到达时达到其最新的更新状态,而 Unity 的 Netcode for Entities 则会在调整缓冲区大小时将测量到的抖动考虑在内(Unity 文档)。

文章的核心洞察

  • 不同步是分歧,而非延迟:滞后(Lag)意味着信息到达较晚。不同步(Desync)意味着两台机器保存着相同世界的不同版本,这是一个具有独立解决方案的独立故障。

  • 存在两种截然不同的类型:复制不同步(Replication desync),即权威服务器纠正预测错误的客户端;以及确定性不同步(Determinism desync),即对等端模拟产生分歧,导致会话直接停止。

  • “橡皮筋”效应有两个控制杠杆:客户端预测错误的频率(由延迟决定),以及每次纠正的明显程度(由网络代码决定)。调整其中任何一个,玩家看到的“橡皮筋”现象都会减少。

  • tick 率并不是这两个杠杆之一:提高 tick 率并不会使预测更准确,而且在已经丢包的连接上,它反而会使画面异常情况更加严重。

  • “发生不同步”是校验和失败:帧同步(Lockstep)游戏在每回合都会比较状态哈希值,因此一个分歧的浮点数或一个未同步的随机调用都会导致会话终止。

游戏在什么时候会选择预测而不是插值?

当插值对象必须与预测对象对齐时。玩家自己的角色通常是被预测的,所以它运行得比服务器稍微快一点,而插值对象的运行则稍微落后于服务器。SnapNet 的例子是体育游戏中的球:一个预测的玩家去追一个插值的球,到达正确位置时已经太晚了。插值对象也无法对本地玩家的输入做出反应,直到至少过去了一个完整的往返时间,因为只有服务器才能改变它(SnapNet)。

对于建立在玩家之间接触基础上的机制,例如抓取、投掷或共享的球,这种差距可能会将插值排除在外,这就是为什么格斗和体育游戏通常会预测所有内容。射击游戏通常只预测玩家控制的内容,并对其他内容进行插值。客户端预测涵盖了预测端。

来自我们的赞助商(其实就是我们自己!)的寄语

大多数延迟来自距离,而非代码。Edgegap 的边缘云是一个分布式网络,按需提供高达 615+ 个可用位置,因此每场比赛都能在最适合玩家的可用位置运行。对直播工作室流量的独立重放测试表明,与公共云相比,平均往返时间减少了 58%。

常见问题

服务器会进行插值吗?

帧插值与网络插值是一回事吗?

Get your Game Online Easily & in Minutes

立即开始集成!

轻松在线游戏
且在几分钟内