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的专题》的效果,

相关推荐
怪咖码农13 分钟前
Java分布式幂等性怎么设计?
java·分布式·spring cloud
bestwinner37 分钟前
java 集合取交集
java·开发语言
丁总学Java1 小时前
使用 SDKMAN! 在 Mac(包括 ARM 架构的 M1/M2 芯片)安装适配 Java 8 的 Maven
java·maven·sdkman
nfgo2 小时前
在 ARM64 架构系统离线安装 Oracle Java 8 全流程指南
java·oracle·架构
全栈Blue2 小时前
记录一次报错:spring security 403报错
java·后端·spring
m0_748230942 小时前
Spring Boot框架知识总结(超详细)
java·spring boot·后端
众智创新团队2 小时前
如何使用Java语言在Idea和Android中分别建立服务端和客户端实现局域网聊天
android·java·intellij-idea
小林rr3 小时前
java韩顺平最新教程,Java工程师进阶
java·开发语言
星迹日3 小时前
数据结构:排序—计数,桶,基数排序(五)
java·数据结构·算法·排序算法·计数排序·桶排序·基数排序