当前位置: 首页 > 资讯攻略 > 游戏新闻 帧同步和状态同步该怎么选(下)

帧同步和状态同步该怎么选(下)

2020-02-15 10:48:47 来源: 146次浏览

怎么选



那么依据上篇文章https://zhuanlan.zhihu.com/p/104932624的分析,我们可以总结一下,对于大部分游戏来说,两种同步方式都可以使用。但相比之下状态同步适用型更广,特别适合复杂度高,延迟要求高,玩家多的游戏,例如FPS,MMO等等。帧同步相对适合小兵很多,玩家少且固定,单局时间短,对打击感公平性要求高,追求一致性的游戏,例如格斗,运动,RTS,卡牌,MOBA等。





从技术角度来说,帧同步有一些技术限制,大量玩家战斗,随时进入退出,难以预表现等,而状态同步有更多的优化手段可以更好的降低延迟感。可以说用帧同步的一定能用状态同步,但反过来不成立。





当然帧同步也有自己的优势,实现成本相对简单开发比较快速(一套逻辑不太需要联调),在玩家较少小兵较多的情况下(由于只同步事件而非状态,所以网络传输的数据和游戏里的对象数量无关)服务器性能和带宽开销极低,甚至可以没有服务器(服务器可以完全不跑战斗逻辑只在需要反挂的时候跑),有点去中心化的意思。也非常适合一些单机游戏改成联网得游戏,非常适合中小公司(之前开发的一个MOBA游戏只有一个服务器同学)。





我们在选择的时候需要综合考虑游戏类型,未来需求,战斗时长,游戏模式,网络带宽,延迟响应,防作弊,开发成本周期和实力等因素来选用不同的同步方案,甚至混合使用没有最好的技术只有最适合的技术。下面是一些在选择时可以思考的一些参考问题:






帧同步的难点



因为帧同步的一些限制并且使用的相对较少,最后再补充一些帧同步的优化方案和心得,可以参考:https://zhuanlan.zhihu.com/p/31618785这篇文章。



延迟方面:帧同步难以做预表现,所以对网络和延迟要求更高,必须在网络层上有更深度极致的优化(一些状态同步的游戏优化不好开可以通过预表现蒙混过关)。



以下是之前尝试过的一些优化手段:



1.首先要分析延迟是否有逻辑问题,比如我们一开始有部分延迟是因为逻辑在FixedUpdate里执行,因为更新顺序问题导致客户端相应操作慢一帧,解决之后有较大提升;



2.网络层面极致优化,使用自己开发的UDP,通过冗余包和滑动窗口的方式保证可靠性降低延迟。冗余包的个数依赖MTU并不固定,当然前提是每个帧操作的包也要极致优化(方向操作分段,按位压缩等)。此外客户端上行可以允许丢包允许非可靠,客户端关键操作立即发送(发送频率比逻辑帧高),网络多线程多地多线部署匹配等等;



3.控制发包频率。非关键操作降低发送频率,服务器收到的操作会进行合并和优化,进行帧聚合,避免堆积。甚至可以有选择的舍弃一些包;



4.客户端可以进行一些预表现。比较好的做法逻辑层和变现层分离,客户端表现层可以预表现一定的位移,然后通过航位预测算法逐渐差值到逻辑层的位置。对于帧同步来说解决平滑位移的基础还是网络层的极致优化,然后再考虑平滑差值和预表现





性能方面:帧同步需要每个客户端都完整计算所有逻辑包括小兵AI等,特别是很多帧同步游戏又是对帧率要求非常高非常稳定的,不能卡顿,也需要有更好的性能优化需求。



以下是之前尝试过的一些优化手段:



1.常规的一些客户端性能极致优化,保证客户端帧率稳定,可以参考https://zhuanlan.zhihu.com/p/29087888。例如多线程,分帧分摊,优化GC,预加载预编译,优化算法,使用更优的平滑算法在渲染层差值,网络卡顿时进行分担等等;



2.帧同步有优势的一些优化手段。逻辑帧和渲染帧分离,降低逻辑帧,一般来说MOBA游戏逻辑只需要15帧即可,在渲染帧较高时利用负载均衡拆分逻辑帧等消除毛刺等;



3.甚至一些复杂运算可以分布式计算或者服务器计算,一人计算后同步给其他玩家。





开发效率:帧同步实现简单但维护和查bug极难,对工具,开发素养,规范都有非常高的要求。特别事帧同步只有一点不一致就会导致双方不一致(一个运算,一个错误导致一些代码跳过,更新顺序等),并且往往是在第一时间表现不出来的,累积到一定时间之后才会爆发。



以下是之前尝试过的一些优化手段:



1.程序框架上避免,开发时要求0warning0Error,详尽的保护,逻辑层和表现层分离更新帧率不同,一些随机数,顶点数学库等(可以参考https://zhuanlan.zhihu.com/p/30422277)底层库也要区分开,有自动化的导表转换工具等,防止逻辑层使用浮点数,不是固定随机等;



2.提供自动化的检查工具。定期计算关键数据的hash值每帧校验,表现层使用逻辑层库会自动报错等;



3.出错时的排查工具。详细的本地日志,不同步时每个人上传服务器前100帧的日志;录像功能,记录每个玩家同步操作信息,同时出问题之后可以重复触发跟踪等





PS一些小误区



  • 帧同步会受网络最差的玩家影响,延迟依赖于最差玩家,一个人卡所有人都卡:这是早期的P2P技术导致的,一个玩家要等所有玩家的操作都到了才到。最早Doom就有这个问题,如果使用Packet Server(服务器或者主机)就可以避免这个问题,卡的玩家只会影响他自己,就是乐观帧方案
  • 状态同步服务器需要跑逻辑:状态同步也可以使用客户端之间的状态同步服务器只转发,帧同步也可以服务器跑完整逻辑(实时跑和结算后快速演算)
  • 帧同步或者状态同步只能选一个:针对不同的需要也有项目同时使用帧同步和状态同步两种做法例如梦三国等,平时使用帧同步线下比赛的时候针对比赛玩家使用状态同步解决全图挂的问题
  • 帧同步难反作弊:除了全图挂等(客户端有完整信息)更容易反外挂,王者荣耀反外挂做的就很好
  • MOBA适合帧同步:Dota2和LOL都是状态同步的

特别推荐

推荐理由:

《灵武世界

同类精品更多

京ICP备19037621号-1
文网文许可证:京网文[2017]4088-457号
唯一官方联系QQ:89415894