当前位置: 首页 > news >正文

MMO之AOI

这章来说下AOI算法,常用的有九宫格,灯塔(九宫格优化版),四叉树,十字链表/三轴链表(加跳跃表)
写这章主要为了以后温故 方便

1: 一般AOI 的基本接口如下
enter:对象进入地图;
leave:对象离开地图;
move:对象在地图内移动。

2:消息分类
出现/外观 消息 (这个消息体量相对较大) 包含了 (ID,坐标,方向) 等等
移动消息 (ID,坐标,方向,速度)
离开/消失 消息 (ID)

对象出现的消息体量 远大于 消失 跟移动
1>enter
把自己的外观 信息 告诉所有能看到自己的 对象
把自己能看到的所有对象 发给自己
2>move
比较 move 前后的 视野对象 差异 ,消失的通知消失,新看到的通知出现
3>leave
直接通知消失

3:优化
1>来回跑动对象处理(重复 对象出现、对象消失)
简单来说 来回跑动时,
1>本对象视野 一堆对象 重复 出现 消失,
2>在别的对象 视野里 本对象 也是 重复 出现 消失
3>有视野的对象,相互需要通知 出现的消息,消失的消息

eg: 蓝色框 中心(1) 深绿色 框中心(2)
某对象 在1 ,2 间来回跑动
在这里插入图片描述
前端本来就需要 裁剪的
本对象为 简称 S ,以S 为 角度说明
(1): 进入 蓝色点 , S 与 A,B 相互 通知出现消息
(2): 移动到 深绿色点,S 与 A 相互通知 消失消息,S 与 C 相互通知 出现消息 ,S 给B 发送移动消息
(3) 移动回 蓝色点, S 与 C 相互通知 消失消息,S 与 A 相互通知 出现消息,S 给B 发送移动消息
(4): 移动到 深绿色点 S 与 A 相互通知 消失消息,S 与 C 相互通知 出现消息 ,S 给B 发送移动消息

优化 红色虚线为 gray (灰色区域) 在屏幕外的由前端 自行裁剪
(1): 进入 蓝色点 , S 与 A,B 相互 通知出现消息
(2): 移动到 深绿色点,S 与 C 相互通知 出现消息 ,S 给A,B 发送移动消息
(3) 移动回 蓝色点, S 给A,B C 发送移动消息
(4) 移动到 深绿色点, S 给A,B C 发送移动消息
优化了 出现,消失的 消息(主要是出现 消息体量大)
原理:延缓 对象消失,因为有消失 重入时就要有出现,延缓区域大小为红色虚线范围
** 出现 按正常视野处理**
灰色区域 tower 一般一个塔的范围, 链表 一般以5-10秒 跑动的范围

S与A 什么时候通知 消失消息 ?
当S移动到 右移到 黑色 虚线框中心点 (视野区域3) ,S 与A 可以相互通知消失消息
S与A 什么时候通知 出现 消息 ?
当S(区域3)左移动 到蓝色点 (视野区域1) ,S 与A 可以相互通知出现消息
在这里插入图片描述

2>消息优化(主要是出现/外观 消息)----增量更新
类试于DB 的增量日志
(1)enter 时,全量广播
(2)再穿脱 装备时,受影响的 外观 ,在已有的 视野对像列表中 ,实行 增量 广播,
不在已有的 视野对像列表中 ,全量广播, 再加入到 已有视野列表中
(3)新的能看见本对象的 对象,还是全量广播

问题:如果延迟发送,可能出现 对象列表里 增量 版本 不一致的情况,
这里不是数据库,没必要存过多增量,一般3-10就可以了,超过范围的,直接全量同步

aoi 相关开源的如下
1:九宫格
https://github.com/sundream/aoi
https://github.com/knight0zh/aoi
https://github.com/yyhero/gridview

2:灯塔法
https://github.com/xiarendeniao/pomelo-aoi
https://github.com/veione/TowerAOI
https://github.com/cloudwu/aoi
https://github.com/yangxgkem/aoi
https://github.com/cloudfreexiao/skynet-aoi
https://github.com/Bestpoker/AOI
https://github.com/2109/aoi

3:四叉树
https://github.com/JerryZhou/aoi
https://github.com/fananchong/aoi
https://github.com/knight0zh/aoi

4:链表法
https://github.com/2109/aoi
https://github.com/sundream/aoi
https://github.com/jwk000/AOI
https://github.com/yhr28/3D_AOI
https://github.com/qq362946/AOI
https://www.cnblogs.com/rond/p/6114919.html
https://gitee.com/likecg/kbengine

mmo demo
http://mydog.wiki/#/?id=%e7%ae%80%e4%bb%8b

独立 AOI 进程
https://blog.codingnow.com/2012/03/dev_note_13.html

优化
https://zhuanlan.zhihu.com/p/700231330
https://game.sohu.com/a/647694785_204824

感谢各位大佬的无私奉献
站在巨人的肩膀上可以看得更远

3:如果觉得有用,麻烦点个赞,加个收藏

相关文章:

MMO之AOI

这章来说下AOI算法,常用的有九宫格,灯塔(九宫格优化版),四叉树,十字链表/三轴链表(加跳跃表) 写这章主要为了以后温故 方便 1: 一般AOI 的基本接口如下 enter:对象进入地图; leave:对象离开地图…...

linux---多线程

线程的基本概念 定义:在Linux中,线程是进程内部的一个执行单元,是进程的一个实体,它是CPU调度和分派的基本单位。一个进程可以包含多个线程,这些线程共享进程的资源,如代码段、数据段、打开的文件、信号处理…...

【JavaEE初阶】线程 和 thread

本节⽬标 认识多线程 掌握多线程程序的编写 掌握多线程的状态 一. 认识线程(Thread) 1概念 1) 线程是什么 ⼀个线程就是⼀个 "执⾏流". 每个线程之间都可以按照顺序执⾏⾃⼰的代码. 多个线程之间 "同时" 执⾏着多份代码. 还…...

如何规避eBay账号被封的风险?原因与对策

​ebay是全球知名的跨境电商平台之一,吸引了不少的商家入驻。然而随着平台规则的不断更新和完善,很多ebay商家在运营的过程中,会遇到账号被封禁的问题。那ebay账号被封的原因有哪些?本文将带来详细的分析,帮助商家保护…...

Word使用分隔符实现页面部分分栏

文章目录 Word使用分隔符实现页面部分分栏分隔符使用页面设置 Word使用分隔符实现页面部分分栏 分隔符使用 word中的分隔符: 前面不分栏,后面分栏(或前面分栏,后面不分栏),只需要在分隔位置处插入分隔符:“连续”即…...

Express (nodejs) 相关

Express 相关 长乐未央学习视频东哥 1. 安装 express-generator 脚手架,新建项目 执行命令 npm install express express-generator4 -g 同时安装 express,和 express 脚手架. npm install express express-generator4 -g通过 express 脚手架创建 express 项目 exp…...

【Harmony Next】多个图文配合解释DevEco Studio工程中,如何配置App相关内容,一次解决多个问题?

解决App配置相关问题列表 1、Harmony Next如何配置图标? 2、Harmony Next如何配置App名称? 3、Harmony Next如何配置版本号? 4、Harmony Next如何配置Bundle ID? 5、Harmony Next如何配置build号? 6、Harmony Next多语言配置在哪…...

台球助教平台开发球厅预约选择机制和助教匹配选择机制详细需求实例说明(第十四章)

以下是对台球助教系统相关功能的详细规划描述: 一、预约助教功能 二、选择球厅练球功能 三、选择陪练时间功能 四、下单订单支付功能 一、预约助教功能 助教信息展示 在专门的 “助教预约” 页面,以列表形式呈现所有可供预约的台球助教。每个助教条目…...

MyBatis通过注解配置执行SQL语句原理源码分析

文章目录 前置准备流程简要分析配置文件解析加载 Mapper 接口MapperAnnotationBuilder解析接口方法注解parseStatement 方法详解MapperBuilderAssistant 前置准备 创建一个mybatis-config.xml文件&#xff0c;配置mapper接口 <mappers><!--注解配置--><mapper…...

开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)综述

定义 开放词汇目标检测&#xff08;Open-Vocabulary Object Detection, OVOD&#xff09;是一种目标检测任务&#xff0c;旨在检测和识别那些未在训练集中明确标注的物体类别。传统的目标检测模型通常只能识别有限数量的预定义类别&#xff0c;而OVOD模型则具有识别“开放词汇…...

PHP基础

PHP代码标记 标准标记&#xff1a;<?php ?> PHP注释 单行&#xff1a;// # 多行&#xff1a;/* */ 两种浏览器输出文本的方式&#xff1a;echo 和 print echo <?php header("Content-Type:text/html;charsetutf-8"); // 输出字符串 ec…...

启用WSL后,使用ssh通道连接ubuntu

Enjoy WSL 目的 启用wsl后&#xff0c;使用windows自带的powershell、cmd操作linux还是不太好使。以下介绍开启ssh通道&#xff0c;并保证能在ssh通道下&#xff0c;也能正常使用wsl中的win命令行&#xff0c;以及正常打开gui应用。 离线更新WSL&#xff0c;请跳转链接:离线…...

GMSSL的不同python版本

链接1&#xff08;推荐&#xff09; 这个使用的库&#xff0c;是gm ssl 3.1.1。为什么推荐&#xff1f;因为这个有C源码。 GitHub - GmSSL/GmSSL-Python: Python binding to the GmSSL library 链接2 这个使用的库&#xff0c;是gmssl 3.2.2。搜索3.2.2&#xff0c;找不到相…...

【数理统计】参数估计

文章目录 点估计矩估计法最大似然估计法 区间估计单个正态总体参数的区间估计均值 μ \mu μ 的区间估计方差 σ 2 \sigma^2 σ2 的区间估计 两个正态总体参数的区间估计&#xff08;略&#xff09;补充&#xff1a;单侧置信区间 点估计 矩估计法 【定义】设 X X X 是随机…...

ios 混合开发应用白屏问题

一、问题场景 项目业务中某个前端页面中使用了多个echart 组件来显示历史数据&#xff0c; 在反复切换到这个页面后&#xff0c;会出现白屏问题。 二、问题分析 0x116000ab0 - GPUProcessProxy::didClose: 0x116000ab0 - GPUProcessProxy::gpuProcessExited: reasonCrash 0x11…...

对分布式系统的理解以及redis的分布式实现

对分布式系统有哪些了解? 分布式系统是由多个独立的计算节点(通常是计算机或服务器)组成的系统,这些节点通过网络相互通信和协作,共同完成任务。分布式系统的设计旨在提供可扩展性、容错性和高可用性,适用于大规模的数据处理和服务场景。 1. 分布式系统的核心特点 分布…...

VS项目,在生成的时候自动修改版本号

demo示例&#xff1a;https://gitee.com/chenheze90/L28_AutoVSversion 可通过下载demo运行即可。 原理&#xff1a;通过csproject项目文件中的Target标签&#xff0c;实现在项目编译之前对项目版本号进行修改&#xff0c;避免手动修改&#xff1b; 1.基础版 效果图如下 部…...

【蓝桥杯】43699-四平方和

四平方和 题目描述 四平方和定理&#xff0c;又称为拉格朗日定理&#xff1a; 每个正整数都可以表示为至多 4 个正整数的平方和。如果把 0 包括进去&#xff0c;就正好可以表示为 4 个数的平方和。 比如&#xff1a; 502021222 712121222; 对于一个给定的正整数&#xff0c;可…...

我的“双胞同体”发布模式的描述与展望

当被“激情”晕染&#xff0c;重创标题、摘要探索“吸睛”。 (笔记模板由python脚本于2024年12月19日 15:23:44创建&#xff0c;本篇笔记适合喜欢编撰csdn博客的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免…...

flask_socketio 以继承 Namespace方式实现一个网页聊天应用

点击进入上一篇&#xff0c;可作为参考 实验环境 python 用的是3.11.11 其他环境可以通过这种方式一键安装&#xff1a; pip install flask3.1.0 Flask-SocketIO5.4.1 gevent-websocket0.10.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple pip list 详情如下&am…...

go mod tidy 命令

go mod tidy 是 Go 语言的命令&#xff0c;用于清理和更新 go.mod 和 go.sum 文件。它主要有以下功能&#xff1a; 移除未使用的依赖项&#xff1a;从 go.mod 文件中删除那些在代码中不再使用的依赖项。 添加缺失的依赖项&#xff1a;添加代码中使用但尚未记录在 go.mod 文件中…...

(11)YOLOv9算法基本原理

一、YOLOv9 的结构 YOLOv9 引入了可编程梯度信息&#xff08;PGI&#xff09;&#xff0c;以及基于梯度路径规划的新型轻量级网络架构&#xff0c;为目标检测领域带来了突破性的成果。 Yolov9 网络模型主要由BackBone&#xff08;主干网络&#xff09;、Neck&#xff08;颈层&…...

python学opencv|读取图像(十七)认识alpha通道

【1】引言 前序学习进程中&#xff0c;我们已经掌握了RGB和HSV图像的通道拆分和合并&#xff0c;获得了很多意想不到的效果&#xff0c;相关链接包括且不限于&#xff1a; python学opencv|读取图像&#xff08;十二&#xff09;BGR图像转HSV图像-CSDN博客 python学opencv|读…...

中小学教室多媒体电脑安全登录解决方案

中小学教室多媒体电脑面临学生随意登录的问题&#xff0c;主要涉及到设备使用、网络安全、教学秩序等多个方面。以下是对这一问题的详细分析&#xff1a; 一、设备使用问题 1. 设备损坏风险 学生随意登录可能导致多媒体电脑设备过度使用&#xff0c;增加设备损坏的风险。不当…...

Redis篇之Redis高可用模式参数调优,提高Redis性能

1. Redis高可用模式核心 Redis高可用模式的核心是使用主从复制和自动故障转移机制来确保系统在某些节点发生故障时仍然可以正常工作。 常用的高可用架构包括Redis Sentinel模式和Redis Cluster模式&#xff0c;其中Sentinel模式是为了提供高可用性而专门设计的解决方案。 在Re…...

linux-----进程execl簇函数

execl函数族概述 在Linux中&#xff0c;execl函数族用于在一个进程中加载并执行一个新的程序&#xff0c;它会替换当前进程的地址空间&#xff08;代码段、数据段、堆和栈等&#xff09;。这个函数族包括execl、execlp、execle、execv、execvp和execvpe&#xff0c;它们的主要功…...

Vue + ECharts 实现山东地图展示与交互

这篇文章中&#xff0c;我将逐步介绍如何使用 Vue 和 ECharts 实现一个互动式的地图展示组件&#xff0c;其中支持返回上一层地图、点击查看不同城市的详细信息&#xff0c;以及根据数据动态展示不同的统计信息。 效果图&#xff1a;玩转山东地图&#xff1a;用Echarts打造交互…...

【Verilog】UDP用户原语

User-defined primitives 概述基本语法组合逻辑的UDP时序逻辑的UDPUDP 符号表 Verilog HDL&#xff08;简称 Verilog &#xff09;是一种硬件描述语言&#xff0c;用于数字电路的系统设计。可对算法级、门级、开关级等多种抽象设计层次进行建模。 Verilog 不仅定义了语法&…...

问题小记-达梦数据库报错“字符串转换出错”处理

最近遇到一个达梦数据库报错“-6111: 字符串转换出错”的问题&#xff0c;这个问题主要是涉及到一条sql语句的执行&#xff0c;在此分享下这个报错的处理过程。 问题表现为&#xff1a;一样的表结构和数据&#xff0c;执行相同的SQL&#xff0c;在Oracle数据库中执行正常&…...

MyBatis入门的详细应用实例

目录 MyBatis第一章&#xff1a;代理Dao方式的CRUD操作1. 代理Dao方式的增删改查 第二章&#xff1a;MyBatis参数详解1. parameterType2. resultType 第三章&#xff1a;SqlMapConfig.xml配置文件1. 定义properties标签的方式管理数据库的信息2. 类型别名定义 MyBatis 第一章&…...