bAllowCPUAccess 动态修改 StaticMesh 数据

bAllowCPUAccess

在虚幻引擎中,StaticMesh 是一种静态网格模型,用于代表游戏世界中的静态对象,如墙壁、建筑、装饰物等。其中的 bAllowCPUAccess 是一个属性,控制着是否允许在 CPU 端(中央处理器)进行对该 StaticMesh 的访问。

具体来说:

  • bAllowCPUAccess:这是一个布尔值(Boolean),默认情况下通常是关闭的(False)。当该属性设置为 True 时,表示允许在 CPU 端访问该 StaticMesh 的数据。这通常用于需要动态修改 StaticMesh 数据的情况,比如在运行时更新 StaticMesh 的顶点数据或其他属性。

使用场景包括:

  1. 碰撞检测:有时需要在运行时修改 StaticMesh 的碰撞体积或碰撞属性。
  2. 动态效果:例如通过脚本或游戏逻辑改变 StaticMesh 的外观或位置。
  3. 优化和调试:在开发阶段,允许 CPU 访问可以帮助调试和优化 StaticMesh 的使用。

#if WITH_EDITOR
#else
    if (!StaticMeshComponent->GetStaticMesh()->bAllowCPUAccess)
    {
        UE_LOG(LogTemp, Warning, TEXT("staic mesh must set bAllowCPUAccess true"));
    }
#endif

这就是为了判断staticmesh是否通过bAllowCPUAccess控制PositionVertexBuffer回收的,这里我们肯定不能让PositionVertexBuffer回收,因为我们还要获取数据,好在UE给我们提供了功能,在编辑器中选中要控制的mesh,将其属性的bAllowCPUAccess 设为true

https://img2024.cnblogs.com/blog/2903016/202406/2903016-20240620154101014-1397374238.png

当系统打包后运行,获取到的PositionVertexBuffer都是空的,最后造成数据溢出崩溃,原来是UE在系统打包发布的版本,为了优化会把PositionVertexBuffer内容回收,这就造成数据丢失。相信大家在我的代码里会看见这段代码:

OK,问题解决,当再次打包后运行,系统正常!但还是以功能换性能的平衡性的设置,当我们设置bAllowCPUAccess 为true时,顶点数据会一直存在内存中,只需要将需要的mesh设为bAllowCPUAccess 即可,如果全部设为true有点得不偿失。


需要注意的是,开启 bAllowCPUAccess 可能会带来性能开销,因为这可能导致对 StaticMesh 数据的频繁读写操作,而不是通过更高效的 GPU 访问。

总结来说,bAllowCPUAccess 是控制虚幻引擎中 StaticMesh 是否允许在 CPU 端访问的属性,用于需要动态修改 StaticMesh 数据的特定情况下。

posted @ 2024-06-20 15:42  Dream_moon  阅读(174)  评论(0)    收藏  举报