22. december 2003 - 16:35Der er
8 kommentarer og 1 løsning
optimering af performance i Lingo
Hej.. Er der nogen der kender til websteder, hvor der sættes fokus på optimering af lingokode, med henblik på performance, responsiveness, og multitasking?
Jeg har fx. fundet ud af, at det er extremt tidskrævende at tjekke 'the keyPressed' variablen. Se som eksempel nedenstående kodestumper: -- jeg lader lingo tælle til 100000 og tager tid på hvor længe det tager.
I sig selv tager det 60 millisekunder på min computer. Indfører jeg så en if condition i tælleløkken, hvor jeg undersøger om en variabel har en bestemt værdi, tager løkken 90 millisekunder om at tælle til 100000.
Men hvis jeg i stdet ændre på if conditionen, så jeg i stedet undersøger om værdien af the keypressed, så tager løkken 8742 millisekunder.
Det vil sige at ved blot at tilføje et kik på variablen the keypressed bliver koden 97 gange så langsom!
Det fik mig til at overveje hvor mange af den slags faldgrupper der evt. er i lingo.. og hvordan man bedst koder, så man undgår dem, når performance er i fokus..
-----------------------
eksempel 1: 60 ms on run me t=t+1 if t > 100000 then exit end if end
--------------------------
eksempel 2: 90 ms on run me t=t+1 if t > 100000 then exit end if
if q = "y" then -- hvilket ikke er tilfældet exit else me.run() end if end
---------------------
eksempel 3: 8742 ms on run me t=t+1 if t > 100000 then exit end if
og er der nogen der har kommentarer til hvad der er bedst af følgende to metoder til at 'køre' lingo applikationer:
1) at pause playhead i frame 1 og derefter lade et lingo objekt køre showet 2) at benytte den gamle go to the frame metode, med 999 fps
første giver højest performance, men sikrer ikke så stabil afvikling, ie, applikationen fryser letterer, hvis ikke der er indbygget de rette escaperoutiner..
Altså for mig at se så leder du efter en løsning på et problem som ikke rigtig er der! Det du taler om der er vist heller ikke milisekunder men ticks? Eksempel 3 tager da ikke 8 sekunder at udfører!!
Men egentlig vil jeg da sige at lingo er da heller ikke det hurtigste sprog... Men synes du ikke det afvikles hurtigt nok? Har du lavet en shockwave side som kører for langsomt da? :)
det er millisekunder, eksempel 3 tager over 8 sekunder.. det er fordi det tilsyneladende er meget tidskrævende for lingo at undersøge the keyPressed 100000 gange...
Jeg har ikke generelt et hastighedsproblem med lingo.. det er jo klart at man ikke skal kode i lingo hvis det er hastigheden som er ens primære interesse.. men jeg blev bare nysgærrig for at høre hvilke lign oplevelser andre har haft.. at have et tjek for the keyPressed er jo en ganske anvendelig ting i mange spil og lign.. og derfor er det da interessant, hvis det sluger så meget processortid.. synes du ikke?
af 1 & 2 så er 3 bedst, nemlig at loope mellem frames fx. 1 og 3. Man giver browseren "luft" og lingo "forstår" det bedre. Altså skal alle dine sprites spanne over 3 frames.
Med hensyn til dit repeat loop, så kan jeg ikke se at det kan gøres hurtigere i dit eksempel. Du laver et loop med repeat som kører så hurtigt så muligt.
Du tester på keypressed hvilket du bliver nød til at gøre hele tiden ellers vil den teoretisk set misse et keyPressed hvis man var uheldig. Evt. kunne man via en timeOutOb teste på keyPressed som gemmes en global variabel så loop'et tester via en direkte reference sti, men jeg mener at vi er igang med at kneep fluer her. Normalt ville man ikke teste for mouse og ket i et repeat loop da man som regel bruger det til gennemløb af data.
Evt. søg via google på Terry Schussler, han er ultra director nørd der har fundet de mærkeligste optimerings til.
hvordan kan det være, at det er bedre at loope frame 1-3 i stedet for blot at loope en frame. Der kommer vel de samme events ud af det, og et givent on enterFrame-framescript bliver kørt 3 gange så ofte ved et 1-frame loop..
Jeg tror at det er fordi Director startede som et animations værktøj, så det at gå til en ny frame der refreshes fremfor at gå til samme frame og provokere en updatestage er bedre. Jeg tror at det ligger i selve frame logikken. Man får lige mange enterframes ud af det. Men det skal siges at dette er et gammelt trick fra director 5 så om den nye engine bag director virker på samme måde ved jeg ikke. Jeg har bare gjort mig det til en vane...
Jeg vil mene at en modificeret 2'er er bedst! Det giver alt for lidt "idle" tid hvis du forsøger at buldre afsted med 999 fps. Tænk på at director skal igennem prepareframe, enterframe og exitframe for hver frame (hvilket måske tager lidt tid fra dine keyboard events) og for hver gang director er færdig med enterframe, så kaldes "updatestage" automatisk og den udføres selvom der ikke er sket ændringer på stage! dvs. at du forsøger at tegne stage 999 gange pr. sekund samtidig med at du vil have checket for en given tast 100000 gange - selv for en computer er det en del på engang!
Jeg sætter normalt frame hastigheden til en 15-25 stykker, så cursor skift og den slags ser normalt ud, og så styrer jeg øvrige opdateringer i objecter, der forholder sig til tid! (og så styrer holder jeg styr på updatestage, så jeg kun kalder det når nødvendigt).
Desuden er det over dobbelt så hurtigt at spørge til keyPressed("y") = true i forhold til the keyPressed = "y" - sikkert fordi den ikke behøver checke alle taster!!!
Ask-M
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.