[SOLVED] Particle Pool Performance Optimization In C++

Issue

I have a particle pools which stored particle pointers

It has a large number of particles

Every particle has the IsActive variable

When partitioning the vector every frame according to their active state, there is high cpu usage

So instead is it a good way to partition the vector every few seconds on a worker thread?

Solution

Since the order of the active doesn’t matter, and they don’t become active or inactive very often, you can use a trick to keep the active particles at the front:

Suppose that nActive is the number of active particles.

When an inactive particle becomes active, do std::swap(vector[nParticle], vector[nActive]); nActive++; i.e. make it be the last active particle – and whatever inactive particle was already in that slot, goes to where the particle used to be, and we don’t care, because we don’t care about the order.

When an active particle becomes inactive, do nActive--; std::swap(vector[nParticle], vector[nActive]); i.e. make it be the first inactive particle – and whatever active particle was already in that slot, goes to where the particle used to be, and we don’t care, because we don’t care about the order.

You can remember this trick by remembering that it’s easy to make a particle active or inactive – if we don’t care which one it is – because we just add or subtract 1 from nActive. But then we don’t know which particle we just changed. So we swap that particle with the one we meant to change, and we don’t care where that particle goes, as long as it stays inactive or stays active (doesn’t change).

Like this:

+-----------+-----------+-----------+-----------+
| Particle0 | Particle1 | Particle2 | Particle3 |
| active    | active    | inactive  | inactive  |
+-----------+-----------+-----------+-----------+
                        ^
                        |
                    nActive==2

make particle 3 active: swap particle 3 and 2, then increment nActive:

+-----------+-----------+-----------+-----------+
| Particle0 | Particle1 | Particle3 | Particle2 |
| active    | active    | active    | inactive  |
+-----------+-----------+-----------+-----------+
                                    ^
                                    |
                                nActive==3

make particle 0 inactive: decrement nActive, then swap particle 3 (in slot 2) and 0.

+-----------+-----------+-----------+-----------+
| Particle3 | Particle1 | Particle0 | Particle2 |
| active    | active    | inactive  | inactive  |
+-----------+-----------+-----------+-----------+
                        ^
                        |
                    nActive==2

The particle order is all jumbled up now, but you don’t care about that, right?

Answered By – user253751

Answer Checked By – David Marino (BugsFixing Volunteer)

Leave a Reply

Your email address will not be published. Required fields are marked *