深谈UE4粒子系统对象池的惊人大坑

这篇具有很好参考价值的文章主要介绍了深谈UE4粒子系统对象池的惊人大坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

抓手

标题起得很唬人,但一点不唬人。

作者在这里告诫大家,不要使用Cascade的对象池,会有bug,并且不起作用!

建议大家都转成使用Niagara,Niagara的对象池功能齐全,并且没什么bug。

后面会具体说明原因。

同时本文会告诉大家大家具体的使用方法,以及什么情况下需要使用对象池。

本文将基于UE4.26.2的源码进行分析研究。

UE4粒子对象池的大坑

Cascade和Niagara的对象池代码原理几乎一致,但是感觉是两个人写的。(而且是负责Niagara的同学复制Cascade的对象池代码来改改)

所以Niagara有一定的优化,Cascade有坑。

具体的坑,有五个

1、Cascade的对象池没有初始化多少个实例的功能,虽然Cascade的UI上看起来可以设置,但却没有实际功能!而Niagara是有该功能的。

深谈UE4粒子系统对象池的惊人大坑

原因是ParticleSystem类和NiagaraSystem类都继承了父类UFXSystemAsset,都有   

uint32 PoolPrimeSize = 0; 这个变量。但ParticleSystem却没有实现相应的功能。反而NiagaraSystem在Postload方法里调用了 PostLoadPrimePools方法去做这件事。

深谈UE4粒子系统对象池的惊人大坑

2、从Cascade的对象池里取出的实例会重新Register Component。而Niagara则默认不重复register。这样导致Cascade粒子从对象池取出来,照样会浪费CPU的消耗,而且消耗还不低。

在我的机子11代i7 CPU上,regiseter一次Component居然需要花费2ms左右,怎么可能不卡?

 而Niagara的优化:

深谈UE4粒子系统对象池的惊人大坑

 Niagara还注释了为了避免Register/Unregister Component的消耗:深谈UE4粒子系统对象池的惊人大坑

3、即便从Cascade的对象池取出的实例,attach到某个component上仍然调用的是SetupAttachment方法,而不是AttachToCompoent方法。但SetupComponent是构造函数里调用才生效的,所以从Cascade对象池取出的无法正确attach到component上!

深谈UE4粒子系统对象池的惊人大坑

4、调用SpawnEmitterAtLocation方法去Spawn粒子,从Cascade的对象池取出的实例无法正确设置它的transform!因为它调用的是SetRelativeLocation_Direct和SetRelativeRotation_Direct,该方法只能在初始化的时候调用才能起效,因此Niagara改成了SetWorldLocationAndRotation,该方法会后续用tick update的办法去更新位置和rotation。

深谈UE4粒子系统对象池的惊人大坑

深谈UE4粒子系统对象池的惊人大坑

5、Niagara有个小坑,就是AnimNotify_PlayNiagaraEffect是不开启对象池的,如果不想改引擎代码,就只能重载该方法才能使用了。同理,Cascade的AnimNotify_PlayParticleEffect也是。

深谈UE4粒子系统对象池的惊人大坑

Cascade的对象池源码在:

UGameplayStatics.cpp和WorldPSCPool.cpp

Niagara的对象池源码在:

NiagaraFunctionLibrary.cpp和NiagaracomponentPool.cpp

如果细看的话,这两份代码不能说是毫无关系,只能说逻辑几乎一模一样。

如果想用Cascade的对象池,建议按照Niagara的做法把Cascade的bug给修了。具体查看上面的每个对比的点。

具体使用方法(仅介绍Niagara)

初始化对象池:

打开NiagaraSystem,选择System,然后在Selection面板的System Properties ,Performance里的Pool Prime Size,填入大于0的数字:

深谈UE4粒子系统对象池的惊人大坑

但Pool Prime Size大于Max Pool Size,它也只会按Max Pool Size的数量来初始化,所以可以适当调整Max Pool Size数量大于或等于Pool Prime Size数量。

调用代码去Spawn时:

UNiagaraFunctionLibrary::SpawnSystemAttached或SpawnSystemAtLocation方法,在参数里传入ENCPoolMethod::AutoRelease或者ManualRelease才能使用对象池。

  • AutoRelease:在lifetime到时间后自动放回池子里。
  • ManualRelease:意味着后续需要你自己手动调用ReleaseToPool方法才能把特效放回池子里。

蓝图里Spawn:

 Pooling Method选择AutoRelease或者ManualRelease。

深谈UE4粒子系统对象池的惊人大坑

为什么需要使用对象池

        因为UE的粒子在Spawn的时候,ActorComponent需要注册Component,这个时候就会对CPU产生比较大的消耗。

        而使用对象池的优化原理就是,先初始化一定数量的实例在池子里,然后需要的时候再去池子里取,然后在激活使用。

        什么时候需要使用对象池呢?就是同一种粒子特效需要高频播放的时候,或者同时大量播放的时候,那么对象池是对于CPU消耗来说,是个必备良药。代价只是多占了那么点内存嘛,初始化加载时间会多一点点嘛(只要数量不会太夸张,用到成千上万的数量)。

总结:

        对于一个这么大的引擎来说,有这样的bug的确是让人意料之外,但UE也希望大家都使用Niagara,Cascade也在被慢慢遗弃,截止到4.27,Cascade对象池的问题依然存在。而UE5则默认是关闭Cascade的。

        所以本文作者在这里也呼吁大家都直接转为使用Niagara,虽然4.26的Niagara确实还有一些不好用的bug,但如果熟悉了,也是能避免的。并且Niagara更自由了。如果完全不使用对象池,则继续使用Cascade粒子是没问题的。

参考:

Unreal引擎4.26.2源码。文章来源地址https://www.toymoban.com/news/detail-459372.html

到了这里,关于深谈UE4粒子系统对象池的惊人大坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE4/5Niagara粒子特效之拖尾渐变

    目录 开始操作 发射器一的制作 添加新的模块 ​编辑 让粒子长久存在 添加颜色 发射器二的制作 第三人称模板添加Niagara 效果  添加颜色  效果 隐藏第一个发射器 首先创建一个粒子系统,用Fountain这个模板: 将不需要的删除,剩下的就只有需要的初始化的东西,以及添加速

    2024年02月11日
    浏览(56)
  • UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.1->1.4

    目录 1.1-Simple Sprite Emitter ​编辑 发射器更新 粒子生成 粒子更新 1.2-Simple Sprite Emitter 发射器更新   粒子生成  粒子更新 渲染 1.3-Simple GPU Emitter 属性 发射器更新   粒子生成  粒子更新 1.4-Sprite Facing  发射器更新 粒子生成  粒子更新 通过对官方案例的讲解来了解和使用Niag

    2024年02月11日
    浏览(65)
  • UE4/5Niagara粒子特效之Niagara_Particles官方案例:3.3->4.3

    目录 3.3 Visibility Tag  左边的发射器: 发射器更新 粒子生成  粒子更新  右边的发射器 和左边发射器不同的地方 3.4 Texture Sampling  发射器更新  粒子生成 粒子更新 4.1Play Audio Per Particle  系统 第三个发射器 发射器更新  粒子生成  粒子更新 第二个发射器 发射器更新  粒子生

    2024年02月10日
    浏览(41)
  • UE4/5Niagara粒子特效之Niagara_Particles官方案例:2.4->3.2

    UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.1->1.4_多方通行8的博客-CSDN博客 UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.5->2.3_多方通行8的博客-CSDN博客  这次的项目和之前又有很大的不同,它是由3个发射器组成的: 可以看到右边的两个发射器里面,都有一个事件处理

    2024年02月09日
    浏览(53)
  • UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.5->2.3

    目录 之前的文章: 1.5 Blend Attributes by Value 发射器更新  粒子生成  粒子更新 2.1 Static Beams  ​编辑 发射器更新:  粒子生成  粒子更新 2.2 Dynamic Beams 没有开始模拟前的效果是: 开始模拟后的效果是: 发射器更新 粒子生成 ​编辑  粒子更新 2.3 Multiple Renderers  发射器更新

    2024年02月11日
    浏览(67)
  • ue4 bsp画刷中光源需要重建(x未构建对象)

    在UE4中使用点光源或者聚光灯光源时,会提示:ue4 bsp画刷中光源需要重建(x未构建对象) 1.第一种解决方法:点击“构建”按钮 注意:在运行游戏时,构建按钮是灰色不可选的,一定要在停止运行游戏的情况下才能构建 在光源构建完成后,操作系统的右下角任务管理器中回

    2024年02月10日
    浏览(33)
  • 【UE5】如何在UE5.1中创建级联粒子系统

    1. 可以先新建一个actor蓝图,然后在该蓝图中添加一个“Cascade Particle System Component” 2. 在右侧的细节面板中,点击“模板”一项中的下拉框,然后点击“Cascade粒子系统(旧版)” 然后就可以选择在哪个路径下创建级联粒子系统了

    2024年02月06日
    浏览(38)
  • UE4/5 GAS技能系统入门

    Unreal的GAS技能系统是针对游戏技能管理的一套逻辑封装方案,这套方案考虑面较广,包括了Cooldowns技能冷却、允许多技能同时释放、GameplayTags的使用、特殊的事件触发等,今天就来学习一下。 1.1 创建测试工程,选择第三人称案例,C++工程。以便自动创建对应的sln文件。 1.2

    2024年02月05日
    浏览(43)
  • UE4的NDisplay可构建Cave系统

    官方文档,版本UE4.27 https://docs.unrealengine.com/4.27/zh-CN/WorkingWithMedia/IntegratingMedia/nDisplay/ 可以参照文档了解NDisplay的相关内容。 1.创建工程,以第三人称射击游戏为例。 2.勾选插件,重启项目 nDisplay: Switchboard:    3.项目设置,使得nDisplay起作用。按照提示重启项目 4.在项目中右

    2024年02月09日
    浏览(44)
  • UE4动画系统,蒙太奇动画使用,添加动作

    提示:仅供学习参考 前言 一、什么是蒙太奇? 二、实现步骤 1.使用第三人称游戏c++模板创建一个项目,创建动画蒙太奇 2.在动画蓝图中添加蒙太奇 3.绑定鼠标左键输入  4.添加c++代码 5.设置动画蒙太奇  6.点击播放,鼠标右键就能看到挥手效果了 总结 本文介绍如何使用UE4的

    2024年02月05日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包