Profiling with Purpose: Performance Lessons from a Real Unreal Project | Tutorial 学习了一下这个视频,试着用里边介绍的 Chaos Visual Debugger 录了一下我自己的项目,发现如下边图1所示(只显示了 Complex),有半透和不半透的区别,我理解应该是半透是QueryOnly(也就是没有Physics),不透明
是CollisionEnable的,也就是有 Physics;想问下如果只是 QueryOnly,那么有 Complex的碰撞会对性能有影响么,就是如果没有physics,还会有下边这个介绍里说的,需要 bake trimesh 的 Memory消耗么。以及我录了一下utrace,也没有发现视频里说的 InstanceStaticMesh 的性能消耗很大的问题,不知道是不是因为是 QuetyOnly。
[Image Removed]
还有第三个问题是,UE4上,没有 p.Chaos.StartVDRecording,有什么好的办法运行时看看游戏包上的复杂碰撞什么效果么
[Attachment Removed]
RoryXY
(Xiao Yue)
2
您好,
Chaos Visual Debugger中半透物体是QueryOnly的, 这部分物体虽不参与物理模拟(刚体碰撞), 但仍参与场景查询, line trace, sweep, overlap等.
如果模型碰撞复杂度设置的是Simple And Complex或者Use Complex Collision As Simple, 那在做查询时, 仍可以选择用复杂碰撞体做穿插检测, 碰撞计算开销更高, 也有trimesh的内存消耗. 对穿插检测精确度要求不太高的物体, 还是需要尽量少开复杂碰撞, 或控制好复杂碰撞体的模型面数. 可以试试在项目设置的Default Shape Complexity上, 把默认的碰撞复杂度设置为Use Simple Collision As Complex, 只在必要物体的static mesh asset上单独设置, 打开复杂碰撞.
UE4.27之前, 物理引擎应该还是physX, physX有自己的外部visual debugger工具, 可以参考 https://forums.developer.nvidia.com/t/visual-studio-debugger-on-the-physx-code-running-inside-ue4/39615 或者, 也可以用show Collision命令快速查看碰撞体效果.
[Attachment Removed]
也就是说如果项目的Cpmlexity设置为 UseSimpleAsComplex,然后对应StaticMesh上选择default,那么就不会有 TriMesh 的内存消耗么,这部分我不太懂,是三角面片自身有一部分内存A,然后用于物理查询的,还有另一部分内存B,然后这里讨论的可以优化掉内存B么
[Attachment Removed]
RoryXY
(Xiao Yue)
4
简单碰撞包括隐式形状(球, 胶囊体, 方盒)和凸包, 隐式形状只有参数描述不是三角面几何体, 比如球是用位置和半径来描述, 凸包是没有凹面的更易于做穿插检测的特定几何体;
复杂碰撞一般由渲染模型简化而来, 可以是任意形状的三角面几何体. 如果是非Nanite模型, 一般选定某一级LOD模型做复杂碰撞(LOD For Collision参数设置), 如果是Nanite模型, 默认用的是fallback模型, 可以通过设置fallback triangle percent简化. 还有一个选项是可以指定另一个static mesh做复杂碰撞的替代物体(static mesh上的Complex Collision Mesh选项).
物理场景和渲染场景是不一样的, 截图注释中的ignoring the trimesh, 就如你所说, 物理场景中没有B部分存储复杂三角面碰撞的开销.
UseSimpleAsComplex,只存简单碰撞, 查询时即使勾选TraceComplex也用简单碰撞;
SimpleAndComplex, 同时存简单和复杂碰撞, 查询时根据选项看trace哪种碰撞;
UseComplexAsSimple, 只用复杂碰撞.
也可以参考下这文章: 技术美术的Chaos性能优化指南
[Attachment Removed]
如果复杂碰撞一般由渲染模型简化而来,不会因为要渲染所以整个mesh都在内存里,所以碰撞的trimesh也就在内存里了么,还是一个是CPU内存,一个是显存,两个没关系
[Attachment Removed]
RoryXY
(Xiao Yue)
6
渲染和物理是分开的, 复杂碰撞的三角面信息可能和渲染模型不一样, 且二者的用途 streaming机制也不一样. 渲染数据存在FStaticMeshRenderData里, 面向GPU, 包括材质section, LOD chain, nanite结构, raytracing代理等等; 复杂碰撞是基于源模型cook来的, 碰撞数据存在UBodySetup里, 用于CPU碰撞求交, 可被多个BodyInstance实例共享, 具体参考 UBodySetup::CreatePhysicsMeshes.
[Attachment Removed]
那是不是可以理解为官方比较推荐项目设置里改为 UseSimpleCollisionAsComplex,然后需要复杂碰撞的(比如IK),在对应Mesh上改为使用复杂碰撞?
但是这样感觉所有可以踩的Mesh都要单独调整有点麻烦
[Attachment Removed]
RoryXY
(Xiao Yue)
8
不是所有项目都推荐这样设置, 只是如果CPU上的物理开销比较高, 需要严格把控复杂碰撞的使用, 可以这样改下. 但如果大部分物件都同时用到了复杂碰撞和简单碰撞, 也可以保持默认的SimpleAndComplex, 注意碰撞体的优化即可, 控制好复杂碰撞或凸包的面数等.
[Attachment Removed]