Unity3D强联网实时PVP思路
发表于2017-10-09
一款游戏吸引玩家不仅只有PVE还有PVP模式,本篇文章主要和大家分享下使用Unity3d游戏引擎如何实现强联网实时PVP的思路。
网络层:
为了保证网络的稳定性,选择UDP
KCP
协议的协议方式
业务层:
实现方案:
网络游戏同步方案主要有两种:状态同步
和帧同步
- 状态同步:顾名思义,是指的将其他玩家的状态行为同步的方式,一帮情况下AI逻辑,技能逻辑,战斗计算都由服务器运算,只是将运算的结果同步给客户端,客户端只需要接受服务器传过来的状态变化,然后更新自己本地的动作状态、Buff状态,位置等就可以了,但是为了给玩家好的体验,减少同步的数据量,客户端也会做很多的本地运算,减少服务器同步的频率以及数据量。
- **帧同步:**RTS游戏常采用的一种同步技术 ,上一种状态同步方式数据量会随着需要同步的单位数量增长,对于RTS游戏来讲动不动就是几百个的单位可以被操作,如果这些都需要同步的话,数据量是不能被接受的,所以帧同步不同步状态,只同步操作,每个客户端接受到操作以后,通过运算可以达到一致的状态(通过随机种子保证所有客户端随机序列一致),这样的情况下就算单位再多,他的同步量也不会随之增加。
方案优缺点:
下面我们从各种业务需求和性能上来分析一下这两个方案的优缺点,这样也有助于根据游戏的具体类型和需求来选择实现方式:
以服务器以固定帧数想客户端发送数据的形式,例如:实现过程:
- 客户端假如有操作输入,直接发送操作cmd给服务器,服务器在下发数据给当前PVP所有玩家时,携带操作数据内容,这样即可实现操作同步;
- 服务器收集每个客户端发送过来的指令集,然后再下一帧的时候将指令集广播给所有客户端;
- 帧数为20:即服务器每秒向客户端发送20次数据;
- 客户端的工作则是通过解析协议数据,然后对表现进行调整即可。
优化建议:
预表现:
假如要针对网络差进行体验的优化,建议构思一下预表现
,其实没那么复杂,就是参考之前的帧数据,推测下一帧的结果,然后预先执行,假如与真实数据有误差,再进行校正即可。定点数:
由于不同操作系统的浮点数精度有差别,特别是Android与iOS两个系统之间,假如在帧同步中不对浮点数进行处理,跨平台肯定会出现精度不同而带来的不同步的问题,比较常见的解决方案就是使用定点数
(也就是分数)来替代浮点数,当然也会带来相应的效率下降。