UE4 动画蓝图的优化
General Tips
当您开始考虑动画使用的性能时,以下是执行优化时可能需要遵循的一些准则。
确保满足并行更新的条件
在UAnimInstance::NeedsImmediateUpdate中,您可以看到必须满足的所有条件,以避免在游戏线程上运行动画的更新阶段。如果角色移动需要根动画(RootMotion),则无法执行并行更新,因为角色移动不是多线程的。
避免调用蓝图虚拟机
尽量将蓝图逻辑写到C++代码中
确保事件图标尽量少写逻辑,使用自定义的UAnimInstance和FAnimInstanceProxy派生类,并在FAnimInstanceProxy::Update或FAnimInstanceroxy::Evaluate期间在代理中执行所有工作,因为这些操作是在工作线程上执行的。
Ensure that the nodes within your of your Animation Blueprint are structured in a way that they are using Fast Path.
确保动画蓝图的 Anim Graph中的节点以使用“Fast Path”的方式进行结构化。
确保在“项目设置”中启用了“优化动画蓝图成员变量访问(Optimize Anim Blueprint Member Variable Access)”,因为这控制了直接访问其类的成员变量的动画蓝图节点是否应使用优化路径,以避免与蓝图VM发生冲突。
通常,避免调用蓝图虚拟机是AnimGraph执行中性能开销最大的部分,这是从动画蓝图中获得最大性能的关键。
使用 Update Rate Optimizations (URO)
这样可以防止动画过于频繁。如何应用这一点取决于您的游戏,但我们建议将其移动到15帧左右,并在适当的距离下为许多角色更新速率,以及禁用插值。
若要启用,请将骨骼网格组件设置为“启用更新速率优化(Enable Update Rate Optimizations)”,并参考AnimUpdateRateTick()。
也可以选择启用“显示调试更新速率优化”,以启用正在应用的URO的屏幕调试。
开启 Component Use Fixed Skel Bounds
在骨骼网格组件中,启用“组件使用骨骼边界(Component Use Skel Bounds)”选项。
这将跳过使用物理资源,而是始终使用在骨骼网格中定义的固定边界。
这也将跳过重新计算边界体积以对每一帧进行剔除,从而提高性能。
其他需要考虑的东西
在分析项目时,您可能会看到在工作线程完成后,FParallelAnimationCompletionTask正在主线程上为骨骼网格运行。一旦并行更新的条件得到满足,这将是您将在配置文件中看到的大部分主线程工作,通常由以下几部分组成,具体取决于您的设置:
移动组件更新物理
尽量避免为实际上不需要的东西更新物理,因为这将是减少这种情况的关键。
触发动画通知事件.
避免调用蓝图虚拟机
动画通知的处理应该在GameThread上执行,因为这和动画实例的生命周期息息相关。
动画插值优化(URO)是否开启
是否使用了动画混合曲线