Entladen Ressourcen auf HTML mit JavaScript
Arbeite ich an einem HTML-5-Spiel, ist es schon online, aber es ist derzeit gering und alles ist okay.
Sache ist, wie es wächst, es wird geladen zu werden, viele, viele Bilder, Musik, sound-Effekte und vieles mehr. Nach 15 Minuten des Spielens des Spiels, die mindestens 100 unterschiedliche Ressourcen haben könnten, wurde bereits geladen. Da es sich um eine HTML5-App, es nie aktualisiert die Seite während des Spiels, so dass Sie alle Stapel in den hintergrund.
Habe ich bemerkt, dass jede Ressource, die ich load - on-WebKit-zumindest mit dem Web-Inspektor - bleibt dort auch, nachdem ich entfernen Sie die <img>
, die <link>
zu den CSS-und sonst. Ich vermute, es ist noch in Erinnerung, gerade nicht benutzt wird, richtig?
Dieser würde am Ende verbrauchen viel RAM schließlich, und führen zu einer Herabstufung in der Leistung speziell auf iOS-und Android-Handys (die ich leicht bemerken, bereits auf der aktuellen version), deren Ressourcen stärker eingeschränkt als desktop-Computer.
Meine Frage ist: Ist es möglich, vollständig zu entladen, eine Ressource, freigeben von Speicherplatz im RAM, über JavaScript? Ohne Aktualisierung der gesamten Seite zu "reinigen".
Schlimmste Szenario: Würde die Verwendung von frames, helfen, durch löschen eines Rahmens, um kostenlos die frames " Ressourcen?.
Danke!
- Eine Sache, die Sie könnten versuchen, zu tun, ist die Einstellung der entsprechenden Ressource Griff zu
null
. Solange die Ressource nicht auf die dort verwiesen wird überall mehr, der Speicher verwendet werden soll Müll gesammelt werden, die von der javascript-engine - Ich werde versuchen, dass! Danke! Tun Sie etwas dagegen teilen mit mir ein link mit Beispielen, wie die Ressourcen zugreifen, die der browser geladen hat? Ich habe eine harte Zeit der Suche, die auf Google =/
- In Firefox und Chrome, dass der garbage collector zu laufen scheint, wenn der Wechsel zu einem anderen tab. Ich bin mir nicht sicher, wie nützlich das ist für Sie, aber wenn der Benutzer nicht ständig spielt, sollten Sie fein sein Vertrauen in den garbage collector.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deine Beschreibung bedeutet, dass Sie vollständig entfernt alle Verweise auf die Ressourcen. Das Verhalten, das Sie zu sehen sind, dann ist einfach der garbage collector nicht aufgerufen, um zu reinigen den Raum, die Häufig in javascript-Implementierungen bis "notwendig". Einstellung
null
oder rufendelete
wird in der Regel nicht besser.Als ein üblicher Fall ist, können Sie in der Regel rufen
CollectGarbage()
während der Szene geladen/entladen zu zwingen, die Sammlung Prozess. Dies ist in der Regel die beste Lösung, wenn die Daten geladen werden, die für das Spiel "Stufen", denn das ist eine Zeit, die nicht zeitkritisch. Sie in der Regel nicht wollen, dass die collector aufrufen, während des Spiels, es sei denn, es ist nicht eine sehr real-time Spiel.Frames sind in der Regel eine schwierige Lösung, wenn Sie verhindern möchten, dass bestimmte Ressourcen, um für gemeinsame Spiel-Steuerelemente. Sie müssen überlegen, ob Sie erfrischender sind die gesamten Ressourcen oder nur bestimmte Ressourcen.
Alles, was Sie tun können, ist verlassen sich auf JavaScript-built-in garbage collection-Mechanismus.
Diese kicks in, wenn es keine Referenz auf das Bild an.
So vorausgesetzt, Sie haben einen Verweis Zeiger für jedes Bild, wenn Sie:
oder
Lohnt sich: http://www.ibm.com/developerworks/web/library/wa-memleak/
Auch: Benötigen Sie Hilfe für diese Funktion zu zerstören, ein Objekt auf canvas mit javascript
BEARBEITEN
Hier ist etwas code, der Ihnen erlaubt, ein Bild zu laden in einer var.
Dies ist besser, dass die Verwendung von JQuery .load (), weil es gibt Ihnen mehr Kontrolle über Bild, Referenzen, und Sie werden aus dem Speicher entfernt werden, wenn der Bezug ist Weg (
null
)Entnommen aus: http://www.techrepublic.com/article/preloading-and-the-javascript-image-object/5214317
Hoffe, es hilft!
Array()
zu halten, mehrere Bilder (wenn das hilft überhaupt)Gibt es 2 bessere Möglichkeiten für das laden von Bildern neben einer normalen
<img>
tag, das Google-Brillant beschreibt hier:http://www.youtube.com/watch?v=7pCh62wr6m0&list=UU_x5XG1OV2P6uZZ5FSM9Ttw&index=74
Laden der Bilder über einen HTML5 -
<canvas>
die Art und Weise viel schneller. Ich würde wirklich beobachten, dass video und implementieren Sie diese Methoden für mehr Geschwindigkeit. Ich könnte mir vorstellen, garbage collection mit canvas-Bereich würde besser funktionieren, weil es brechen Weg von der DOM.Embedded data-urls, wo das src-Attribut des image-tag ist dem eigentlichen binären Daten des Bildes (ja, es ist ein Riesen-string). Es beginnt so:
src="data:image/jpeg;base64,/9j/MASSIVE-STRING ... "
Nach der Verwendung dieser, Sie würde natürlich wollen, verwenden Sie eine Methode zum entfernen dieses Knoten wie bereits in den anderen Antworten. (Ich weiß nicht, wie zu generieren, diese base64-Zeichenfolge versuchen, Google oder video)Sagte Sie Schlimmste Szenario: Würde die Verwendung von frames, helfen, durch löschen eines Rahmens, um kostenlos die frames " Ressourcen
Ist es gut, um Rahmen. Ja, es können freie Ressourcen, die durch das löschen der frames.
<frame>
- tag in HTML5 w3.org/TR/html5-diffAlle Recht, also habe ich meine tests durch das laden von 3 verschiedenen HTML in eine < Artikel > - tag. Jedes HTML hatte viele, große Bilder. Etwas über 15 große Bilder, die pro "Seite".
Also ich verwendet jQuery.load () - Funktion einfügen, die jeweils in den tag. Hatte auch eine extra HTML -, dass nur noch eine < h1 >, um zu sehen, was passiert, wenn eine Seite ohne Bilder war das ersetzen der vorherigen Seite.
Gut, stellt sich heraus, der RAM größer, während Sie anfangen zu scrollen, und schießt, wenn Sie über ein besonders großes Bild (groß wie in Abmessungen und Größe, nicht nur in der Größe). Aber sobald Sie verlassen, dass hinter und hellere Bilder kommen auf dem Bildschirm, der RAM-Verbrauch wirklich runter geht. Und Wann ersetzte ich mit JS den Inhalt der Seite, der RAM-Verbrauch ging wirklich runter, wenn es war, besetzen zu viel. Virtueller Speicher blieb immer hoch und ging selten nach unten.
Also ich denke, die browser ist ganz schlau über den Umgang mit Ressourcen. Es scheint nicht zu entladen, wenn Sie Sie lassen Sie es dort für eine lange Zeit, aber sobald Sie beginnen, laden andere Seiten oder scrollen, beginnt es zu laden /zu befreien.
Ich denke, ich habe nichts zu befürchten, nachdem alle...
Vielen Dank an alle! =)