Best data structure for a particle system?

Marco Leise Marco.Leise at gmx.de
Fri Nov 15 13:39:36 PST 2013


Am Fri, 15 Nov 2013 21:56:15 +0900
schrieb Mike Parker <aldacron at gmail.com>:

> On 11/15/2013 9:19 PM, Mikko Ronkainen wrote:
> >
> > If relevant, doubly-linked might work better? dcollections LinkList, or
> > maybe DList? I'm asking mostly because I'd like the container to avoid
> > memory allocations while in use.
> 
> For a particle system, I would avoid lists. A list of particles needs to 
> be iterated every frame. A linked list is going to kill you as the 
> particle count increases. Since the particles will most like not be 
> contiguous in memory, you'll be thrashing your cache to hell and back.
> 
> "Caches love linear access" is a quote to remember. When you need to do 
> frequent iteration of a list, your cache will love you if all of the 
> items are in a block of contiguous memory. So it's almost always better 
> to use an array for this sort of thing. Make your particle object a 
> struct and use a dynamic array of particles that you can grow as needed 
> or, if it makes sense, a fixed size static array. The point is that 
> arrays of structs will be lined up one next to the other in memory so 
> that you can make good use of the cache. Of course, the size of your 
> particle object also has a role to play here.
> 
> Google for "linked list cache thrashing" or "cache-friendly data 
> structures" or some such for ideas.

It is true, that these days you optimize for cache locality
more than for anything else.
How about this:
- use an array
- keep alive particles at the front and dead particles at the
  back
- when an alive particle dies, you swap it with the last alive
  particle in the array and mark it as dead
This way you always have a compact array from 0..aliveCount
and don't need if-else to check for dead ones. (Which is
otherwise another slowdown factor).

-- 
Marco



More information about the Digitalmars-d-learn mailing list