Unity进阶教程AOI算法原理详解

最新课程《全栈双客户端(Unity/Cocos) TurnKey方案》更新了AOI专题,今天分享一下AOI算法的实现原理。

AOI的功能和作用

在MMORPG网路游戏当中,单服同时在线一般都会有几千人。当有个玩家执行一个操作,理想情况下要把玩家的操作广播同步给单服全部的几千人。同时别人的操作,也要发给这个玩家,这样就会导致服务端数据通讯的量非常的大。导致客户端也需要创建几千个"节点"来接收这些数据。

如何优化?其实我们发现,虽然一个游戏地图同时在线的人数可能有几千人,但是我们每次能看到的也就是几十人而已(国战等特殊情况除外)。我们只要接收"""周围人"的状态变化和呈现动画即可。"周围"对应一个范围区域,这个范围区域我们把它叫做AOI(Area Of interested)感兴趣区域。

做MMORPG游戏的时候,我们在服务端规定一个范围为AOI的大小。通常为玩家的视野范围,在玩家A 感兴趣AOI范围内的角色,服务端都会把这些角色状态与操作同步给玩家A对应的客户端,不在范围内的,不同步。这样服务端同步给每个客户端的数据量就大大减少,而客户端要创建的接收数据的玩家只有几十个对象。AOI的核心算法就是要在服务端对所有的玩家做好管理,当服务端上某个玩家A有消息的时候,服务端要快速的找到玩家A"周围"的人,然后把消息同步给它们,这就是AOI算法的核心。

AOI 核心算法详解

AOI主流的核心算法目前有九宫格与十字链表两种。

基于九宫格的AOI 算法核心:

Step1: 根据地图,结合屏幕上玩家游戏视野,先确定"可视范围"大小,作为AOI的范围。

Step2: 视野大小确定后,玩家A感兴趣的区域是以它为中心,固定的视野大小为范围,将视野范围分成"九宫格"来作为玩家A周围的AOI区域,如下图的9个红色的框,包围蓝色的玩家;

Step3: 把视野大小 / 3 就可以得到每个格子的大小,这样就可以把地图平面分成MxN个格子。

Step4: 针对每个格子,设计数据结构,保存当前格子中的"物品","角色", "NPC"等。

Step5: 当玩家A有操作的时候,根据玩家A的坐标 / 每个块的大小,就可以得到玩家所在块的坐标, 就能快速的找到玩家所在的块,进一步能锁定玩家周围的9个块。这样,遍历这9个块里面的玩家,把玩家A的状态同步出去,对于其它玩家也类似。

Step6: 由于玩家,NPC,怪物的移动,会导致它由一个格子,到另外一个格子,我们称此为发生了"格子变化"。们做如下处理:

  1. :找到原来玩家A所在的旧的九宫格区域,得到"旧九宫格"格子,现在玩家A所在的新的九宫格区域,得到"新九宫格"格子。
  2. : 对比玩家A前后两个九宫格,即在旧的九宫格又在新的九宫格的格子,不用做任何处理,针对在旧九宫格但不在新九宫格里的格子,发消息给玩家A的客户端,让客户端把这些角色从客户端地图上删除掉。在新九宫格但不在旧九宫格的格子,要发送消息给玩家A客户端,让他们把新进来的玩家创建出来。
  3. 针对在旧九宫格但不在新九宫格里的格子,给这些格子里玩家对应的客户端发消息,玩家A离开了它们的视野,删除玩家A。针对在新九宫格不在九九宫格的格子,给这些格子里的玩家对应的客户端发送消息,玩家A进入到它们的视野,把玩家A创建出来。

移动的玩家突然闯入AOI视野

有时候,我们会遇到一个移动中的角色,移动的过程中,突然传入玩家A的视野, 但是玩家A的客户端不知道这个角色要走向何方,所以不知道如何处理,对于这种突然闯入视野的情况,我们移动,会重新发送一个移动事件,让玩家A的客户端能补齐对应的移动。对于攻击与死亡,也类似。

End

上一波《全栈+双客户端(Unity/Cocos)AOI的专题》的效果,

相关推荐
落魄实习生4 小时前
Agent Scope Java 2.x 系列【10】Middleware
java·开发语言·ai
ZealSinger4 小时前
Spring7 RestTemplate弃用迁移
java·spring·后端开发·restclient
朝朝辞暮i5 小时前
C++ 第 13 课:值传递 —— 为什么函数里改了,外面却没变?
java·c++·算法
弹简特5 小时前
【Java项目-企悦抽】16-抽奖模块01-获取活动完整信息接口实现
java·开发语言·状态模式·springboot
淡海水5 小时前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
泡茶喝茶写代码5 小时前
A股量化数据工程:从 REST 接口到策略信号(第 1 篇):指数列表与实时行情接入
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据接口
Sarvartha6 小时前
接口基础知识
java·开发语言
不才不才不不才6 小时前
Spring 源码系列(29): 20 道高频面试题源码级解析合集
java·后端·spring
索隆zoro6 小时前
Army 的可插拔架构:army-jdbc 与方言模块
java·后端
小蒜学长7 小时前
校园社团招新网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·校园社团招新网站