网络游戏开发系列

本文详细解释了MMORPG中AOI算法的应用,为何需要它来降低带宽和计算压力,重点介绍了九宫格AOI的实现步骤,包括角色进入和离开AOI区域时的事件处理,以及如何通过划分九宫格来减少同步数据和计算工作。

1.3 MMORPG AOI算法的原理与详解

MMORPG核心算法之一就是AOI,本文主要从3个点来分析一下AOI算法的基本原理与实现步骤详解。

  1. 为什么MMORPG里面要使用AOI?
  2. AOI算法类型与AOI同步的主要事件;
  3. 基于九宫格AOI算法的实现详解;

为什么MMORPG里面要使用AOI

假设MMORPG的一个单服游戏服务器上有3000个人在服务端的游戏地图上正在游戏,如果在理论上服务端要维持这3000人的游戏的数据与状态等, 客户端要创建3000个这样的玩家来在客户端上,接受服务端发来的3000个人中的玩家状态的变化,从而更新画面,同步状态。这样会导致一个问题,对于客户端而言,它要维持3000个角色个体的消息处理,动画等逻辑处理。对于服务端而言,每次有要给人状态有变化,要全部发给其它的2999个角色,这样带宽也会很高,新进来一个人登录到游戏服,要把所有的3000人的状态全部传送过去也是占用很大带宽。

   对于客户端而言,他其实不用也不可能一下全部看到地图上的所有玩家,他只要处理好在他视野范围内能看到的玩家就好了。对于服务端而言,只要把状态发送给”能看见他”的其它玩家就可以了。这样客户端+服务端的同步数据量与计算量将大幅度的减少。决定某个玩家能看见哪些玩家,以及哪些玩家进入了“能看见”区域,哪些玩家又离开了”能看见区域”这个技术我们叫做AOI(Area Of Interest)。对于每个客户端而言,只要同步它周围AOI的玩家的状态就可以了,然后服务器负责管理好哪些角色进入了AOI区域,哪些离开了AOI区域,然后告诉客户端,客户端对于进入AOI区域的角色就创建出来,离开AOI区域的角色就删除掉。

AOI算法类型与AOI同步的主要事件

  分析了MMORPG为什么要使用AOI,接下来聊下主流的AOI的算法与AOI代码编写前要理解的几个概念。目前主流的AOI算法有十字链表与九宫格算法。当MMORPG引入AOI管理后,就会多出几个概念:

  1. EnterAOIEvent: 一个角色,怪物或NPC,进入A玩家的AOI区域内,服务器就会发送一个事件EnterAOI,告诉这个A玩家对应的客户端,这个客户端收到这个事件后,更具服务器的状态把角色创建出来;
  2. LeaveAOIEvent: 一个角色,怪物或NPC,离开A玩家的AOI区域,服务器就会发送一个事件LeaveAOI, 告诉这个A玩家对应的客户端,这个客户端收到这个事件后把离开的角色怪物或NPC删除掉。

本文我们的AOI算法采用的是九宫格算法,我们把整个可视范围(AOI)划成一个九宫格。如图:

为什么很多游戏用九宫格算法,我们列举出来它的几个特点:

  1: 基于九宫格,我们将地图分成MxN的块, 某个玩家A在地图上一定会属于某个块。这个块+连同它周围的9个块都属于这个玩家A的AOI区域。在这9个块的游戏玩家就是玩家A的AOI区域内的玩家, 玩家A对周围的角色与玩家的状态变化感兴趣。

  2: 基于九宫格,玩家A周围的九个块上的角色也同时对玩家A的状态变化感兴趣的角色,所以当A有了状态变化的时候,我们能基于A快速的找出对这个状态感兴趣的人。

总结一下,基于九宫格,非常方便的能找到对玩家A状态变化感兴趣的人玩家A对哪些人的状态变化感兴趣。

基于九宫格AOI算法的实现详解

讲解完九宫格的一些特点以后,解析来分析一下九宫格算法的详细步骤:

step1: 确定一个AOI区域的大小,你在游戏中你看角色与怪物的可视范围(AOI),一般我们选的和视野差不多大;

step2: 视野AOI大小确定后,将视野AOI大小, 分成九宫格, 这样得到每一个块的大小;

step3: 将整个的地图按照九宫格的每个大小分成对应的块;

step4: 将每个格子对应一个格子管理对象,这个管理对象保存和记录了所有在这个格子的角色,怪物或NPC;

step4: 创建一个玩家到服务器的同时,根据玩家的位置,将玩家对象保存到对应的格子管理对象上。

Step5: 每次玩家移动,根据移动后的位置重新计算玩家所在的格子,这里注意,有可能移动使得玩家改变了格子,也有可能没有改变。如果格子没有改变,不用做任何处理;

Step6: 当玩家A所在的格子发生变化的时候,玩家A的九宫格的块就会发生变化。

   a类格子对象:在原来玩家A的九宫格中,但是不在现在玩家A的新九宫格中的格子对象;

   b类格子对象:在原来玩家A的九宫格中,也在现在玩家A的新九宫格中的格子对象;

   c类格子对象:不在原来玩家A的九宫格中,但在现在玩家A的新九宫格中的格子对象;

Step7: 对于b类格子,我们直接跳过不用处理;

Step8: 对于a类格子对象,我们要遍历它里面的所有玩家,告诉它们玩家A离开了它们的AOI,给它们发送玩家A离开的LeaveAOI的事件, 让它们的客户端删除掉玩家A对象。给玩家A发送这些玩家的LeaveAOI事件,让玩家A的客户端,删除掉这些对象。

Step9: 对于c类格子对象,我们遍历这些格子里面的所有玩家,把这些玩家的状态与EenterAOI事件发送给玩家A,让玩家A创建出来这些新视野块里面的对象。把玩家A的状态与EnterAOI事件同步发送格这些玩家,让这些玩家客户端把对象A创建出来。

加上AOI以后,这样我们的每个客户端就只要同步它能看见的玩家的状态就可以了。

采用PyQt5框架与Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典型的三层设计模式,包含数据存储层、业务逻辑层和用户界面层。数据持久化方案支持SQLite轻量级数据库与MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存取隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六大子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入与单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史与违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现前后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含前端格式校验与后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小型图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值