2

ブラウザで実行するために、javascript/jquery で Conway's Life をビルドてきました。Chrome、Firefox、および Opera または Safari はこれを非常に高速に実行するため、できれば IE を使用しないでください。IE9でも大丈夫です。新しい世代の生命を生成する一方で、歴史をさかのぼることができるように、前の世代を保管しています。これは、メモリがいっぱいになり、ブラウザ(タブ)がクラッシュする特定のポイントまで正常に機能します。

私の質問は次のとおりです。メモリがいっぱいになったことをどのように検出できますか? 世代の履歴を形成する配列に、世代ごとに配列を格納しています。これには大量のメモリが必要であり、使用可能なメモリによっては、数千世代後にブラウザがクラッシュします。JavaScriptが利用可能なメモリの量をチェックできないという事実を認識していますが、方法があるはずです...

4

2 に答える 2

7

それを行う方法があるとは思えません。あったとしても、おそらくブラウザ固有のものでしょう。ただし、別の方法を提案できます。

世代ごとにすべてのデータを保存するのではなく、時々取得したスナップショットを保存します。コンウェイのライフ ゲームは決定論的であるため、特定のスナップショットから将来のフレームを簡単に再生成できます。巻き戻しをうまくスムーズに行えるように、おそらく数フレームのバッファを保持したいと思うでしょう。

実際には、これで問題が解決するわけではありません。最終的にスペースがなくなるからです。ただし、すべてのnフレームを保存すると、アプリケーションはn何倍も長持ちし、十分な長さになる可能性があります。保存しなければならない量に上限を設けるために、巻き戻すことができる過去の期間にいくつかの厳しい制限を課すことをお勧めします. フレーム数を決定します (30 FPS で 10 分 = 18000 frames)。次に、保存できるフレーム数で割りframesます (さまざまな Web ブラウザーをプロファイルしてこれを把握します)。これが、使用する必要があるスナップショットの間隔です。

于 2011-03-17T23:44:05.257 に答える
0

Dogbert はほとんどそれを釘付けにしました。使用可能なメモリの量を正確に知ることはできませんが、データセットがどれだけ大きくなる可能性があるかを知ることはできます。

したがって、配列に格納されている各オブジェクトのサイズを取得し、配列の次元を掛けると、それが 1 回の反復のサイズになります。これに目的の反復回数を掛けて、合計でどれだけのスペースが必要かを確認し、それに応じて調整します。

または、Travis に触発されて、最後の既知の配列からパターンを逆に実行するだけです。やっぱり決定論的です。

于 2011-03-17T23:44:45.083 に答える