2013-02-20 43 views
7

私はキャンバスごとに1つ、多くのwebglコンテキストを使用しているページを持っています。新しいコンテクストを作成するたびに、キャンバスを再ロードしたり、サイズを変更したりすることができます。これはいくつかの再読み込みで動作しますが、最終的に新しいコンテキストを作成しようとするとnull値が返されます。私は思い出がなくなっていると思う。WebGLコンテキストの削除

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

ありがとうございました。

+0

getContext()呼び出しがnullを返すため、オブジェクトがnullであるためビューポートエラーを設定しようとするとエラーが発生します。 – user2089247

+0

'getContext()'の呼び出しの後に_anything_ elseを実行する前にコンテキストが有効であることを確認する必要があります。 – Aesthete

+0

〜200番目のコンテキストが作成されると失敗します。最初の199は美しく素晴らしいです。コードはかなりシンプルです。 – user2089247

答えて

5

これは、長年のChromeのバグやWebKitの

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

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

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

私はキャンバスを削除しないことをお勧めします。それらを保持して再使用してください。

もう1つの提案は、200個のキャンバスが必要な理由を教えてください。たぶんあなたが解決しようとしている問題は、より良い解決策になるでしょう。

2

と仮定します。これは、コンテキストに添付されているすべてのリソースを解放するまで、何かがまだそのリソースへの参照を保持しているため、引き続き存在します。

しようとするいくつかのこと:

  • Here is some debug gl code.機能は、それが初期状態だにコンテキストをリセットすることがあります。それが属するキャンバスを削除する前にそれを試してください。

  • これは、いくつかのイベントシステムは、ゾンビ状態でそれらを保ち、あなたのコンテキストへの参照を保持することができることを可能です。

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

コメントスレッドが少し長くなっていると不平を言っていました。これらのことをまず試してみましょう。

+0

デバッグコードが役立ちました。コンテキストを追跡し、時にはWebGLDebugUtils.resetToInitialSを使用してコンテキストを追跡し、時にはすべてをきれいにすることがより効果的です。 tate(gl);その後、キャンバスを削除して、コンテキストを削除します。 – user2089247

+1

そのリンクは壊れていますが、コードはhttps://code.google.com/p/webglsamples/source/browse/khronos/webgl-debug.js?name=211f7fbdc9&r=211f7fbdc9752db2540432c91f6ec266879d88d4#267でもホストされています – orlade

関連する問題