webForumDet fria alternativet

preloada många movieclips

Flash

7 svar · 363 visningar · startad av M@rtin

Medlem sedan dec. 19992 085 inlägg
Frågan#1

Jag laddar i min flashfilm in väldigt många movieclips vilket tar lång tid då programmet i princip hänger sig och varnar för att flash håller på att hänga sig.

Just nu ligger all kod för att ladda in alla filmklippen i en funktion och det är klart att man kunde dela upp den i fler funktioner så att man laddar lite i taget istället men finns det inte någon snyggare lösning?

Kan man t.ex. på något sätt köra funktionen i en egen tråd så att den körs parallellt med annat? Skulle t.ex. vilja visa en loading-bild hellre än att programmet ser ut att hänga sig.

Alla preloaders jag sett kollar antalet kb kvar att ladda och det verkar enbart fungera när man laddar in bilder eller liknande, inte när man kör en funktion iaf.

Någon som har några bra idéer?

Medlem sedan maj 2003750 inlägg
#2

Det låter misstänkt som att du använder en actionscript loop t.ex. for eller en while loop. medans du skulle behöva ha den i en onEnterFrame händelse.

/Mirandir

Medlem sedan maj 2005704 inlägg
#3

Flash har inte själv något system för att köa förfrågningar, så det blir lätt segt och opålitligt om man gör http förfrågningar på en hel radda filer inom löppet av några ms.

Det jag brukar göra är att använda MovieClipLoader så har man en onLoad handler som gör att man kan ladda clip för clip istället.

Medlem sedan dec. 19992 085 inlägg
#4

mirandir: Menar du att jag ska anropa min funktion i en onClipEvent(enterFrame)? För en for loop måste jag väl ändå ha för att få clipen på rätt plats och så? Och var ska jag i så fall köra onEnterFrame eventet? Mina små movieClips ligger i ett movieclip som jag skapar i actionscript så det kan jag väl inte skriva någon kör för?

Jag är inte så hemma på flash och actionsscript som ni kanske märker.

Blixtsystems: Mina MovieClips ligger i swf filen så jag behöver inte köra några http förfrågningar, om det var så du menade.

Medlem sedan maj 2005704 inlägg
#5

Då du säger laddar in movie clips förmodade jag att det är externa clip du laddar in.
Ämnet är ju preloada många movie clips.
Om du har alla clips i en swf redan preloadar du dem inte separat, utan då måste du bara preloda en swf fil.

Är det duplicate eller attach av befintliga movie clips du försöker göra?
Hursomhelst så är det som mirndadir säger förmodligen ett problem med din loop.

Ta och klistra in din kod kanske jag får en idé om vad det är du försöker göra.

Medlem sedan dec. 19992 085 inlägg
#6

Ah okej förlåt, jag är inte helt på det klara med terminologin.

Så jag skulle alltså kunna lägga mitt script i en swf fil och sen ladda in den i en annan så skulle preloadningen fungera?
Det jag är ute efter är ju bara att det ska visas en loading bild under tiden istället för att det ser ut att hänga sig.

Här är min kod:

strPic = "2132332132132132312213131313213123123321312321312312312312323123123232111111111111231321321321321321233333333123213321232133321321312321312312321321332123123131123332123132323333213123213233213123333333333333333333331111111320030203003302001020120300230303320030203022201001203021030230210312030123210301023003030020103021030210302030120301023012030210301203021303000032010200302013020303320031020020201001001030030303020102030200020230030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030";

picture = {pixelW:1, pixelH:1};

picture.Pixel0 = function () { };
picture.Pixel0.prototype.frame = 1;

picture.Pixel1 = function () { };
picture.Pixel1.prototype.frame = 2;

picture.Pixel2 = function () { };
picture.Pixel2.prototype.frame = 3;

picture.Pixel3 = function () { };
picture.Pixel3.prototype.frame = 4;

function createPic(pic) {
	picLen = 9600-pic.length;
	for(var i = 0; i<picLen; ++i){
		pic = "0" + pic; 
	}
	_root.attachMovie("empty", "pixels", ++d);
	picture.clip = _root.pixels;
	var picWidth = 120;
	var picHeight = 80;
	for (var i = 0; i<picHeight; i++) {
		for (var j = 0; j<picWidth; j++) {
			var name = "p_" + (i*picWidth+j);
			picture[name] = new picture["Pixel"+pic.substr(i*picWidth+j,1)]();
			picture.clip.attachMovie("pixel", name, i*picWidth+j); 
			picture.clip[name]._x = (j*picture.pixelW)+1;
			picture.clip[name]._y = (i*picture.pixelH)+1;
			picture.clip[name].gotoAndStop(picture[name].frame);
			trace(name + " frame:" + picture[name].frame);
			
		}
	}
}

createPic(strPic);

empty är ett tomt movieclip
pixels innehåller 4 frames som är vardera 1 pixel stora med fyra olika färger.

Medlem sedan maj 2005704 inlägg
#7

Flash klarar inte så bra att rita bilder på det sätt du försöker där.
Flash 8 kommer ha bättre möjligheter med att manipulera pixlar, men att försöka emulera riktig pixel fuktionalitet med attachMovie fungerar inte om du inte håller dig till väldigt få pixlar.

picHeight*picWith i ditt fall är = 9600.
Det är en krävande loop för flash, och du gör en del tunga processer i loopen.
Trace får Flash att braka ihop lätt, men även utan trace kommer det bli tungt.

Jag tror det blir svårt att göra det du vill, men du kan optimera den en aning.
tex:
while är snabbare än for loopar.
om du kör for loopar är det snabbare att subtrahera än addera, och deklarera i innan loopen iställer för i den
...alltså
var i;
for(i=length;i>0;i--)

istället för att ha frames med olika färger så borde du nog använda setRGB för bättre prestanda.
Och undvik att använda prototyper och andra metoder som anses som gott OOP förfarande.
Oftast är Flash4 syntax snabbare än de nyare metoder som flash nu har.
Snabb kod är ofta länge, mindre välstrukturerad och spagettiartad.

Medlem sedan dec. 19992 085 inlägg
#8

Okej. Ja jag får nog förbättra det i flash 8 senare. Men just nu nöjer jag mig med att dela upp loopen så den körs i mindre bitar i taget. Optimerade den dock efter dina förslag.

Tack för svaren!

261 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)