HTML and CSS Reference
Listing 4-4. Simulation Code Using a Structure of Arrays
for (var i = 0 ; i < numParticles; ++i)
velocity_x = particles_velx[i];
velocity_y = particles_vely[i];
velocity_z = particles_velz[i];
particles_posx[i] += deltaTime * velocity_x;
particles_posy[i] += deltaTime * velocity_y;
particles_posz[i] += deltaTime * velocity_z;
// continue simulation ...
In Listing 4-4, all data is stored in just six Objects. Compared to the Array of flattened Objects, some simple
experiments showed this to yield a memory savings of between 35% and 45%. That is a 40% to 60% savings compared
to the original hierarchical version. This memory savings is a result of drastically reducing the number of Objects
rather than a large list of references to structures, each with some named properties.
Note that although the way the data is referenced has changed, the impact on the maintainability of the code is
small. The effort required to add or remove properties from individual particles is roughly the same as it would be for
the original data structure.
You can reduce object count even further if you are willing to sacrifice some readability (see Listing 4-5).
Listing 4-5. A Single Interleaved Array
// Each particle consists of 6 numbers
// Single Array containing the all particle attributes.
// [ posx, posy, posz, velz, vely, velz, // particle 0
// posx, posy, posz, velz, vely, velz, // particle 1
// posx, posy, posz, velz, vely, velz, // particle 2
// . . .
var particles = new Array(6 * numParticles);
The code in Listing 4-5 maintains a single Array containing all properties of all objects. Individual properties of a
given particle must be addressed by their relative indices, as shown in Listing 4-6.
Listing 4-6. Simulation Code Using a Single Interleaved Array
var endIdx = 6 * numParticles;
for (var i = 0 ; i < endIdx ; i = i + 6)