8

キャンバスごとに 1 つずつ、多くの webgl コンテキストを使用しているページがあります。新しいコンテキストを作成するたびに、キャンバスをリロードしたり、サイズを変更したりできます。数回のリロードで機能しますが、最終的に新しいコンテキストを作成しようとすると null 値が返されます。メモリが不足していると思います。

使用しなくなったコンテキストを削除して、メモリを回復して新しいコンテキストに使用できるようにしたいと考えています。これを行う方法はありますか?または、多くのキャンバスを処理するためのより良い方法はありますか?

ありがとう。

4

2 に答える 2

6

これは、Chrome と WebKit の長期にわたるバグです。

http://code.google.com/p/chromium/issues/detail?id=124238

WebGL でコンテキストを「削除」する方法はありません。コンテキストは、システムがガベージ コレクションに到達するたびに、ガベージ コレクションによって削除されます。その時点ですべてのリソースが解放されますが、ブラウザがリソースを削除するのを待つのではなく、独自のリソースを削除することをお勧めします。

私が言ったように、これはバグです。最終的には修正される予定ですが、ETA はありません。

キャンバスを削除しないことをお勧めします。保管して再利用してください。

別の提案として、なぜ 200 枚のキャンバスが必要なのかを教えてください。あなたが解決しようとしている問題は、別の方法で解決した方がよいかもしれません。

于 2013-02-21T01:16:07.033 に答える
4

コンテキストに関連付けられているすべてのリソースを解放するまで、何かがまだそれへの参照を保持しているため、それはまだ存在していると思います。

試してみるいくつかのこと:

  • ここにいくつかのデバッグ gl コードがあります。コンテキストを初期状態にリセットする関数があります。それが属するキャンバスを削除する前にそれを試してください。

  • 一部のイベント システムがコンテキストへの参照を保持し、コンテキストをゾンビ状態に保つ可能性があります。

  • キャンバスを DOM から削除していますか? ページが 1 つのインスタンスで維持できるリソースには制限があると確信しています。

SO は、コメント スレッドが少し長くなったと不満を漏らしていました。最初にこれらのことを試してみて、それが役立つかどうか教えてください.

于 2013-02-20T02:42:32.550 に答える