有没有比较好的给每个Niagara发射器指定一个最大粒子数量的做法?

您好:

[Content removed]

但是使用Allocation Mode限制数量现在有两个问题:

1.编辑器窗口会显示黄色警告(xx has exceeded the maximum instance count)

2.比较担心这种做法会不会引起一些其他问题,比如打包后在各种平台的崩溃、兼容问题

然后又尝试了在Emitter Update中通过Emitter.NumParticles控制SpawnInfo来控制数量,和在ParticleUpdate中通过ExecutionIndex来杀死过多的粒子(或者设置VisbilityTag),但这些方法都会在老粒子死亡的时候出现一帧的空档(比如最大数量限制为1,然后Spawn Rate为100,第一个粒子死的时候,隔了一帧才会有新粒子补充进来)

所以想了解这个功能最好的实现方式是什么?

非常感谢!

你好,

不建议用Allocation Mode限制粒子数量, 因为把允许的最大粒子量设定为预分配的粒子量会影响内存, 可以在Niagara编辑器或Debugger里比较不同allocation mode的内存开销.

[Image Removed]在Spawn Module里控制SpawnInfo会更合理一些, 但Emitter.NumParticles注释有标明获取的是当前Emitter在模拟开始时的粒子量, 无法知道你在particle update阶段杀死的粒子, 推测这是造成一帧delay的原因. 而且我感觉对于持续发射的效果, 如果粒子LifeTime比较接近, 这样到达上限后停止发射很难避免空档的现象.

我个人感觉还是从每帧可发射的粒子量而不是粒子总量做限制来保证性能会更好一些, 就像现在EffectType的scalability那里的设置, 对发射量做缩放,对效果的影响小, 还可以在particle update里读取到这个缩放值(Engine.Emitter.SpawnCountScale)适量调整粒子大小, 进一步弥补粒子量减小的视觉差异.

另外还有一点, 杀死粒子一般是设置Age>LifeTime, 或者DataInstance.Alive==0; VisibilityTag只是控制粒子用哪个render渲染或者不渲染, 但仍然有模拟开销.

感谢回复。如果Particle Update阶段的Execution Index能按预期生效的话也是可以解决问题的。问题就是每帧刚Spawn出来的粒子和之前存在的粒子可能会有相同的Execution Index数值。

至于其他一些控制Spawn的方法,确实无法完美确保没有空挡的出现。

或者还有其他可以实现类似Unity的Particle System中的Max Particles的功能么?

非常感谢!

不好意思这段时间在出差没有及时​回复.

Execution Index确实无法保证唯一性, Emitter ​Properties上有一个Requires Persistent IDs, 勾选上可以用Particle.ID属性获取每个粒子唯一的一个Index, 但这个选项会有额外的内存,性能开销, 非效果需要不建议开.

Emitter粒子上限的设置我们目前只有全局的 fx.MaxNiagaraCPUParticlesPerEmitter, 用于CPU粒子上限; fx.MaxGPUParticlesSpawnedPerFrame 用于GPU粒子每帧可spawn的上限, 可以逐Emitter的控制, Emitter Properties上有Max GPU Particles Spawn per Frame控制.