首页 > 其他分享 >UE 5 NavMesh 烘培 逻辑流程

UE 5 NavMesh 烘培 逻辑流程

时间:2023-08-16 18:14:31浏览次数:32  
标签:NavMesh void 调用 FRecastNavMeshGenerator FAsyncTask 烘培 FRecastTileGenerator UE

  关于UE引擎层面的东西:

  1. 在向场景重拖入一个NavMeshBoundsVolume时(或者修改时). 会调用
void UNavigationSystemV1::PerformNavigationBoundsUpdate(const TArray& UpdateRequests) 然后会 创建/更新 一个NavigationData Actor对象到场景中, 名字默认是RecastNavMesh-Default 0 0 0
  1. 在增加NavMeshBoundsVolume后的调用堆栈如下. 可以看到最后是把请求放到了PendingDirtyTiles里了. 走异步烘培
void UNavigationSystemV1::PerformNavigationBoundsUpdate void ANavigationData::OnNavigationBoundsChanged NavDataGenerator->OnNavigationBoundsChanged(); void FRecastNavMeshGenerator::OnNavigationBoundsChanged() void FRecastNavMeshGenerator::MarkDirtyTiles -> PendingDirtyTiles
  1. 异步烘培的驱动堆栈如下, 可以看到是从World的Tick到ProcessTileTasksAsyncAndGetUpdatedTiles函数里. 这个函数里取出来PendingDirtyTiles里记录的异步请求. 执行
TArray FRecastNavMeshGenerator::ProcessTileTasksAsyncAndGetUpdatedTiles TArray FRecastNavMeshGenerator::ProcessTileTasksAndGetUpdatedTiles void FRecastNavMeshGenerator::TickAsyncBuild(float DeltaSeconds) void UNavigationSystemV1::Tick void UWorld::Tick
  1. 在ProcessTileTasksAsyncAndGetUpdatedTiles函数里创建了一个TileTask(调用CreateTileGenerator函数构造一个Generator初始化了Task)
0 上面这一行很关键,一点点的解释下; 1) 查看FRecastTileGeneratorTask的定义, 可以看到FRecastTileGeneratorTask其实是一个FAsyncTask 0 2) MakeUnique 是个模板函数, 功能是首先调用CreateTileGenerator(PendingElement.Coord, PendingElement.DirtyAreas)这个函数, 用它的返回值作为参数构造FRecastTileGeneratorTask 也就是构造FAsyncTask 0   3) FRecastNavMeshGenerator::CreateTileGenerator这个函数接受了coord和dirtyAreas作为参数, 调用了另外一个模板函数ConstuctTileGeneratorImpl. 返回一个TSharedRef 类型 0 4) 接着看ConstuctTileGeneratorImpl模板函数, 使用this指针, 也就是FRecastNavMeshGenerator和Coord参数构造了一个FRecastTileGenerator, 并调用了FRecastTileGenerator的Setup函数, 传入了this和DirtyAreas参数. 然后把完成初始化的FRecastTileGenerator返回出去. 0 0 0 0 5) 然后回到2)步里创建Task的过程里. 使用CreateTileGenerator返回的TSharedRef作为参数构造了FAsyncTask 然后看FAsyncTask的构造函数, 可以看到FAsyncTask是一个模板类, 含有一个TTask Task成员, 就是模板的类型FRecastTileGeneratorWrapper, 构造函数里把接收到的参数传递给了Task的构造函数 也就是FRecastTileGeneratorWrapper的构造函数, FRecastTileGeneratorWrapper里的TileGenerator成员就被初始化成4)里构造并调用过Setup的FRecastTileGenerator对象了. 0 0 6) 综上, 就完成了一个FAsyncTask的构建, 其中持有了一个FRecastTileGenerator的实例. 也就是TileGenerator成员. 7) 构造完成后, 通过调用TileTask.Release方法, 从智能指针处获得FRecastTileGeneratorTask* 指针. 赋值给RunningElement的AsyncTask对象. 然后就可以拿AsyncTask来调用同步或者异步接口. 调用完成后把RunningElement塞到RunningDirtyTiles里缓存. 并从PendingDiryTiles里移除. 0 0 0   8) 然后就是FAsyncTask的异步Work调度逻辑了   0 0 异步的话 0 0 0 9) 由于Task是FRecastTileGeneratorWrapper 所以是调用了这里. 0 然后是FRecastTileGenerator的这里 0 然后是这里. 调用GenerateNavigationData 0   具体的烘培逻辑
  1. UE的NavMesh烘培代码入口在 bool FRecastTileGenerator::GenerateTile()
  2. 主要烘培代码:
bool FRecastTileGenerator::GenerateNavigationData(FNavMeshBuildContext& BuildContext) bool FRecastTileGenerator::GenerateNavigationDataLayer(FNavMeshBuildContext& BuildContext, FTileCacheCompressor& TileCompressor, FTileCacheAllocator& GenNavAllocator, FTileGenerationContext& GenerationContext, int32 LayerIdx)
  1. 烘培完成后数据存储:
0
  1. 逻辑流程参考Recast是走的Sample_TempObstacles流程, 但在烘培区域时, 参考的是Sample_TileMesh的RC_REGION_WATERSHED
                               

标签:NavMesh,void,调用,FRecastNavMeshGenerator,FAsyncTask,烘培,FRecastTileGenerator,UE
From: https://www.cnblogs.com/wmalloc/p/17635833.html

相关文章

  • 前端vue使用blob下载流文件
    请求后端接口,发现返回的是这么一堆东西 代码:axios:exportfunctionexportEcoCarAppoint(params){returnHttp({url:'/api/jsis/ecoCarAppoint/exportEcoCarAppoint',method:'POST',data:params,responseType:'blob',//设置响应......
  • vue-treeselect 校验失败添加红框
    需求vue-treeselect校验及清除校验这篇介绍了用@input在校验失败时显示校验信息。但还需要同时显示红色边框。如下图所示:解决办法思路:动态绑定类名,校验失败时切换类名,更改边框颜色。子组件SelectTree二次封装vue-treeselect:组件SelectTree<template><divclass=......
  • jquery mobile 初探
    现在已经进入了移动web时代。所以现在的mobile的js框架也开始流行。浏览器有一个好处:不用区分安卓还是iOS,也不用下载app。随着框架和控件的日益增多,应用将更加丰富。比较著名的如:jquerymobile,Moobile(基于mooltools框架)TheMProject,senchatouch(继承ExtJS4的应用程序MVC架构),Ti......
  • $ jquery 选择器的使用
    一、$()函数【jquery()】用途包装DOM元素,以便于操作(jquery选择器)作为几个通用的实用工具函数的命名空间前缀,例如,删除字符串前后空格的实用函数,其调用方法如:$.trim(str);文档就绪处理程序:包装文档实例,然后调用ready()方法,当文档为操作准备就绪的时候就执行该函数创建DOM元素,通......
  • springmvc 开启异步请求报错 Java code using the Servlet API or by adding "true"
    报错内容:java.lang.IllegalStateException:Asyncsupportmustbeenabledonaservletandforallfiltersinvolvedinasyncrequestprocessing.ThisisdoneinJavacodeusingtheServletAPIorbyadding"true"toservletandfilterdeclarationsin......
  • jquery.ui的bxslider控件在IE下使用的问题
    使用了 bxslider控件进行网页的切换。发现在firefox切换得很稳定,按照设置的切换时间进行切换。但是换成IE浏览器发现,却不是那么回事了。包括IE8和IE10.明明设置了30秒有的时候10分钟都不切换,本以为切换失灵了,结果又在第11分钟切换了。但是刷新页面再来一次,可能又变成5分钟后切换......
  • vue-router 配置
    1.安装   npminstallvue-router--save  vue2会有版本兼容问题:[email protected].配置  在src文件夹下新建router文件夹,在router文件夹中新建index.js//导入路由对象importRouterfrom'vue-router'//vue-router是插件所以我们用Vue.use......
  • 在不利用vue实现循环数据输入到表格
    如果您不使用Vue或其他前端框架,可以使用原生的JavaScript来实现将循环数据输入到表格中的操作。首先,您需要一个包含要展示数据的数组。然后,使用JavaScript循环遍历数据数组,动态创建表格的行和单元格,并将数据填充到相应的单元格中。下面是一个示例代码,展示了如何使用JavaScript将......
  • Vue 生命周期
    生命周期生命周期函数定义的位置与data属性、methods属性平级beforeCreate在Vue实例创建之前,data中的数据和methods中的方法并没有初始化,所以它不能被调用在created生命周期函数中,data中的数据和methods中的方法已经被初始化完成,可以在页面中调用......
  • Vue 样式绑定
    绑定HTMLclass:class (v-bind:class 的缩写) :class 指令也可以和一般的 class attribute共存绑定的对象并不一定需要写成内联字面量的形式,也可以直接绑定一个对象可以给 :class 绑定一个数组来渲染多个CSSclass绑定内联样式:style 支持绑定JavaScript对象......