COPY 一种接近最优的导航网格生成算法以及基于导航网格的寻路算法

2023-05-16

提出背景:

长距离寻路会出现掉帧现象,为了提高寻路速度,并为3D环境中的寻路方案提供基础算法实现。

 

目前状况:

由于3D游戏对帧率要求很高,而在游戏中进行一次长距离的寻路可能要花费8-10帧的时间,在地图复杂的情况下寻路时间甚至可能会更严重,而在这段时间,渲染循环会暂停渲染并等待寻路结果。会给玩家带来不流畅的操作体验。

特别是3D游戏中地图比较复杂,地图规模比较大,对于一张600*600的地图,寻路的搜索空间的节点数目有可能达到数十万之多,这给传统的A*寻路算法提出了挑战,如果地图比较复杂,直接在这些节点上直接寻路的时间可能会以秒来计算。

 

解决方案:

解决上述问题的方法,可以通过生成导航网格来减少寻路算法的搜索空间。这也是3D世界中最常用的寻路解决方案。

常见的导航网格生成方法有两种,一种是通过手工创建,这需要专门的人员很细心的花费一定的时间来创建。另外一种是通过程序来自动生成,不过稍微复杂一点。这次创新采用了自动生成导航网格的方法。可以通过我们自己的AStarExplore工具,在不改变现有资源的情况下自动生成导航网格。

 

DK Online 中枫林片区地图为例,可通过节点55616个,如下图:

上图为一张435*310的地图,可通过节点55616个

 

通过我们自己的工具自动生成的导航网格(不需要人工手动创建),可通过寻路节点仅为2238个,生成算法采用了Hertel-Mehlhorn算法和3-2Merging算法。

                                                                           自动生成的导航网格。节点数为2238个

 

生成结果显示:可通过节点由原先的55616个节点合并成为了2238个节点。大大减少了寻路时的搜索空间,为更快,更远的路径搜索提供了可能性。

 

                                                                                 

3D空间中的导航网格

 

A*寻路优化:

1、  内存优化:

寻路中,搜索路径耗费的时间并不是最主要的损耗,而是寻路开始时的内存重置,或者是内存的不断分配和释放。由于节点数目的减少,在寻路之前就建立了节点的数组(只占用100-200K内存),使用一个bool的一维数组来标识这些节点是否被搜索过,每次寻路结束之后只需重置这个bool数组即可。

2、  使用二叉堆优化Open表:

使用二叉堆可使最优的节点一直处于堆的顶部,而不用消耗太多的时间在对Open表的排序上,或者遍历Open表查找最优节点上。

 

 

一次中短距离寻路对比:

游戏中实际距离如图A到B的距离。

            

掩码寻路结果                                           导航网格寻路结果

   

             

           掩码寻路耗费时间                 导航网格耗费时间

 

通过对比:一次中短距离的基于原始节点的寻路,寻路时间为1.615ms,遍历节点数284个。而一次基于导航网格的寻路,遍历节点仅为58个,寻路时间只有0.0711毫秒。

 

一次中距离寻路对比:

游戏中实际距离如图A到B的距离。

 

实际寻路时间:     

                            掩码寻路结果                                       导航网格寻路结果

 

通过对比:一次中距离的基于原始节点的寻路,寻路时间为69ms,遍历节点数8393个。而一次基于导航网格的寻路,遍历节点仅为522个,寻路时间只有0.38毫秒。

 

 

一次长距离的寻路对比:

游戏中实际距离如图A到B的距离,寻了一个对角长度。

 

         

                            掩码寻路结果                                       导航网格寻路结果

 

通过对比:一次长距离的基于原始节点的寻路,寻路时间为468ms,遍历节点数46636个。而基于导航网格的寻路,遍历节点仅为2198个,寻路时间只有1.604毫秒。

 

 

 

 

 

扩展:

由于生成导航网格的算法是完全基于3D空间的多边形,可将此算法应用到场景面片当中,生成基于实际场景的导航网格,从而可实现分层寻路。如下图。

 

 

 

参考文献:参考《Ai Game Programming Wisdom》中《建立接近最优的导航网格》文献。

采用了Hertel-Mehlhorn算法和3-2Merging算法建立接近最优的导航网格。

Hertel-Mehlhorn算法

 

3-2Merging算法

 

寻路算法仍然采用A*算法,但搜索空间变成了导航网格。启发函数的计算公式有所改变。

 

G值 = 穿入边中点与穿出边中点的距离。

H值 = 多边形中点到目标点的直线距离。

F值 = G值 + H值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

COPY 一种接近最优的导航网格生成算法以及基于导航网格的寻路算法 的相关文章

随机推荐

  • ESP32接入百度云,在线语音识别

    1开发环境及工具 开发板使用的是ESP32 LyraTv4 3 入下图所示 xff0c 开环境在是在Ubuntu20 04上搭建的ESP IDF xff0c 在ESP IDF中添加了支持语音开发的sdk xff0c ESP ADF 2开发过
  • ARM 7 三级 中断流水线

    ARM 7 在冯诺依曼 结构的 是三级流水线技术 分别是 取址 译码 执行 当有BL 的指令 执行时 流水线 也会被阻断 在分支指令执行的时候 其后第一条指令 被 解码 第二条 指令 被 取址 xff0c 当前的PC指针是 指在取址这的 x
  • S5PC100 I2C总线

    I2C 使用2根双向信号线来传递数据 SCL 时钟线 SDA 数据线 特点 半双功 xff0c 仅需要2根线 一般在PCU 上占2个PIN I2C 总线 上 都是 oc od 输出 xff0c 所以使用上拉电阻 当总线空闲的时候 都是输出
  • java代码自动生成一(freemarker)

    size 61 large 网上有很多代码自动生成工具 xff0c 如abator和hibernate xff0c 这些工具虽好 xff0c 却没有源码 xff0c 不能修改模板 xff0c 让人很不爽 我刚毕业的时候 xff0c 项目经理
  • linux内核 2.6.35下的驱动例子

    创建 设备节点 mknod dev hello c 字符设备 或者b xff08 块设备 xff09 250 1 查看 cat proc devices 当前设备节点 insmod 安装 rmmod 删除 编译 Makefile 1 需要配
  • E:Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

    出现这个问题的原因可能是有另外一个程序正在运行 xff0c 导致资源被锁不可用 而导致资源被锁的原因 xff0c 可能是上次安装时没正常完成 xff0c 而导致出现此状况 解决方法 xff1a 输入以下命令 sudo rm var cach
  • shell 脚本中的引用问题

    原始代码如下 bin sh myvar 61 34 Hello world 34 echo myvar echo 34 myvar 34 echo 39 myvar 39 echo myvar echo Enter some test re
  • Linux内核的TCP源码入门(一)

    文章目录 前言一 TCP报文段结构1 报文段整体结构2 TCP首部 固定部分3 TCP首部 选项 options 二 TCP接收和发送数据1 TCP的 34 接口 34 2 发送数据3 接收数据3 1 ip层向上调用INET Socket层
  • 【API接口工具】postman-Windows版、Linux安装

    Windows安装 Postman 适用于 Windows 7 及更高版本 下载最新的 Postman 版本 选择并运行该 exe文件以安装 Postman Postman v9 4 是 Postman 的最后一个版本 xff0c 同时支持
  • 四轴飞控DIY调试起飞简明步骤

    四轴飞控DIY调试起飞简明步骤 调试起飞简明步骤Step1 xff1a 飞控配置Step2 xff1a 试飞目标测试内容坐标系 Step3 xff1a 试飞方法1 升降 xff08 Throttle xff09 2 偏航 xff08 yaw
  • PX4模块设计之二十七:LandDetector模块

    PX4模块设计之二十七 xff1a LandDetector模块 1 LandDetector模块简介2 模块入口函数2 1 主入口land detector main2 2 自定义子命令custom command 3 LandDetec
  • 穿越机用途和机架尺寸

    穿越机用途和机架尺寸 1 穿越机的用途2 穿越机的机架3 机架的类型3 1 正X型机架3 2 宽X型机架3 3 长X型机架3 4 Hybrid机架3 5 涵道机架 4 总结 1 穿越机的用途 穿越机按功能分 xff0c 主要分为竞速Race
  • 关于穿越机FPV视频果冻效应的讨论

    关于穿越机FPV视频果冻效应的讨论 1 名词定义2 摄像原理2 1 快门分类2 2 常见传感器2 3 卷帘拍摄 3 产生原因4 解决方法4 1 振动出处4 2 软件方法 辅助作用 4 3 硬件方法 直接办法 5 F450试验机FPV视频问题
  • 四轴飞控DIY Mark4 - 减震

    四轴飞控DIY Mark4 减震 1 DIY Mark42 改进事项2 1 Mark4 5 inches机架2 2 2205 2450KV 无刷电机2 3 电机与机架的TPU防震2 4 飞控防震垫圈2 5 三叶平衡桨 3 试飞效果3 1 视
  • Java的压力测试工具之Jmeter

    size 61 large Apache JMeter是Apache组织开发的基于Java的压力测试工具 用于对软件做压力测试 xff0c 它最初被设计用于Web应用测试但后来扩展到其他测试领域 它可以用于测试静态和动态资源例如静态文件 J
  • 四轴飞控DIY Mark4 - 整理&参数优化

    四轴飞控DIY Mark4 整理 amp 参数优化 1 历程2 参数优化2 1 固件BF4 3 12 2 动态怠速值2 3 滤波参数2 4 电调PWM频率2 5 GPS高度配置2 6 返航速度和高度2 7 线性推力修正2 8 图传频道调整
  • ArduPilot开源飞控系统之简单介绍

    ArduPilot开源飞控系统之简单介绍 1 源由2 了解 amp 阅读2 1 ArduPilot历史2 2 关于GPLv32 3 ArduPilot系统组成2 4 ArduPilot代码结构 3 后续3 1 DIY F4503 2 软件设
  • ArduPilot Kakute F7 AIO DIYF450 之GPS配置

    ArduPilot Kakute F7 AIO DIYF450 之GPS配置 1 源由2 步骤2 1 模块预测试2 2 物理连接2 3 UART配置2 4 Compass使能2 5 GPS使能2 6 校准Compass 3 GPS amp
  • ArduPilot之开源代码框架

    ArduPilot之开源代码框架 1 系统框架2 工程框架2 1 工程目录2 2 代码组成2 3 运行流程 4 硬件传感器总线4 1 I2C4 2 SPI4 3 UART4 4 CAN 5 软件设计概念6 总结7 参考资料 在研读ArduP
  • COPY 一种接近最优的导航网格生成算法以及基于导航网格的寻路算法

    提出背景 xff1a 长距离寻路会出现掉帧现象 xff0c 为了提高寻路速度 xff0c 并为3D环境中的寻路方案提供基础算法实现 目前状况 xff1a 由于3D游戏对帧率要求很高 xff0c 而在游戏中进行一次长距离的寻路可能要花费8 1