服务器3D场景建模(七):四叉树的邻居关系

2023-11-09 03:11

本文主要是介绍服务器3D场景建模(七):四叉树的邻居关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实测,经典四叉树效率比本中所述效率高!因此本文请无视之

四叉树的邻居节点?

常见的AOI使用Tile为基础,来实现。

每个Tile周围有8个邻居。因此在游戏对象移动或AOI时,可以O(1)的时间复杂度,定位8个邻居Tile。

而经典的四叉树代码实现,是没有邻居节点概念的。

图1,A节点的邻居节点:
图1

A节点有B、C、D、E、F、G邻居节点。

经典的四叉树代码实现,是需要从根节点开始遍历,才能够访问到邻居节点E、F、G。

图2,某AOI操作:

图2

红色区域的AOI,经典四叉树实现上,从根节点宽度优先遍历,按红色区域是否与节点区域有相交或包含作为条件,遍历之。时间复杂度为O(logN)

如果A节点知道自己的邻居节点,那么可以O(1)的时间复杂度,完成需要处理的节点定位。

有邻居关系的四叉树的AOI操作

图3,A上的红色区域的AOI:

图3

只要遍历A节点及其所有邻居节点,按红色区域是否与节点区域有相交或包含作为条件,遍历之;A的每个邻居节点递归重复操作。

以上操作与Tile上的AOI操作是同时间复杂度的。且比经典四叉树实现高效。

如何创建四叉树的邻居关系

图4,若N节点已经知道自己的邻居关系:

图4

图5,那么N节点分裂时,只要维护下孩子节点与邻居节点的关系即可:

图5

  1. L为N节点的邻居节点列表
  2. 遍历L,删除邻居节点对N的邻居信息
  3. N节点变成非叶节点,不再需要邻居信息,删除这些信息之
  4. N节点分裂为A、B、C、D4个孩子节点
  5. 对每个孩子节点,遍历L,根据节点区域是否相邻,构建孩子节点与L列表中节点的邻居信息

以上。

3种AOI对比

前提假设:游戏对象间有碰撞

算法占用内存AddLeaveMoveAOI说明
Tile算法 O(WH) O ( W ∗ H ) O(1) O ( 1 ) O(1) O ( 1 ) O(T) O ( T ) O(T) O ( T )
2维数组。
第1维表达所有Tile;
第2维表达每个Tile上的游戏对象列表
QuadTree算法 O(N) O ( N ) O(logN) O ( l o g N ) O(1) O ( 1 ) 通常 O(L) O ( L )
跨边界 O(logN)+O(L) O ( l o g N ) + O ( L )
O(logN)+O(L) O ( l o g N ) + O ( L ) 四叉树。
叶子节点上有游戏对象列表;
叶子节点游戏对象超过指定数量限制,则分裂子节点
叶子节点有游戏对象Leave,可能触发4兄弟节点合并
节点边界上的游戏对象放在父节点上
AOI从Root节点开始做广度遍历
QuadTree带邻居关系 O(N) O ( N ) O(logN) O ( l o g N ) O(1) O ( 1 ) O(L) O ( L ) O(L) O ( L ) 四叉树并带有邻居关系。
叶子节点上有游戏对象列表,邻居列表;
叶子节点游戏对象超过指定数量限制,则分裂子节点
叶子节点有游戏对象Leave,可能触发4兄弟节点合并
AOI从始发叶子节点开始,遍历邻居节点

上图,

  • N为游戏对象数量。
  • W为地图宽
  • H为地图长
  • T为Tile上能容纳的游戏对象数量
  • L为叶子节点区域能容纳的游戏对象数量

可以看出,理论上,地图越大,QuadTree优势越明显。

对于QuadTree带邻居关系,还忽略了一个重要问题,就是 非平衡数的邻居数量问题

非平衡数的邻居数量问题

比如下图中,在极端情况,F节点及其子节点持续分裂,一直分裂到4单位长宽大小的区域,才停止分裂(不好画自己想象)

图1

则E节点会有很多邻居。

如果是1024*1024的地图,则E节点会有128个邻居;如果是8192*8192的地图,则E节点会有1024个邻居。

因此,算法中,要对这种情况做特殊处理。

比如,如果E节点邻居数超过8个,则这里的AOI处理,使用经典四叉树算法。

这篇关于服务器3D场景建模(七):四叉树的邻居关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/373756

相关文章

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

MYSQL关联关系查询方式

《MYSQL关联关系查询方式》文章详细介绍了MySQL中如何使用内连接和左外连接进行表的关联查询,并展示了如何选择列和使用别名,文章还提供了一些关于查询优化的建议,并鼓励读者参考和支持脚本之家... 目录mysql关联关系查询关联关系查询这个查询做了以下几件事MySQL自关联查询总结MYSQL关联关系查询

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2