Deine letzte Version hat *wieder* ein Speicherleck. Es wird bei jedem Aufruf von animate() mit "new Image()" neuer Speicher für ein Bild angefordert. Dieser Speicher wird niemals freigegeben, da img[] ein globales Array ist. (Ich weißt jetzt aber nicht, ob die Garbage-Collection von Javascript gut genug ist, zu ekennen, dass das Bild, das vor der Zuweisung von img = new Image(); in img referenziert wurde, nun nicht mehr referenziert ist. Meine schlechten Erfahrungen mit Javascript sagen mir aber: eher nicht.)
Was meine Version angeht: Niemand hindert dich daran, i *vor* der Zuweisung eines neuen Bildes zu erhöhen. Dann aber i<= number_pics durch i<number_pics ersetzen.
Was du nicht machen darfst, ist, i jemals wieder zurückzusetzen. Das ist erstens vollkommen unnötig, denn die Bilddateien müssen nur einmal geladen werden, und zweitens braucht jeder Durchlauf dann erneut neuen Speicher für alle Bilder.
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
Du meinst, mit jedem Durchlauf wird das array vergroessert oder ein neues Array angelegt?
Da kenne ich mich nicht aus.
Ich gehe davon aus, dass ich mit "img" immer wieder auf das gleiche Image zugreife bei jedem Durchlauf und nur 1 Array habe.
Deiner Beschreibung nach habe ich es nicht zum Laufen bekommen.
Es soll ja eine Endlosschleife sein, daher setze ich am Ende den Zähler auf 0. Bild a1.jpg soll ja bei jedem Wiederholen wieder erscheinen. Dass ist sonst nicht der Fall.
"new Image()" ruft den Constructor für ein Image-Objekt auf. Dieses Objekt belegt Speicher. Entfernt man die letzte Referenz auf ein Objekt, wird der Garbage Collector es in einer ruhigen Minute entfernen und den Speicher wieder freigeben.
Leider kann man nicht steuern, wann das passiert, so dass man in die dumme Situation geraten kann, dass man Objekte schneller erzeugt als der Garbage-Collector sie wieder wegwirft. In dem Fall frisst der Javascript-Interpreter im Browser immer mehr Speicher und der Rechner des armen Javascript-Opfers wird immer langsamer...
Also solltest du nicht jedes Mal ein neues Image-Objekt erzeugen, sondern nur die Anzahl, die tatsächlich an Bildern vorliegt.
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
Der Effekt sollte auftreten, wenn animate() sehr oft in kurzer Zeit aufgerufen wird. Wobei "kurze Zeit" sich nach der Systemlast beim Anwender richtet. Und natürlich ist das auch vom Browser abhängig.
free() oder destroy() gibt's bei Javascript nicht, das soll ja der Garbage-Collector machen, sobald ein Objekt nirgendwo mehr benutzt wird. Leider verführt das dazu, dass die meisten Javascript-Programmierer sich keine Gedanken über den Speicherbedarf machen, und so sind da eine Menge kaputter Skripte im Umlauf.
Übrigens ist deine Version auch wenn der beschriebene Fehler nicht auftritt ressourcenfressender als notwendig, denn die Bilder werden ja bei jedem Durchlauf von animate() neu vom Webserver geladen. Genau das sollte das Laden am Anfang ja vermeiden -- wenn man auf eine geringe Belastung des Webservers keine Wert legt, braucht man das ganze Array-Konstrukt nicht.
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
Bei mir wurden die Daten nur einmal geladen (Firefox).
Beim Looping hat sich Firefox aus dem Cache bedient und nur noch gelegentlich und sehr geringen Traffic verursacht.
Sicher mag das technisch so sein, wie du schreibst.
Einen negativen Effekt konnte ich bei mir bisher noch nicht feststellen. Wenn ich mehr Durchblick habe, optimiere ich den Code.
Als vorher die gesamten Daten auf einmal geladen werden mussten, lahmte der Rechner schon gewaltig und das ist unzumutbar.