UE4 物理系统的调试

Viewed 7

说明

  • 本文主要目的在于总结、记录和分享对 UE4 的物理进行调试的方法。
  • 本文不涉及对 UE4 物理系统原理机制的探讨分析,有兴趣者可参阅 基于 PhysX 的 UE4 物理系统原理机制源码剖析
  • 本文大部分内容原则上仅适用于 UE4 ,因为 UE5 已经废弃了 PhysX,改用 Chaos 。

源码调试

说明

  • PhysX 库的 PhysXLibraryMode 必须跟 UE 引擎的 UnrealTargetConfiguration 匹配,否则可能无法正常命中断点。
  • 在 PhysX.Build.cs 的 GetPhysXLibraryMode 函数中 可以看到 UnrealTargetConfiguration 与 PhysXLibraryMode 的对应关系


7mbukbef6tlakj934v1tleounl.png

  • UE4.27 的 PhysX 默认用的 Profile ,对应的 UE 需要是 Test


0aep9n5940q8f6mdtfedlk8vv5.png


26cegoenqb5hrmpsa0lajobv8h.png

  • 建议编译出 Checked 的 PhysX 库,配合 Debug 的 UE4 进行调试。
  • 如果需要使用 Debug 的 PhysX 库的话,需要开启 bDebugBuildsActuallyUseDebugCRT ,这会导致很多其他的插件无法通过编译。


6khh9a1l1o1j20smuvei5up65l.png

环境

  • 安装 VS2015。
  • 记得选装对应 SDK :WIN 10 SDK 10.0.14393.0

编译

  • (可选)修改代码以屏蔽无关逻辑和报错
  • 打开 BuildPhysX.Automation.cs,注释掉 [RequireP4]


3064hhk432tclhf1n9btrstktd.png

  • 不改的话可能出现 P4(Perforce) 相关的报错
  • (可选)生成 PhysX 的工程文件
  • 通过路径\Engine\Source\ThirdParty\PhysX3\GenerateProjects_UAT.bat 生成工程文件
  • 修改配置以准备编译 Checked 的 PhysX 库
  • 修改 Engine/Source/ThirdParty/PhysX3/BuildProfile_Win64.bat ,把 -TargetConfigs=profile 改成 -TargetConfigs=release+profile+checked
  • 主要加上 checked 以编译出跟 Debug 的 UE 引擎一致的可断点调试的库,也编译 profile 库的目的在于后文提及的通过 PVD 进行可视化调试。
  • 在命令行下运行 BuildProfile_Win64.bat ,编译 PhysX 库

调试

  • 打开 PhysX 相关代码,设置断点。
  • 解决方案中默认不会显示 PhysX 相关源码。
  • 对于 Rider 等 IDE ,可通过在目录里查找 PhysX 相关代码来打开相关文件。
  • 也可直接把相关代码拖到 IDE 中,进行断点设置。
  • 还可以通过 UE 已有代码逐步 Debug 进入 PhysX 源码。
  • 断点效果展示
  • 以对 physx::NpScene::addActor 下断点为例


image.png
可视化调试

基于 UE 命令查看碰撞信息

  • Eject 下的 show collision
  • 在编辑器中, F8(Eject)模式下,在 viewpoint 视图的左上角点击 show 后勾选 collision 可显示碰撞信息。


1r767j4oo24bjrheteis9tkgiq.png

  • 控制台下输入 show collision 命令


3rit1buu6kscho4354ml9kaf4s.png

  • 控制台下输入 PXVIS COLLISION 命令


0thh1lf24v2aprl4hvkfio9tgf.png

  • 控制台下更多相关命令
  • 详见:FPhysScene::ExecPxVis


3afpiev7mvva2strc9aqjljli2.png

基于 PVD 对物理进行可视化分析

效果预览


6s265072iunqh9f58itkv56qt2.png

下载

  • 需要先登录(注册等不需要收费)
  • 在文件列表中找到 PhysX Visual Debugger 进行下载。


4258nj7qtm13qo3id9tq2eobud.png

  • 下载后安装即可(安装没什么特别要求,默认即可)

使用

  • 前置条件
  • PhysX 库必须在编译时开启 PX_SUPPORT_PVD 才能使用 PVD(PhysX 库的 Debug 和 Profile 版本会开启该宏)。
  • 如果 PhysX 库 不满足该要求,可自行编译,方法见:源码调试
  • 启动
  • 需要先启动 Physx Visual Debugger 工具再连接 PVD 。


4f7und9otgrbg0t4t6uqvo0maf.png

  • 连接
  • 可通过命令行参数连接 Physx Visual Debugger 工具。
  • 可以给可执行文件添加命令行参数“-pvd”来让其启动后自动连接 PVD
  • 如对于 exe,可创建快捷方式后,右键快捷方式,在目标后添加“ -pvd”


4pe3eeb7flu0ctr4hkjt1s492v.png

  • 可以在控制台输入命令来自动连接 PVD
  • 效果


4plmqaa3gsc4v3k11om9upv94d.png


7v1se6j2t1mim7nqhsonabr0fn.png

  • 命令
  • pvd CONNECT
  • 连接本机正在运行的 PVD (编辑器或 standalone 均可)
  • pvd CONNECT x.x.x.x
  • 使用默认端口 5425 连接到 ip 为 x.x.x.x 的设备上的 PVD
  • pvd CONNECT NODEBUG x.x.x.x
  • 同上,仅用于 profile 和 meomry,不做绘制
  • 断开
  • 连接太久开销较大,且会增大 PVD 崩溃的概率,所以必要时可手动断开连接。
  • 在控制台输入 pvd DISCONNECT 以断开(停止) UE 与 PVD 的连接。
  • 默认情况下,停止游戏也会自动断开与 PVD 的连接。

使用说明

  • Render
  • 调试渲染选项卡显示 PhysX 所看到的世界。默认情况下提供了自由模式相机。但是,如果应用程序通过其他 API(例如 APEX)提供了带有相机的 PVD SDK,则也可以使用该相机。


5eb7vd2v0pfai0red8pgqom6d2.png

  • 颜色说明
  • 静态刚性(Static rigid)演员( actors)标为红色;
  • PxRigidStatic


微信截图_20230731203118.png

  • 休眠的动态刚性体(dynamic rigid bodies)标为橙色;
  • PxRigidDynamic


微信截图_20230731203140.png

  • 活动的动态刚性体用不同的绿色阴影标记;
  • PxRigidDynamic


微信截图_20230731203155.png

  • 运动学(kinematic)演员标为蓝色。
  • 光线投射(Raycasts)呈绿色线条,击中点呈蓝色矢量。


7511pkran2hf6rvbn8vo2t4jr5.png

  • 重叠场景查询(Overlap scene queries)呈绿色线条。


1edjpnak94lhls2djp07gjh2dv.png

  • 边界框呈白色。
  • 质心向量以红/绿/蓝色绘制。

  • 速度向量呈白色箭头。


1nvf2k5e8p9kk9udfut50n49ug.png

  • 关节呈绿色。


微信截图_20230731203220.png

  • 粒子系统呈青色。
  • 流体粒子呈蓝色。
  • Thread Profiler
  • 线程分析器显示与性能视图相同的性能信息,但按线程对事件进行分组。


5dt38qem2kf559qm319inph8b4.png

  • Memory View
  • PhysX/APEX SDK 具有分配回调,因此这两个 SDK 进行的所有分配和释放均通过 PVD SDK 记录并显示在 PVD 中。 该小部件单独显示每个帧的信息,因此只有在当前帧期间进行的分配/解除分配可见。 “文件”列显示每个分配/释放的来源,包含文件和行号信息。 “Churn”列显示此帧已分配但未释放的内存量。 “已分配”/“已释放”列以人类可读的格式显示内存量以及当前帧期间此类事件的计数


60798lg6opn28em2uitct2j353.png

  • Profile
  • 当 clips(3.0 以上)具有此类信息时,性能视图会显示性能信息。 该小部件提供时间(水平轴)与多个事件持续时间(垂直轴)的关系。 由于 PhysX/APEX 可以使用多个线程进行计算,因此来自这些线程的事件被组织在一级树结构中,从而允许单独分析每个线程。 事件呈现为绿色矩形条。 事件最初按事件首次出现排序。 每个条都有一个可用的上下文菜单,其中包含一个用于绘制 clips 中所有帧中条的持续时间的命令。


29flrp5efv09egkvsfcmvpqf56.png
相关链接

**声明:**本文来自公众号:GameDevLearning,转载请附上原文链接(https://mp.weixin.qq.com/s/WKzNa1tZ5rAAlkmckhDR8A)及本声明。

0 Answers