Avatar billede mikkel_breum Nybegynder
22. december 2003 - 16:35 Der 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
 
q=the keypressed

if q = "y" then
  exit
  else
    me.run()
end if 
end
Avatar billede mikkel_breum Nybegynder
22. december 2003 - 16:42 #1
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..

hvad gør i derude?
Avatar billede blim Nybegynder
22. december 2003 - 17:13 #2
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? :)

mvh
Blim
Avatar billede mikkel_breum Nybegynder
22. december 2003 - 19:39 #3
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?
Avatar billede kanding Nybegynder
22. december 2003 - 22:16 #4
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.
Avatar billede mikkel_breum Nybegynder
22. december 2003 - 23:50 #5
ok tak for tippet
Avatar billede kanding Nybegynder
23. december 2003 - 09:42 #6
ok, ikke særlig smukt skrevet med hensyn til taste fejl, men det gik hurtigt ;-)

god jul til alle...
Avatar billede mikkel_breum Nybegynder
23. december 2003 - 11:36 #7
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..
Avatar billede kanding Nybegynder
23. december 2003 - 16:01 #8
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...
Avatar billede ask-m Nybegynder
02. januar 2004 - 12:28 #9
bedre sent end aldrig!

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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester