From f773702c78c9c9952514696c801914998279fd18 Mon Sep 17 00:00:00 2001 From: PrimaryFeather Date: Fri, 2 Sep 2011 23:22:16 +0200 Subject: [PATCH] performance optimizations --- demo/media/drugs.pex | 16 ++-- demo/media/fire.pex | 12 +-- demo/media/sun.pex | 18 ++-- demo/src/Demo.as | 4 +- src/starling/extensions/Particle.as | 2 - src/starling/extensions/ParticleDesignerPS.as | 91 ++++++++++--------- src/starling/extensions/ParticleSystem.as | 16 ++-- 7 files changed, 80 insertions(+), 79 deletions(-) diff --git a/demo/media/drugs.pex b/demo/media/drugs.pex index 98b22f3..2f4d241 100644 --- a/demo/media/drugs.pex +++ b/demo/media/drugs.pex @@ -2,12 +2,12 @@ - + - - - + + + @@ -19,10 +19,10 @@ - - - - + + + + diff --git a/demo/media/fire.pex b/demo/media/fire.pex index e1d2af1..fb420b5 100644 --- a/demo/media/fire.pex +++ b/demo/media/fire.pex @@ -2,11 +2,11 @@ - + - - + + @@ -18,9 +18,9 @@ - - - + + + diff --git a/demo/media/sun.pex b/demo/media/sun.pex index 14267ba..2f6e39a 100644 --- a/demo/media/sun.pex +++ b/demo/media/sun.pex @@ -1,28 +1,28 @@ - + - - + + - + - - - - - + + + + + diff --git a/demo/src/Demo.as b/demo/src/Demo.as index a09eb84..e7ae83f 100644 --- a/demo/src/Demo.as +++ b/demo/src/Demo.as @@ -70,7 +70,7 @@ package // create FPS label mFrameCount = mFrameTime = 0; - mFrameLabel = new TextField(64, 16, "FPS:", "Arial", 12, 0xffffff); + mFrameLabel = new TextField(64, 16, "FPS: ?", "Arial", 12, 0xffffff); mFrameLabel.hAlign = HAlign.LEFT; addChild(mFrameLabel); @@ -98,7 +98,7 @@ package mFrameCount++; mFrameTime += event.passedTime; - if (mFrameTime > 1) + if (mFrameTime > 2) { mFrameLabel.text = "FPS: " + int(mFrameCount / mFrameTime); mFrameTime = mFrameCount = 0; diff --git a/src/starling/extensions/Particle.as b/src/starling/extensions/Particle.as index 7e6854a..d85bced 100644 --- a/src/starling/extensions/Particle.as +++ b/src/starling/extensions/Particle.as @@ -27,7 +27,5 @@ package starling.extensions totalTime = alpha = scale = 1.0; color = 0xffffff; } - - public function get isComplete():Boolean { return currentTime >= totalTime; } } } \ No newline at end of file diff --git a/src/starling/extensions/ParticleDesignerPS.as b/src/starling/extensions/ParticleDesignerPS.as index d7752cb..a36c94a 100644 --- a/src/starling/extensions/ParticleDesignerPS.as +++ b/src/starling/extensions/ParticleDesignerPS.as @@ -82,54 +82,77 @@ package starling.extensions { var particle:PDParticle = aParticle as PDParticle; - var lifespan:Number = getRandomVariance(mLifespan, mLifespanVariance); + // for performance reasons, the random variances are calculated inline instead + // of calling a function + + var lifespan:Number = mLifespan + mLifespanVariance * (Math.random() * 2.0 - 1.0); if (lifespan <= 0.0) return; particle.currentTime = 0.0; particle.totalTime = lifespan; - particle.x = getRandomVariance(mEmitterX, mEmitterXVariance); - particle.y = getRandomVariance(mEmitterY, mEmitterYVariance); + particle.x = mEmitterX + mEmitterXVariance * (Math.random() * 2.0 - 1.0); + particle.y = mEmitterY + mEmitterYVariance * (Math.random() * 2.0 - 1.0); particle.startX = mEmitterX; particle.startY = mEmitterY; - var angle:Number = getRandomVariance(mEmitAngle, mEmitAngleVariance); - var speed:Number = getRandomVariance(mSpeed, mSpeedVariance); + var angle:Number = mEmitAngle + mEmitAngleVariance * (Math.random() * 2.0 - 1.0); + var speed:Number = mSpeed + mSpeedVariance * (Math.random() * 2.0 - 1.0); particle.velocityX = speed * Math.cos(angle); particle.velocityY = speed * Math.sin(angle); - particle.radius = getRandomVariance(mMaxRadius, mMaxRadiusVariance); + particle.radius = mMaxRadius + mMaxRadiusVariance * (Math.random() * 2.0 - 1.0); particle.radiusDelta = mMaxRadius / lifespan; - particle.rotation = getRandomVariance(mEmitAngle, mEmitAngleVariance); - particle.rotationDelta = getRandomVariance(mRotatePerSecond, mRotatePerSecondVariance); + particle.rotation = mEmitAngle + mEmitAngleVariance * (Math.random() * 2.0 - 1.0); + particle.rotationDelta = mRotatePerSecond + mRotatePerSecondVariance * (Math.random() * 2.0 - 1.0); particle.radialAcceleration = mRadialAcceleration; particle.tangentialAcceleration = mTangentialAcceleration; - var startSize:Number = Math.max(0.1, getRandomVariance(mStartSize, mStartSizeVariance)); - var endSize:Number = Math.max(0.1, getRandomVariance(mEndSize, mEndSizeVariance)); + var startSize:Number = mStartSize + mStartSizeVariance * (Math.random() * 2.0 - 1.0); + var endSize:Number = mEndSize + mEndSizeVariance * (Math.random() * 2.0 - 1.0); + if (startSize < 0.1) startSize = 0.1; + if (endSize < 0.1) endSize = 0.1; particle.scale = startSize / texture.width; particle.scaleDelta = ((endSize - startSize) / lifespan) / texture.width; - var startColor:ColorArgb = getRandomColorVariance(mStartColor, mStartColorVariance); - var endColor:ColorArgb = getRandomColorVariance(mEndColor, mEndColorVariance); + // colors + + var startColor:ColorArgb = particle.colorArgb; + var colorDelta:ColorArgb = particle.colorArgbDelta; + + startColor.red = mStartColor.red; + startColor.green = mStartColor.green; + startColor.blue = mStartColor.blue; + startColor.alpha = mStartColor.alpha; + + if (mStartColorVariance.red != 0) startColor.red += mStartColorVariance.red * (Math.random() * 2.0 - 1.0); + if (mStartColorVariance.green != 0) startColor.green += mStartColorVariance.green * (Math.random() * 2.0 - 1.0); + if (mStartColorVariance.blue != 0) startColor.blue += mStartColorVariance.blue * (Math.random() * 2.0 - 1.0); + if (mStartColorVariance.alpha != 0) startColor.alpha += mStartColorVariance.alpha * (Math.random() * 2.0 - 1.0); - var colorDelta:ColorArgb = new ColorArgb(); - colorDelta.red = (endColor.red - startColor.red) / lifespan; - colorDelta.green = (endColor.green - startColor.green) / lifespan; - colorDelta.blue = (endColor.blue - startColor.blue) / lifespan; - colorDelta.alpha = (endColor.alpha - startColor.alpha) / lifespan; + var endColorRed:Number = mEndColor.red; + var endColorGreen:Number = mEndColor.green; + var endColorBlue:Number = mEndColor.blue; + var endColorAlpha:Number = mEndColor.alpha; + + if (mEndColorVariance.red != 0) endColorRed += mEndColorVariance.red * (Math.random() * 2.0 - 1.0); + if (mEndColorVariance.green != 0) endColorGreen += mEndColorVariance.green * (Math.random() * 2.0 - 1.0); + if (mEndColorVariance.blue != 0) endColorBlue += mEndColorVariance.blue * (Math.random() * 2.0 - 1.0); + if (mEndColorVariance.alpha != 0) endColorAlpha += mEndColorVariance.alpha * (Math.random() * 2.0 - 1.0); - particle.colorArgb = startColor; - particle.colorArgbDelta = colorDelta; + colorDelta.red = (endColorRed - startColor.red) / lifespan; + colorDelta.green = (endColorGreen - startColor.green) / lifespan; + colorDelta.blue = (endColorBlue - startColor.blue) / lifespan; + colorDelta.alpha = (endColorAlpha - startColor.alpha) / lifespan; } protected override function advanceParticle(aParticle:Particle, passedTime:Number):void { var particle:PDParticle = aParticle as PDParticle; - passedTime = Math.min(passedTime, particle.totalTime - particle.currentTime); + var restTime:Number = particle.totalTime - particle.currentTime; + passedTime = restTime > passedTime ? passedTime : restTime; particle.currentTime += passedTime; - var timeToLive:Number = particle.totalTime - particle.currentTime; if (mEmitterType == EMITTER_TYPE_RADIAL) { @@ -145,8 +168,8 @@ package starling.extensions { var distanceX:Number = particle.x - particle.startX; var distanceY:Number = particle.y - particle.startY; - var distanceScalar:Number = - Math.max(0.01, Math.sqrt(distanceX * distanceX + distanceY * distanceY)); + var distanceScalar:Number = Math.sqrt(distanceX*distanceX + distanceY*distanceY); + if (distanceScalar < 0.01) distanceScalar = 0.01; var radialX:Number = distanceX / distanceScalar; var radialY:Number = distanceY / distanceScalar; @@ -248,28 +271,6 @@ package starling.extensions } } } - - // utility functions - - private function clamp(x:Number, a:Number, b:Number):Number - { - return x < a ? a : (x > b ? b : x); - } - - private function getRandomVariance(base:Number, variance:Number):Number - { - return base + variance * (Math.random() * 2.0 - 1.0); - } - - private function getRandomColorVariance(base:ColorArgb, variance:ColorArgb):ColorArgb - { - var color:ColorArgb = new ColorArgb(); - color.red = clamp(getRandomVariance(base.red, variance.red), 0.0, 1.0); - color.green = clamp(getRandomVariance(base.green, variance.green), 0.0, 1.0); - color.blue = clamp(getRandomVariance(base.blue, variance.blue), 0.0, 1.0); - color.alpha = clamp(getRandomVariance(base.alpha, variance.alpha), 0.0, 1.0); - return color; - } } } diff --git a/src/starling/extensions/ParticleSystem.as b/src/starling/extensions/ParticleSystem.as index f860729..0800313 100644 --- a/src/starling/extensions/ParticleSystem.as +++ b/src/starling/extensions/ParticleSystem.as @@ -175,9 +175,9 @@ package starling.extensions while (particleIndex < mNumParticles) { - particle = mParticles[particleIndex]; + particle = mParticles[particleIndex] as Particle; - if (!particle.isComplete) + if (particle.currentTime < particle.totalTime) { advanceParticle(particle, passedTime); ++particleIndex; @@ -186,7 +186,7 @@ package starling.extensions { if (particleIndex != mNumParticles - 1) { - var nextParticle:Particle = mParticles[mNumParticles - 1]; + var nextParticle:Particle = mParticles[mNumParticles - 1] as Particle; mParticles[mNumParticles-1] = particle; mParticles[particleIndex] = nextParticle; } @@ -207,7 +207,7 @@ package starling.extensions if (mNumParticles == capacity) raiseCapacity(capacity); - particle = mParticles[mNumParticles++]; + particle = mParticles[mNumParticles++] as Particle; initParticle(particle); advanceParticle(particle, mFrameTime); @@ -225,17 +225,19 @@ package starling.extensions var alpha:Number; var x:Number, y:Number; var xOffset:Number, yOffset:Number; + var textureWidth:Number = mTexture.width; + var textureHeight:Number = mTexture.height; for (var i:int=0; i