17. december 2004 - 10:51Der er
24 kommentarer og 1 løsning
flytte objecter hurtigt
Jeg sidder og leger med noget javascript der skal få div´s til at "flyve" rundt og få mig til at smile.
Jeg synes bare ikke det kører særlig optimalt.
F.eks. har jeg prøvet følgende:
function Move(i) { clearTimeout( t ); d.getElementById('div2').style.left=i; i -= 1; t = setTimeout( "Move( "+ i +" )", 10 ); }
uanset om jeg sætter ms til 1 eller 10 eller 100 så er der ikke meget turbo i mine div. Ændrer jeg så antallet af pixels pr kald til f.eks. 5 så sker det hele meget rykvis...
Er der nogen der har en god ide, eller en stump kode der gør det bedre end min?
Du får nok aldrig særlig meget turbo på når du kun trækker én fra hver gang, og som roenving siger er det ikke sikkert browseren kan nå at følge med, hvis den skal køre hvert 10. ms (hvorfor han så sætter den til 5 bagefter er mig en gåde).
Mit bud ville være at trække 2 fra hver gang, da det lige akkurat ikke går så meget i ryk som ved fx 5: <script language="javascript" type="text/javascript"> var i = 200; var divElm; function Move() { if(i==0)return; divElm.left=i+'px'; i -= 2; } window.onload = function(){window.setInterval("Move();",20);divElm = document.getElementById('minDiv').style} </script>
Nu har jeg også prøvet at belaste browseren så lidt som muligt hver gang funktionen køres - om det så giver noget mærkbart resultat ved jeg ikke, men det er værd forsøge. Nu kan du så lige lege lidt med intervallet (har sat den til 20 hvilket godt kan virke lidt langsomt, men skulle i teorien kun tage 2 sek. om at være færdig.
Nu kan man jo prøve at sammenligne skærmens opdaterings frekvens med 10ms og se, hvor realistisk, det er. En 80Hz skærm opdaterer f.eks. hvergang, der er gået 12,5ms :)
Normalt plejer man at regne med, at 30-35ms er grænsen for JS-animationer. Video kører med en frekvens på omkring 40ms - så hvis et TV er hurtigt nok, er der med andre ord ingen grund til at ligge og rode nede omkring 10ms ;o)
Framerate er kun den ene ting, der afgør, hvor hurtig en animation kører ... det er ligeså vigtigt, hvor langt, emnet flyttes pr. frame. Du må altså bare flytte noget længere pr. 'frame' :)
ok, det lyder meget korrekt alt sammen,.. men jeg synes bare når jeg ser flash animationer rundt omkring så glider det langt flottere over skærmen,.. hvad er forskellen, skal skærmen ikke stadig kunne følge med til at opdatere billedet ??
Prøv at give et eksempel. Til mit brug virker JS-animationer fint, men det er klart, at hvis du vil flytte rundt på meget tunge ting, kan du få problemer :)
flash animationer er små film sekvenser, som kører i sin egen tråd. Javascript skal bruge processorkraft til at udregne næste position, dvs afhængig af cpu'en, som er baseret på kø politik, så hvis din animation halter en lille smule kan det muligvis være fordi der er kommet en eller to processer foran i køen.
Bare et gæt...de kloge hoveder kan nok forklare det bedre :P
olebole, selv når det er ganske små tekststrenge jeg flytter så ser det ikke optimalt ud.
Man kan f.eks. se en lille tekstboks i højre side af www.bold.dk ´s forside, der har en smule tekst om nogle odds der glider fra bund til top, i flash ... et smukt ensformigt glid som jeg ikke kan skabe med js ..
Hej igen bongo20. Der gik vist lidt Jul og alm. glemsomhed i dette spm ... sorry ;o) Jeg sad og pillede lidt med det og du har for så vidt ret - da JS kun kan flytte teksten én pixel ad gangen, kan det være svært at få en animation 'glat', når den kører så langsom. Jeg lavede dog et lille animations-objekt, der udfører et lille 'antialiasing-trick'. Jeg skal lige have det ryttet en anelse op - så kyler jeg det op lidt senere idag - det nåede jeg aldrig :)
... og lige en tak for den 'sprøde ros' til dig Peter. Ja, jeg finder den faktisk også selv lidt småpornografisk ;o)
Jeg er temmelig sikker på, du har været nede i js-filen og lure (og formår at gennemskue den), men til andre kan jeg lige forklare, hvad der i hovedtrækkene sker: Når jeg instantierer objektet, opretter jeg et ekstra div, der er nøjagtig magen til det med links i. Dette div giver jeg en opacity på 25% og lægger det præcist ovenpå det oprindelige. Hveranden gang der flyttes, er det det ene div, der flyttes én pixel - resten af gangene flyttes det andet. Derved bliver det hele 'antialiased' og scrollingen fremstår mere flydende. Når man stopper scrollingen (enten ved mouseover eller ved metoden 'stop'), skjules det halvtransparente div, så det ikke slører billedet - og vises igen ved mouseout (eller brug af start-metoden).
ehhhm ... jeg tillader at tage det som en kompliment, Jes. I hvert fald kan man sige, det er '_p.rototypen' på en OleBole-OOP-løsning, som du jo før har set dem ;o)
Jeg siger ikke nødvendigvis, det er den fede løsning - når nu Flash er opfundet - men det er jo altid sjovt, når et af ens syge pandelaps misfostre af en tanke kan bæres igennem til noget, der faktisk fungerer lækkerligt :)
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.