MMORPG游戏开发如何实现网络同步
在很多开发者的眼里,网络游戏是如何实现玩家同步,这点一直很神秘,特别是没有做过大型网络游戏项目的小伙伴,今天我们一起来分享一下网络游戏是如何来实现多玩家同步的。网络游戏同步,从技术方向来说有两个,一个是状态同步,一个是帧同步。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习unity的零基础小白,也有一些正在从事unity开发的技术大佬,欢迎你来交流学习。
1: 服务器基于帧率来迭代游戏逻辑
服务端游戏逻辑和客户端一样,也是基于帧频来迭代计算的,这个帧率的设置目前有两大方向,一个是固定的帧率(比如1秒20次迭代计算),有一种是动态的改变帧率。很多游戏都采用简单一点的固定帧率来做。帧率没有必要像客户端一样,60FPS,客户端维持60FPS是为了维持动画的流畅,而服务器上完全没有必要维持这么高的帧率,帧率越低,意味着计算量越少,同时为了游戏手感,一般服务器的以帧率15FPS--->20FPS来触发。如果有一些迭代进度比较高的可以采用FixedUpdate机制,拿20FPS为例, 那么帧的时间间隔就是50ms, 如果有一些高精度的迭
2: 服务器上跑游戏地图
服务器上帧频的机制确立好以后,接下来就是要部署一个地图在服务器上,服务器的地图如何做呢?其实很简单,如果是2D地图,我们把地图看作是一个xoy平面,把地图分成一些小块,并在平面上标记出来哪些区域块是障碍物,哪些可以行走。这个数据可以在客户端的地图编辑器编辑好,并把这个数据导出来给服务器用。如果是3D游
服务器上跑地图,要结合客户端做一个地图编辑器,地图编辑器导出地图数据给服务器。
3:玩家行走时,服务器如何同步?
服务器上的地图数据,寻路导航模块做好以后,就可以独立的让游戏角色在地图上移动了。那么有一个很经典的问题就出现了,这也是很多小伙伴搞不懂的一个点,服务器上游戏角色每次移动的时候,是否要把位置同步给客户端呢?答案肯定是不用,也没有必要。那么什么时候同步位置,客户端有如何处理呢?我们一起来分析详细的过程。
如果在行走中遇到了一个敌人,发起攻击怎么办呢?还是遵循这个原则,只要状态变化了,先同步玩家的最新状态(位置,方向等)。再做后面的动作。这样会不会有作弊呢?不会,因为服务器上跑的是真实的数据,所有结果都是服务器算出来后通知客户端的。
4: AOI技术: 如何查找感兴趣的其他玩家。
AOI算法主要由两个方向,九宫格与十字链表。今天来给大家分享九宫格算法。九宫格算法其实非常简单,如图:
我们对整个地图,用一个个视野块来划分(蓝色线框为一个块,和地图块是不一样的), 以玩家所在的区域为中心,周围一圈就是这个玩家的AOI区域形状,先确定把地图分成几x几的视野块, 以多大的视野块来地图合适呢?确定视野大小, 可以根据摄象机来的视野来预估。摄像机的视野多宽,我们大概预估一下计算出来视野块大小。九宫格算法还有一个优势, 对"我"敢兴趣的玩家在九宫格里面, 我感兴趣的玩家也在九宫格里面。每个格子负责维护它里面的玩家,这样我们就可以快速的找出来"我"感兴趣的玩家,和对"我"感兴趣的玩家。
当玩家移动的时候,如果我们会发生了AOI区域的变化,如图: 新的AOI为红色框。
b: 既在原AOI区域又在新AOI区域, AOI区域没有变化的块,我们不用做任何处理;
c: 在原来的AOI区域内,但是不在新的AOI区域内: 你就要告诉这些玩家,你离开了,这些玩家的客户端,就把你删掉,它们就看不见你了,同时还要把这些玩家发给你,表示说这些玩家你看不见了,你把这些角色删除就可以了。
好, 今天MMORPG 状态同步要解决的主要的核心问题,就写到这里,下次再写帧同步。如果觉得写不错,麻烦关注一下, 谢谢大家。 “服务器上游戏角色每次移动的时候,是否要把位置同步给客户端呢?答案肯定是不用,也没有必要”
作者这句话的应用场景,是在鼠标点击地面的移动方式,在那种玩家自主移动(也就是按wsad移动)的场景内,就不适用了
页:
[1]