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

四叉树的邻居节点?

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

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

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

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

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

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

图2,某AOI操作:

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

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

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

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

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

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

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

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

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

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

以上。

3种AOI对比

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

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

上图,

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

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

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

非平衡数的邻居数量问题

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

则E节点会有很多邻居。

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

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

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

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

  1. 服务器3D场景建模(二):Physx与PVD

    建模思路 目前流行的几大物理引擎库均可以用来做服务器端的3D场景建模. 这里选择使用physx.因为untiy3d内置的物理引擎也是physx.减少学习沟通成本. 通常服务器3D场景建模的运作方式有种 ...

  2. 服务器3D场景建模(九):RecastNavigation之Detour数据结构

    dtNavMesh dtNavMesh是Detour中表达3D场景的数据结构. 作者给的注释为: /// A navigation mesh based on tiles of convex poly ...

  3. 服务器3D场景建模(六):RecastNavigation介绍

    RecastNavigation RecastNavigation是一款非常强大的寻路系统,被广泛的应用于各大游戏引擎中.如Unreal, Unity等. github网址:https://githu ...

  4. 服务器3D场景建模(一):PyOpenGL

    测试环境搭建 方便服务器端做3D建模,需要一些测试方法. 目前比较流行的是Untiy3D做客户端开发.考虑到Untiy3D比较重,服务器端辅助测试3D建模的,一般需要比较轻便的方式. 所以首选使用的是 ...

  5. 游戏行业中3D设计都有哪些职位?3D场景建模该如何学习?

    游戏行业中的3D美术设计呢,分为场景设计,以及角色设计. 3D场景建模师 场景则是游戏中的环境.机械.道具等死物.场景开始对美术的要求没有那么高,只要熟练运用3D软件就行了. 逐步掌握游戏场景元素设计 ...

  6. 有哪些知识是学习3D场景建模必备的?

    1.场景建模的知识点 视角范围:视角范围是玩家在游戏中所能看到的游戏场景的范围,视角是随着玩家的移动不停变换的,基于这点才有了场景分块的必要性. 场景分块:在游戏中不管你的视角在哪个位置,可能你的视角 ...

  7. 入门3D游戏建模,是选择角色建模还是场景建模,看完你来选

    3D场景建模师 场景则是游戏中的环境.机械.道具等死物.场景开始对美术的要求没有那么高,只要熟练运用3D软件就行了. 逐步掌握游戏场景元素设计理念,不同风格游戏的制作方法.着重学习材质处理技法,能够根 ...

  8. 3D游戏建模是吃青春饭的吗? 3d建模薪资多少

    一 本文总序 关于3D建模,尤其是3D游戏建模这一块,我将会系统的从以下九个方面谈一下. 包括:谈实力,谈学习,谈时间,谈青春,谈难易,谈职位,谈工资,谈行业,谈选择.希望能够解决大家思想上困扰,对未 ...

  9. 想知道3D游戏建模师每天都在做什么吗?3D游戏建模的那些事

    想知道3D游戏建模师每天都在做什么吗?3D游戏建模的那些事 1.建模师的主要工作? 在游戏公司里,游戏建模主要分为3D场景建模和3D角色建模. 3D场景师的工作是根据原画设定及策划要求制作符合要求的3 ...

  10. 全套3D游戏建模自学资料

    建模通俗来说,就是将一个抽象.扁平化的东西立体化.具象化.举个例子,你在草稿上画了一个动漫人物,然后我将你这张画在三维软件里做出来,让它呈现出360°可观察的真实立体视角,也就是将二维转化为三维. 3 ...

最新文章

  1. js 动态校验开始结束时间
  2. Android调试的必杀技——反汇编
  3. java comet_用java实现comet,基于 HTTP长连接的实现,用于从服务端实时发送信息到客户端...
  4. java教务系统类设计_基于Java EE体系的高校教务管理系统的设计开发
  5. android注册广播监听按钮,Android实现广播监听HOME键操作
  6. Proteus仿真单片机:51单片机的仿真
  7. foxitreadersdk 打开远程文件_一种最不为人知最简单最方便的用电脑操作手机上的文件...
  8. 性能优化挑战重重,鲲鹏 HPC 如何突破算力桎梏?
  9. rmmod不能卸载驱动
  10. C#使用Google翻译实现在线翻译
  11. 数据库系统原理——实验一
  12. linux读usb蓝牙数据,嵌入式Linux下USB蓝牙设备驱动.pdf
  13. TimusOJ - 1225.Flags 1119.Metr 1009.K-based Numbers (DP简单题)
  14. j计算机屏幕关闭时间,win7如何设置自动关闭电脑屏幕的时间?
  15. 4只鸭子在同一个圆圈内游泳,问:4只鸭子出现在同一个半圆内的概率是多少?Python模拟
  16. 分布式计算、云计算与大数据
  17. Python 1-10 字符串操作
  18. python实现外星人入侵——3.事件分析
  19. 深度挖掘:FIashGet下载隐藏链接[转]
  20. 商家如何更改拼多多上货助手价格?上货助手修改价格详细步骤

热门文章

  1. cs231n-Lecture1
  2. match-case的使用
  3. 地址消毒器ASAN学习笔记
  4. Andersen Global宣布与荷兰事务所达成合作协议
  5. 因子研究系列之一 -- 估值和资本结构因子
  6. fasttext训练的bin格式词向量转换为vec格式词向量
  7. Delphi - cxGrid颜色显示相关设置
  8. 50万怎么开通融资融券账户?两融利率最低多少?
  9. 操作系统类型与基本概念
  10. bootstrap制作的表单获取月份