Garbage collection i ActionScript 3 - Husk scope!

Kategori: Tips og tricks | Kommentarer (0)
Gemt: 2008-02-8 12:10


En af de nye ting i AS3 er en “rigtig” garbage collector, som fungerer ligesom i mange andre programmeringssprog, men det betyder også at man lige skal være opmærksom på et par ting i forhold til AS2.

Et problem jeg selv stødte på for nylig, var en programmeret tween, som nægtede at gøre det den skulle, på trods af at koden ikke fejlede noget og havde virket i tidligere versioner af samme prohekt.

Her er et eksempel svarende til den kode der drillede, og som i øvrigt var en del af en større klasse:


private function moveSomething():void {
	var myTween:Tween = new Tween(
					Mit_mc,
					"x",
					Strong.easeOut,
					Mit_mc.x,
					Mit_mc.x + 50,
					2,
					true
					);
}

Har du fundet fejlen?
Nej, det tog også mig lidt tid - for der er ikke nogen fejl, det er fuldt lovlig kode!

Det jeg fandt ud af var den primære forskel på den tidligere version af projektet, hvor tweenet virkede, og den nye var, at der var blevet tilføjet nogle ekstra elementer som var ekstremt hukommelsesintensive.
Og, når man presser Flash i ActionScript 3, så betyder det at garbage collectoren rydder op oftere, da Flash Player kæmper for at minimere ressourceforbruget og dermed optimere performance.

Har du fundet fejlen nu?

Fejlen er simpelthen den, at objektet myTween defineres inde i den private funktion, hvilket betyder at når garbage collectoren rydder op, så finder den ikke nogen referencer til objektet, og det på trods af at animationen måske kun er halvfærdig.

Derfor er løsningen så simpel som at definere objektet uden for funktionen:


var myTween:Tween;
private function moveSomething():void {
	myTween = new Tween(
				Mit_mc,
				"x",
				Strong.easeOut,
				Mit_mc.x,
				Mit_mc.x + 50,
				2,
				true
				);
}

Så, i ActionScript 3 skal man tænke endnu mere over at definere variabler og objekter i det rigtige scope, ellers så kan der opstå nogle finurlige problemer.