Unity3D强联网实时PVP思路

发表于2017-10-09
评论0 2k浏览

一款游戏吸引玩家不仅只有PVE还有PVP模式,本篇文章主要和大家分享下使用Unity3d游戏引擎如何实现强联网实时PVP的思路。

网络层:

为了保证网络的稳定性,选择UDP KCP协议的协议方式

业务层:

实现方案:

网络游戏同步方案主要有两种:状态同步帧同步

  • 状态同步:顾名思义,是指的将其他玩家的状态行为同步的方式,一帮情况下AI逻辑,技能逻辑,战斗计算都由服务器运算,只是将运算的结果同步给客户端,客户端只需要接受服务器传过来的状态变化,然后更新自己本地的动作状态、Buff状态,位置等就可以了,但是为了给玩家好的体验,减少同步的数据量,客户端也会做很多的本地运算,减少服务器同步的频率以及数据量。
  • **帧同步:**RTS游戏常采用的一种同步技术 ,上一种状态同步方式数据量会随着需要同步的单位数量增长,对于RTS游戏来讲动不动就是几百个的单位可以被操作,如果这些都需要同步的话,数据量是不能被接受的,所以帧同步不同步状态,只同步操作,每个客户端接受到操作以后,通过运算可以达到一致的状态(通过随机种子保证所有客户端随机序列一致),这样的情况下就算单位再多,他的同步量也不会随之增加。

方案优缺点:

下面我们从各种业务需求和性能上来分析一下这两个方案的优缺点,这样也有助于根据游戏的具体类型和需求来选择实现方式:


以服务器以固定帧数想客户端发送数据的形式,例如:实现过程:

  • 客户端假如有操作输入,直接发送操作cmd给服务器,服务器在下发数据给当前PVP所有玩家时,携带操作数据内容,这样即可实现操作同步;
  • 服务器收集每个客户端发送过来的指令集,然后再下一帧的时候将指令集广播给所有客户端;
  • 帧数为20:即服务器每秒向客户端发送20次数据;
  • 客户端的工作则是通过解析协议数据,然后对表现进行调整即可。

优化建议:

  • 预表现: 
    假如要针对网络差进行体验的优化,建议构思一下预表现 ,其实没那么复杂,就是参考之前的帧数据,推测下一帧的结果,然后预先执行,假如与真实数据有误差,再进行校正即可。

  • 定点数: 
    由于不同操作系统的浮点数精度有差别,特别是Android与iOS两个系统之间,假如在帧同步中不对浮点数进行处理,跨平台肯定会出现精度不同而带来的不同步的问题,比较常见的解决方案就是使用定点数(也就是分数)来替代浮点数,当然也会带来相应的效率下降。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论