Mal wieder Frage zur verbesserung der Effizienz

NoGFX

Erfahrenes Mitglied
Ich habe folgendes Script gebastelt, dieses Skaliert MovieClips Dynamisch, je nach Distanz vom MovieClip zum Mauszeiger, nur scheint mir das etwas zu Resourcenlastig.

Die Aktion wird aufgerufen, wenn sich die Maus bewegt - wenn der Mauszeiger nahe genug ist, wird eine onEnterFrame Methode aufgerufen, die angfängt das ganze Teil zu skalieren, ist es skaliert, wird die onEnterFrame Funktion beendet.

Die onEnterFrame Funktion ist deswegen noch drin, da es, wenn man es nur über die onMouseMove Funktion steuert, teilweise eher ruckelig aussieht.

Sooo...mir fällt spontan keine möglichkeit ein, das in irgendeiner Art und weiße Effizienter zu gestalten, und wenn man bedenkt, das diese Funktion öfter vorkommen wird (35-50x), dürfte das doch sehr lastig für den PC werden, wenn dann aufeinmal dutzende von onEnterFrames anfangen zu skalieren, und währenddessen noch dutzende onMouseMove Events ausgewertet werden...

Script:
PHP:
MovieClip.prototype.setAction = function()
{
	var maxDist:Number = 60; // Maximaler Mausabstand, um Scaling auszulösen
	var mult:Number = 2.3; // Scaling multiplikator
	var dist:Number = Math.sqrt(Math.pow(Math.abs(_xmouse), 2) + Math.pow(Math.abs(_ymouse), 2)); // Errechnen der Distanz zu Clip);
	var newScale:Number; // neue Scalinggröße
	var enterActive:Boolean = false;
	this.onMouseMove = function()
	{
		dist = Math.sqrt(Math.pow(Math.abs(this._xmouse), 2) + Math.pow(Math.abs(this._ymouse), 2));
		if (dist <= maxDist) // Wenn Distanz zu MC kleiner als Maximale Distant, löse onEnterFrame aus
		{
			enterActive = true;
			this.onEnterFrame = function()
			{
				newScale = 100 + (maxDist * mult * 0.5 - dist * mult); // Errechnen der neuen Scalings
				this._xscale += (newScale - this._xscale) / 5; // Fading zum neuen Scaling
				if (this._xscale <= 100) // Sollte Skalierung kleiner als 100% sein, setze sie zurück auf 100%
				{
					this._xscale = 100;
				}
				this._yscale = this._xscale; // Passe yScale and xScale an
				if (this._xscale >= newScale + 1 && this._x <= newScale - 1) // Wenn (fast) newScale erreicht ist...
				{
					this._xscale = newScale; //...setze exakten newScale Skalierungswerte
					this._yscale = this._xscale;
					enterActive = false;
					delete this.onEnterFrame; // Beenden der onEnterFrame Funktion
				}

			};
		}
		else
		{
			if(enterActive == true) {
			delete this.onEnterFrame;
			enterActive = false;
			}
			this._xscale = 100;
			this._yscale = 100;
		}
	};
}
 
Hallo,

die onEnterFrames mit den Skalierungen dürften die Performance nicht matchentscheidend beeinträchtigen. Die Distanzberechnung hingegen könnte man vielleicht etwas eleganter lösen, indem du z.B. die effektive Formel erst dann anwendest, wenn die Maus in eine relevante Nähe des MovieClips kommt.
Ideal für solche Sachen sind gitterbasierte Positionsberechnungen, da auch sehr performancesparend. Das genialste Teil dafür ist in meinen Augen Grant Skinners ProximityManager-Klasse, am besten pröbelst du damit ein wenig rum.

An und für sich ist doch dein Skript aber in Ordnung. Gibts denn bei deiner *.swf Performance-Probleme?


gruss
 
Bisher gibt es noch keine Performanceprobleme, jedoch habe ich die Befürchtung, das sie später auftauchen werden.

Aber ich nehme mir erstmal den Link zu Herzen und werde da mal reinschauen, danke!
 
Zurück