网络架构基础 下
Network topology
Original Peer-to-Peer
P2P with Host Server
Dedicated Server
When RTT is too high
在各国建立各自的服务器,然后服务器之间通过专线高速连接
Game Synchronization
游戏同步
同步方案
Snapshot
Lockstep
State
Snapshot
快照同步
客户端只作为服务端的输入输出,逻辑全部在服务端做
服务端希望帧率尽可能低,客户端希望尽可能高,所以客户端可以做插值补间
将全体快照更换为增量快照,减少带宽
逻辑清晰,代码清晰
客户端算力浪费
传输数据量大
Lockstep Origin
帧同步,类似回合制游戏,服务器同步所有客户都安,每帧收集所有客户端的输入,再统一分发给所有的客户端,让他们各自进行模拟。
每帧会被最慢的玩家卡到
Bucket Synchronization,设定最长的等待时间
Trade-off consistenscy and Interactiveity maintenance,在实时和真实之间做平衡
Deterministic Difficulties 确定性,需要保证在不停的平台上对于同样输入,输出结果相同
确定性
Float point numbers
只需要游戏逻辑,状态具有确定性
随机数
Tracing and Debugging
需要存储快照,方便调试,从哪一帧开始出错
Lag and Delay
用缓存解决网络抖动问题
逻辑表现分离
逻辑帧慢,渲染帧块,网络延时要比刷新率慢很多
Vsync
如果屏幕刷新率比 front buffer 更新的速度更快,那么容易出现屏幕撕裂
Reconnection Problem
断线重连
本地快照,根据到当前帧的输入来算到当前状态,Quick Catch Up
服务端快照,提供给客户端使用,观战系统
Replay
回放系统
Lockstep Cheating Issues
反作弊
状态修改挂:由于没有服务端权威状态,所以需要比较出所有客户端中唯一不同的快照,认为他是作弊
状态查看挂:由插件看到玩家不应该知道的状态信息
Lockstep Summary
可以做操作,打击感好的对战游戏
可以做录屏
全图挂
确定性难做
State Sync
状态同步
只同步关键事件,关键行为,场景对象关键状态
服务端具有权威状态
术语
Authorized(1P) 本地
Server 服务端
Replicated(3P) 其他端
射击示例
同步自己开火行为
同步命中事件
同步所有对象数据
Dumb Client Problem
本地角色的移动需要服务端同步下来造成延时
client side prediction
由客户端预测来解决,守望先锋预测半个 RTT 的帧数,
在收到服务端状态的同步时,如果状态不对,需要全部回滚重算整个 RTT 的状态,缓慢插值到正确位置
Packet Loss 丢包问题
和解决帧同步 Leg 一样,服务端也缓存客户端的输入,防止网络波动,同时还不会影响实时性
最后更新于