[Particle Effect] Huge FPS drop on iOS devices

Hi there,
We’ve almost completed our first alpha release version of SuperB - newest title from rubycell but there was a HUGE issue with particle’s performance.

Our game on iPad - iPhone 4, has droped from 59-60 FPS to 29-30 FPS right after we turn on some SIMPLE-and-SHORT particle effects ( set EmitterRate = 10 or something like that).

The same issue on Android 1Gz like SS Galaxy S2, HTC Nesux 1, LG Optimus One, no problem on SS Galaxy S2. However, on Android devices it droped sightly, from 35-40 to 25-30.

We’re tried everything from pvr texture, rgba 4444 pixel format, disable VBO for particle to switch architecture to ARMv7 or ARMv6, but still haven’t got any improvement at all

Have you got this issue with your game? Any suggestion to fix this kind of performance drop?

Thanks!

Hi,

I’m building for Marmalade and using “Meteor” and “ExplodingRing” from particle examples in my game, my emission rate is about 100-300 and about 500 total particles. I’ve not seen performance drop even on my HTC Wildfire S (with 600 MHz CPU). iPhone 4 and Galaxy S also doesn’t show performance drop.

I would recommend you to build “tests” from cocos2d and run it on device and see if you still get this performance drop.

Alex

Thanks for your reply.
What do you do with your particles? I have some coin in my game. Each time my character “eat” this coin, i need to create a particle.
So I have more particles run in the same time in my scene, not one particles with emission rate is 500.
If I run the “tests” from cocos2dx, the fps is also 50-60.\ But\ when\ you\ do\ something\ to\ make\ the\ tests\ create\ particles\ and\ re-run,\ the\ fps\ is\ down\ to30-40 in a short of time, and return 50-60 quickly.
Same to my game, fps only down when my character “eat” coin then I create particles, and it up so quickly,although some particles still run.
You can read more here:
http://www.cocos2d-x.org/boards/6/topics/7736
Maybe I don’t use this particles system correctly.

I think FPS falls down when particle system is initialized, i.e. cocos creates all particles, after creation all the system has to do is to move these particles, that I suppose requires less CPU time - that’s why I think in your example from tests FPS slows down at first and then restores.

So perhaps a solution here might be to initialize ParticleSystem before usage, pause/stop it:

m_emitter~~>stopSystem;
m_emitter~~>pauseSchedulerAndActions();

And then when needed set postition and reset/resume it:

m_emitter~~>resetSystem;
m_emitter~~>resumeSchedulerAndActions();

So for your game you may initialize one or more particle systems and further reuse it.

Hope this helps.

Thanks. I did that early. But it doesn’t help.
When I call m_emitter->resetSystem(), fps still down in a short time T_T.
I try to initialize all particles first, and when i need it, i only call addChild(m_emitter). It still down.

Hmm… just as an experiment you may try:
addChild(m_emitter).
m_emitter~~>pauseSchedulerAndActions;
then when needed:
m_emitter~~>resumeSchedulerAndActions();

This way your particles will be visible before usage though.

However you may also try:

addChild(m_emitter).
m_emitter~~>pauseSchedulerAndActions;
m_emitter~~>retain(); // do not release emitter after detach
m_emitter~~>removeChild; // won’t clean up actions
Then add addChild, m_emitter~~>resumeSchedulerAndActions(); when needed.