一.常见游戏同步方案
同步问题的本质是一致性的问题,在同一局多人游戏的过程中,玩家A看到玩家B的状态,应该跟玩家B自身看到自己的状态相一致。延迟是造成不一致的本质原因,假设理想情况下双方的网络时延都为0,那两者应该是同步的,但是在现实情况中,往往是不可能的,本文讨论的同步机制,就是为了解决一致性问题而产生的,对于不同的游戏类型,不同的团队技术积累,可以根据自身情况采取不同的同步机制技术方案。
1、状态同步
状态同步主要是指客户端发送游戏动作到服务器,服务器收到后对游戏行为结果进行计算,
然后通过广播下发游戏各种状态到客户端,客户端受到状态信息后进行UI层展示或处理。
这种方式类似于核心逻辑计算都在服务器端进行,客户端主要负责上传操作动作等请求数据,
一般回合制游戏主要采用这种方式
2、帧同步
客户端发送游戏动作到服务器,服务器广播转发所有客户端的动作(或者客户端直接通过P2P技术发送),客户端根据收到的所有游戏动作来做游戏运算和显示。这种做法等于客户端之间互相远程控制其他客户端上的游戏软件。早期的IPX网络游戏,如红色警戒、帝国时代、星际争霸,甚至大量的支持网络连线双打的游戏机模拟器,都是这种方式
二、帧同步技术基础概念
1.基础概念
同的输入+相同的时机 = 相同的显示
意思是如果我们的游戏,接受了来自网络的多个客户端的操作,如果这些操作在各个客户端是一样的,那么多个客户端的显示也就一样了,这就带来了“同步”的效果。所以在这种情况下,各个客户端的运算要绝对一致,不能依赖诸如本地时间、本地随机数等等“输入”,而要一切以网络来的操作数据为主
![简图](https://i-blog.csdnimg.cn/blog_migrate/ea37911b3f1816dc121cf32fa32c57ce.png)
1.MOBA类游戏基本服务器架构
一般的方式是玩家先登陆大厅服务器,认证成功后选择游戏组队功能会通过Match Server进行进行玩家匹配,匹配成功后单独建立一个游戏房间服务器进行对战。
2.通信方式
通信方式主要有http 和socket两种方式,但http底层也是采用socket实现,区别是http每次通信完毕都会断开链接,这种对于频繁交互的应用效率较低,所以对于网游客户端一般http主要用于非高频低实时类通信,如登陆请求,局外物品购买,签到等,所以游戏实时性要求较高的高频交互部分都是采用socket方式通信。
socket通信又分为两种 TCP - UDP具体采用那种socket类型需要结合具体游戏类型来定,以下为两种协议的对比。
对比项 | TCP | UDP |
---|---|---|
连接 | 有连接 | 无连接 |
可靠性 | 可靠、有序 | 不可靠,无序 |
数据包 | 自动拆包 | 手动拆包 |
流量 | 流量控制 | 手动 |
速度 | 慢 | 快 |
控制 | 简单 | 复杂 |
通过上图可以发现,对于socket 我们想做的事情tcp都帮我们处理了,我们需要做的就是建立连接,然后调用API函数收发数据既可,如果采用UDP的话需要我们自己处理这些东西。简单的说就是自己对UDP进行处理模拟TCP,看到这里大家可能以为一定会采用TCP来进行通信,事实是基于游戏场景不同使用的通信协议也可能会不一样,例如王者荣耀是采用UDP来进行通信,腾讯的多数长连接手游也主要是采用UDP.