在 UE4 中剖析时遇到的第一个问题是应该使用什么样的版本配置。剖析 GPU 时,我们希望 CPU 性能足够快,可以不影响到剖析过程。当然,应该避免使用调试版本进行剖析,因为引擎代码不是在启用优化的情况下编译的。
要注意,开发版本比测试或交付版本有更高的 CPU 开销。但仍然可以方便地对开发版本进行剖析。为了减少开发版本中的 CPU 开销,应关闭 CPU 端任何不必要的开销,并避免在编辑器中剖析。可以使用 -game 命令行参数使编辑器作为游戏运行。下面的命令行是一个示例,其中使用了 -game 并禁用了剖析所不需要的 CPU 开销。
剖析时考虑使用测试版本
测试版本比开发版本开销更低,同时仍然提供了一些开发者功能。考虑在引擎的 Build.h 文件中为测试版本启用 STATS,以便 UE4 的live GPU profiler(stat GPU)可用。同样,考虑启用 ALLOW_PROFILEGPU_IN_TEST,以便 ProfileGPU 可用。在内置剖析工具一节中将提供有关 stat GPU 和 Profile GPU 的更多详细信息。
独立可执行文件的测试版本需要 cooked 内容。如果您需要在剖析时进行迭代,但希望测试版本既有较低的 CPU 开销,那么可以考虑使用“cook on the fly (COTF)”。例如,着色器迭代对于 COTF 测试版本就是可能的。 在剖析前执行最后一次检查
还是来说说如何减少 UE4 中的可变性吧,您可能会发现有些东西不依照 -deterministic 命令行参数中的固定随机种子。在 Infiltrator demo 中一些粒子就是这种情况。这些粒子在我们的基准测试中引起了明显的噪音。
降低粒子噪声的解决方案是让随机数生成器使用固定的种子。仅需单击两次您就可以使粒子具有确定性:
1-右键单击粒子发射器,然后单击“Browse to Asset(浏览到资源)”
2-在 Content Browser(内容浏览器)中选择发射器资源后,右键单击它,然后选择“Convert To Seeded(转换为种子)”
就是这样!也可以在 Content Browser (内容浏览器)中选择所有发射器,一次性进行转换。这样操作后,噪音将大大降低,并且可以很容易地评估您的优化。
注意:如果使用的是 Niagara 粒子,请在 UE4.22 官方发布页面中查找“Deterministic Random Number Generation in Niagara”:https://www.unrealengine.com/en-US/blog/unreal-engine-4-22-release 考虑自己制作测试场景
优化一个效果需要实验许多次,每一次迭代都需要时间。我们需要重建游戏、烘焙内容等。UE4 的功能如“cook on the fly (COTF)”可以帮助解决这一问题。但将要优化的效果或技术隔离到一个小应用程序中也很有用。
要是能轻松生成这样的 app 就好了!幸运的是,Unreal 为此提供了一个功能,名为 Migrate(迁移)。它可以提取某个资源及其所有依赖项,并将其导入到任何其他项目中。为了创建一个小应用程序,我们就可以用此功能将这个效果移植到一个空的项目中。
迁移资源的官方文档在此:https://docs.unrealengine.com/en-US/Engine/Content/Browser/UserGuide/Migrate/index.html CPU-bound 还是 GPU-bound?
stat startfile 和 stat stopfile:将 start/stop 持续时间内的所有实时 stat 数据转储到一个 .ue4stats 文件,可以在 Unreal Frontend 中打开:https://docs.unrealengine.com/en-US/Engine/Deployment/UnrealFrontend/index.html
具有相同“User Event(用户事件)”信息和非常相似“Duration(持续时间)”的相同事件在帧期间接连发生两次(事件 ID 2527 vs 事件 ID 2529)。这表明这两个事件彼此密切相关;它们甚至可能是针对不同输入或输出的完全相同的操作。如果这是真的,在优化第一个事件时产生的任何节省也可能影响第二个事件,把效果扩展到原来的2倍。