当前位置: 首页 > article >正文

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)是否开启

  • 是否使用了动画混合曲线


http://www.kler.cn/a/3437.html

相关文章:

  • 【Postgres_Python】使用python脚本批量创建和导入多个PG数据库
  • C#集合操作优化:高效实现批量添加与删除
  • 使用 Python 获取 1688 商品快递费用 API 接口的示例代码解析
  • Genetic Prompt Search via Exploiting Language Model Probabilities
  • 在 CentOS 7.9 上编译 Nginx 并启用 SSL 模块时遇到缺少 OpenSSL 源码的编译问题及解决方案
  • 《安富莱嵌入式周报》第349期:VSCode正式支持Matlab调试,DIY录音室级麦克风,开源流体吊坠,物联网在军工领域的应用,Unicode字符压缩解压
  • 十二届蓝桥杯省赛c++(下)
  • 如何理解IO的同步、异步、阻塞、非阻塞
  • WLAN速度突然变慢
  • 全网最火爆,Python接口自动化测试-接口依赖处理解决方案(超详细)
  • 处理数组循环中删除元素导致索引错位情况
  • 实战!手把手教你实现学成在线网站首页案例【详细源码】
  • Day909.MySQL 不同的自增 id 达到上限以后的行为 -MySQL实战
  • QT开发学习笔记(Qt 控制 BEEP)
  • TiDB入门篇-模拟生产集群部署
  • WinForm | C# 弹出简易的消息提示框 (仿Android Toast消息提示)
  • 【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS
  • SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
  • 一文分析RISC-V Linux启动之页表创建
  • 人工智能能否取代软硬件开发工程师
  • ubuntu下使用GCC开发单片机的过程
  • 【数据结构】栈和队列
  • git为什么要先commit,然后pull,最后再push?而不是commit完直接push?
  • 【C++】类和对象(三)
  • Spring6 - (03) Spring 入门程序
  • 一文吃透SpringBoot整合mybatis-plus(保姆式教程)