Unity网络游戏开发实战:游戏项目中状态同步与帧同步如何 ...
前言网络游戏的核心技术之一就是玩家的网络同步,主流的网络同步有”帧同步”与”状态同步”。今天我们来分析一下这两种同步模式。同时教大家如何在自己的项目中采用最合适的同步方式。接下来从以下3个方面来阐述:
希望能帮助大家掌握帧同步与状态同步原理,并能做出对项目与团队最正确的选择。
对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!
状态同步的原理与常用的处理方式
每个玩家+NPC+怪物都在服务器上有对应的数据对象,并且这么多对象都要处理,而且这些对象为避免线程锁等开销,一般都在一个线程, 所以像MMORPG 每个地图的同时在线的游戏人数是有上限的,上限取决于服务器的机器配置与游戏逻辑的复杂度。比如魔兽世界”一个地图”最多同时在线约3000人左右。有人就会问魔兽世界每天同时在线的人数远远超过3000人,怎么你说它一个地图最多是3000人”同时在线”呢?这里的”同时在线”指的是同一个地图的两个玩家,走到同一个地方,彼此能看到对方。而不是两个玩家同时在玩同一个地图名字,但是走到地图的同一个位置彼此看不见 (相当于两个不同的逻辑服,用的是同一个地图)。到目前为止你可以想像成状态同步的服务器是一个跑有若干玩家的游戏逻辑,这些玩家的操作输入指令来自于网络客户端。
大家都是根据服务器上的状态来显示画面的,所以不同客户端能”同步”。准确的讲是同步显示的服务器上元素状态。什么是”状态”?一般游戏里面我们把一些关键的信息叫做”状态”, 举一个例子:
服务器上创建了一个角色对象A,这个角色对象A就会出现在”若干玩家”的视野里(AOI算法),对于这若干玩家而言状态发生了变化,服务器给它们都发送一个角色创建的状态信息含角色的位置,角色的类型,朝向角度,角色状态(Idle)等,这些玩家客户端就把这些角色创建出来。对于角色对象A对应的客户端,服务器要把它视野范围内(AOI)的其它客户端的角色状态发送给它,然后它根据这些状态信息把画面绘制出来。接下来服务器就按照角色状态进行迭代,待机的待机,行走的行走。客户端按照状态也进行迭代,一但状态变化就同步,我们接着角色对象A创建出来的idle状态来分析,那么服务器上角色对象A是Idle其它玩家看它也是Idle。角色对象A发了一个行走的操作给服务器,服务器先判断这个操作的合法性,如果合法,服务器就把角色对象A的状态(位置,旋转,状态等关键指标)+玩家的行走操作(寻路走到目的地dst)一起发送给能看见A玩家的人(能看见A的客户端+包含A自己),关键来了,收到这个状态变化后,每个客户端先重置一下角色数据的状态(位置,旋转,缩放)与服务器同步,在大家都同步到服务器的状态的基础上再做寻路移动操作。接下来角色对象A开始行走了,服务器上要寻路,然后迭代A的行走数据,客户端上的对象A也要寻路,也要再客户端上行走,这个过程可以和服务器失去联系(服务器走服务器的,客户端走客户的端的)。这样角色A就在客户端走起来。行走过程中客户端A发现了一个怪物,点了一下怪物,触发攻击操作,这个时候服务端收到这个客户端A的攻击操作,先判断检查是否合法,如果合法了角色A就要从Walk状态到Attack状态了,这个时候服务端先把服务器上角色A目前的状态(位置,旋转,缩放等)+服务器上角色A的操作一起发给对可见角色A的客户端+角色A自己。收到这个数据后,先同步状态(重置客户端上的角色状态到为服务器上的状态),然后基于同步服务端状态后的再做攻击操作,客户端播放攻击动画,服务端计算攻击逻辑和伤害。当服务器迭代的过程中发现了怪物已经被打死了(状态变化),那么就把角色A的状态+怪物状态,同步给对角色A感兴趣的客户端,然后同步怪物与角色A的状态,然后客户端就把角色A由攻击变成idle状态了,位置也同步了服务器上的。
帧同步的原理与常用的处理方式
哪些游戏适合帧同步,哪些游戏适合状态同步
分析完后我们得到一条结论: 一局时间不长的游戏,每一局不允许玩家中途进来的游戏,每一局的人数是少量固定的(5vs5, 10vs10),对客户端计算不敏感,这种游戏可以采用帧同步。帧同步能获得很好的操作手感,降低服务端的开发难度,如果没有服务端的团队,还可以用腾讯的帧同步服务器。
今天的分析就到这里了,我们这里有一个主程交流群,里面有一些大牛的教程分享,详细的讲解了帧同步的20个流程详解与状态同步的实战解密等。
页:
[1]