Unload != unload

Kategori: Diverse | Kommentarer (2)
Gemt: 2008-04-16 12:40


Når man i ActionScript 3 bruger kommandoen MovieClip.unload() så unloader den rent faktisk ikke det man har loadet, den fjerner blot nogle referencer til det, som gør at garbage collectoren senere, forhåbentlig, fjerner det. Men, Grant Skinner har nu dokumenteret at det langt fra altid er tilfældet, og at det kan skabe store problemer når det ikke sker.

Så, hvis du laver Flash hvor du loader andre flash-filer, billeder eller lignende, så læs artiklen, den kan være en redningskrans inden du lover mere end du kan holde:
Failure to Unload - Flash Player 9’s dirty secret


ActionScript 3: Fremtving garbage collection

Kategori: Tips og tricks | Kommentarer (3)
Gemt: 2008-02-11 11:18


I AS3 er der et par objekter der kan sluge hukommelse så hurtigt, at garbage collectoren ikke på almindelig vis kan følge med, hvilket kan medføre at applikationerne bliver så ustabile så Flash Player crasher.

Eksempelvis har jeg lige lavet en løsning med nogle store BitmapData objekter, her steg hukommelseforbruget fra 100 MB til 800 MB på få sekunder, hvorefter det faldt til 100 MB når garbage collectoren automatisk startede, for så at stige igen.

Løsningen for mig blev at fremtvinge garbage collection stort set hele tiden, og dermed forblev hukommelsesforbruget rimelig stabilt på omkring 150MB.
Ulempen ved det er at garbage collection bruger en del CPU, men i mit tilfælde var hukommelsesforbruget den store flaskehals, så det var til at leve med.

Måden man fremtvinger den på er absolut et hack, men det virker og der findes ikke nogen officielle måder at gøre det på.
Man forsøger simpelthen at oprette to localconnections til det samme objekt, og det genererer en fejl der fremtvinger garbage collection:


try {
	new LocalConnection().connect('foo');
	new LocalConnection().connect('foo');
} catch (e:*) { }

Men husk, brug det med omtanke!
Normalt kan Flash Player selv håndtere det fornuftigt, og da det er et hack er der ingen garanti for at det bliver ved med at virke.


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.


ActionScript 3 - Ikke bare guld og grønne skove!

Kategori: Diverse | Kommentarer (2)
Gemt: 2006-07-7 13:34


Nu er der blevet skrevet så meget om alle de mange nye muligheder i ActionScript 3, de fantastiske nye klasser, den højere performance og så videre.
Men, måske er der ikke altid grønnere på den anden side af hækken.

Læs resten af dette indlæg