mirror of
https://github.com/photonstorm/phaser
synced 2024-11-17 10:18:42 +00:00
Fixed how dead particles are managed, reduced gc churn and reset particle positions. Also removed un-needed stable sort.
This commit is contained in:
parent
fca695f632
commit
18af31ffb7
1 changed files with 26 additions and 44 deletions
|
@ -2012,13 +2012,9 @@ var ParticleEmitter = new Class({
|
||||||
|
|
||||||
for (var i = 0; i < count; i++)
|
for (var i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
var particle;
|
var particle = dead.pop();
|
||||||
|
|
||||||
if (dead.length > 0)
|
if (!particle)
|
||||||
{
|
|
||||||
particle = dead.pop();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
particle = new this.particleClass(this);
|
particle = new this.particleClass(this);
|
||||||
}
|
}
|
||||||
|
@ -2073,47 +2069,49 @@ var ParticleEmitter = new Class({
|
||||||
var processors = this.manager.getProcessors();
|
var processors = this.manager.getProcessors();
|
||||||
|
|
||||||
var particles = this.alive;
|
var particles = this.alive;
|
||||||
|
var dead = this.dead;
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
|
var rip = [];
|
||||||
var length = particles.length;
|
var length = particles.length;
|
||||||
|
|
||||||
for (var index = 0; index < length; index++)
|
for (i = 0; i < length; i++)
|
||||||
{
|
{
|
||||||
var particle = particles[index];
|
var particle = particles[i];
|
||||||
|
|
||||||
// update returns `true` if the particle is now dead (lifeStep < 0)
|
// update returns `true` if the particle is now dead (lifeCurrent <= 0)
|
||||||
if (particle.update(delta, step, processors))
|
if (particle.update(delta, step, processors))
|
||||||
{
|
{
|
||||||
// Moves the dead particle to the end of the particles array (ready for splicing out later)
|
rip.push({ index: i, particle: particle });
|
||||||
var last = particles[length - 1];
|
|
||||||
|
|
||||||
particles[length - 1] = particle;
|
|
||||||
particles[index] = last;
|
|
||||||
|
|
||||||
index -= 1;
|
|
||||||
length -= 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move dead particles to the dead array
|
// Move dead particles to the dead array
|
||||||
var deadLength = particles.length - length;
|
length = rip.length;
|
||||||
|
|
||||||
if (deadLength > 0)
|
if (length > 0)
|
||||||
{
|
{
|
||||||
var rip = particles.splice(particles.length - deadLength, deadLength);
|
|
||||||
|
|
||||||
var deathCallback = this.deathCallback;
|
var deathCallback = this.deathCallback;
|
||||||
var deathCallbackScope = this.deathCallbackScope;
|
var deathCallbackScope = this.deathCallbackScope;
|
||||||
|
|
||||||
if (deathCallback)
|
for (i = length - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
for (var i = 0; i < rip.length; i++)
|
var entry = rip[i];
|
||||||
|
|
||||||
|
// Remove from particles array
|
||||||
|
particles.splice(entry.index, 1);
|
||||||
|
|
||||||
|
// Add to dead array
|
||||||
|
dead.push(entry.particle);
|
||||||
|
|
||||||
|
// Callback
|
||||||
|
if (deathCallback)
|
||||||
{
|
{
|
||||||
deathCallback.call(deathCallbackScope, rip[i]);
|
deathCallback.call(deathCallbackScope, entry.particle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
entry.particle.resetPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.dead = this.dead.concat(rip);
|
|
||||||
|
|
||||||
StableSort.inplace(particles, this.indexSortCallback);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.on)
|
if (!this.on)
|
||||||
|
@ -2153,22 +2151,6 @@ var ParticleEmitter = new Class({
|
||||||
depthSortCallback: function (a, b)
|
depthSortCallback: function (a, b)
|
||||||
{
|
{
|
||||||
return a.y - b.y;
|
return a.y - b.y;
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates the difference of two particles, for sorting them by index.
|
|
||||||
*
|
|
||||||
* @method Phaser.GameObjects.Particles.ParticleEmitter#indexSortCallback
|
|
||||||
* @since 3.0.0
|
|
||||||
*
|
|
||||||
* @param {object} a - The first particle.
|
|
||||||
* @param {object} b - The second particle.
|
|
||||||
*
|
|
||||||
* @return {integer} The difference of a and b's `index` properties.
|
|
||||||
*/
|
|
||||||
indexSortCallback: function (a, b)
|
|
||||||
{
|
|
||||||
return a.index - b.index;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue