Frage

Ich habe gebaut Conways Leben mit JavaScript / jQuery, um es in einem Browser auszuführen Hier. Chrome, Firefox und Oper oder Safari tun dies ziemlich schnell, also verwenden Sie vorzugsweise nicht dh dafür. IE9 ist aber in Ordnung. Während ich die neuen Generationen des Lebens generiere, speichere ich die vorherigen Generationen, um durch die Geschichte zurückzukehren. Dies funktioniert gut, bis ein bestimmter Punkt beim Ausfüllen des Speichers, wodurch der Browser (Tab) zum Absturz gebracht wird.

Meine Frage lautet also: Wie kann ich erkennen, wann das Speicher ausgefüllt wird? Ich speichere ein Array für jede Generation in einem Array, das die Geschichte der Generationen bildet. Dies erfordert eine große Menge an Speicher, was den Browser nach einigen tausend Generationen abhängt, abhängig vom verfügbaren Speicher. Ich bin mir bewusst, dass JavaScript die Menge des verfügbaren Speichers nicht überprüfen kann, aber es muss einen Weg geben ...

War es hilfreich?

Lösung

Ich bezweifle, dass es eine Möglichkeit gibt, es zu tun. Auch wenn es vorhanden wäre, wäre es wahrscheinlich Browserspezifisch. Ich kann jedoch einen anderen Weg vorschlagen.

Anstatt alle Daten für jede Generation zu speichern, speichern Sie ab und zu Schnappschüsse. Da das Lebensspiel des Conway deterministisch ist, können Sie zukünftige Rahmen aus einem bestimmten Schnappschuss leicht wiederherstellen. Sie möchten wahrscheinlich einen Puffer von ein paar Frames behalten, damit Sie sich gut und glatt machen können.

In Wirklichkeit nicht eigentlich nicht lösen Das Problem, da Ihnen irgendwann keinen Platz mehr hat. Wenn Sie jedoch alle aufbewahren n Frames, Ihre Bewerbung dauert n Zeiten länger, was nur lang genug sein könnte. Ich würde empfehlen, dass Sie einige harte Grenzen auferlegen, wie weit Sie in die Vergangenheit zurückspulen können, damit Sie eine Kappe dafür haben, wie viel Sie zum Speichern haben. Bestimmen Sie, wie viele Frames das sein würden (10 Minuten bei 30 fps = 18000 frames). Dann teilen frames Wie viele Frames können Sie speichern (profilieren Sie verschiedene Webbrowser, um dies herauszufinden) und das ist das Intervall zwischen Schnappschüssen, die Sie verwenden sollten.

Andere Tipps

Dogbert hat es ziemlich genagelt. Sie können nicht genau wissen, wie viel verfügbarer Speicher es gibt, aber Sie können wissen, wie groß Ihr Datensatz sein wird.

Nehmen Sie also die Größe jedes im Array gespeicherten Objekts, multiplizieren Sie mit Array -Dimensionen und das ist die Größe einer Iteration. Multiplizieren Sie das mit der gewünschten Anzahl von Iterationen, um zu sehen, wie viel Platz insgesamt er nimmt, und sich entsprechend einstellen.

Oder, inspiriert von Travis, führen Sie das Muster einfach umgekehrt vom letzten bekannten Array aus. Es ist doch deterministisch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top