Дійсно не потрібно зберігати пам'ять для кожної частинки та анімувати кожну частинку окремо. Ви можете це зробити процедурно, реконструюючи положення частинок під час малювання, використовуючи класичне рівняння фізики. s = ut + 1 / 2.at ^ 2
Простий приклад (без постійного прискорення частинок):
void drawExplosion(ExplosionParameters& s)
{
Random rng;
rng.seed(s.startSeed);
glBegin(GL_POINTS);
for (int i = 0; i < s.numParticles; i++)
{
vec3 vel = rng.getRandomVector(-1.0f, 1.0f) * s.explosionSpeed;
float timeBias = rng.getRandom(0, s.particleTimeBias);
vec3 pos = s.explosionCentre + (vel * (s.timeElapsed + timeBias));
glPoint3fv(&pos);
}
glEnd();
}
Тоді ви просто збільшуєте s.timeElapsed на кожній ітерації циклу оновлення.
Це також повністю піддається впровадженню в GPU, тим самим звільняючи ваш процесор від необхідності виконувати будь-яку роботу. Реалізація gpu може виглядати приблизно так:
void drawExplosion(ExplosionParameters& s)
{
//bind Vertex Shader If Not Already Bound();
...
// bindVertexBuffer of Zeroes If Not AlreadyBound();
glVertexPointer(...)
//uploadShaderUniformsForExplosion(s);
glUniform3f(...)
...
glDrawArrays(GL_POINTS, 0, s.numParticles);
}
Потім вершина шейдера GPU буде реконструювати положення частинок за допомогою рівняння фізики та уніформи / константи, що передаються до неї - так само, як це робила версія CPU.
Щоб додати деяку дисперсію, ви можете використовувати більше одночасних вибухів із дещо різними параметрами, анімацію кольорів / альфа, вибираючи різні вихідні положення. тощо.