2013-02-20 19 views
7

Mam stronę, która używa wielu kontekstów webgl, po jednym na każde płótno. płótna można przeładowywać, zmieniać rozmiar itp. za każdym razem, gdy tworzy się nowe konteksty. Działa na kilka przeładowań, ale ostatecznie, gdy próbuję utworzyć nowy kontekst, zwraca wartość pustą. Zakładam, że brakuje mi pamięci.Usuwanie kontekstów WebGL

Chciałbym móc usunąć konteksty, których już nie używam, więc mogę odzyskać pamięć i użyć jej dla moich nowych kontekstów. Czy jest jakiś sposób to zrobić? Czy istnieje lepszy sposób na radzenie sobie z wieloma płótnami?

Dzięki.

+0

Wywołanie getContext() zwraca wartość null, więc niepowodzenie występuje, gdy próbuję ustawić port wyświetlania błędów, ponieważ obiekt ma wartość NULL. – user2089247

+0

Cóż, powinieneś sprawdzić, czy twój kontekst jest poprawny przed zrobieniem _annego_uścia po wywołaniu 'getContext()' – Aesthete

+0

Zawodzi, gdy tworzony jest ~ 200. kontekst. Pierwsze 199 są piękne i cudowne. Kod jest dość prosty. – user2089247

Odpowiedz

5

To wieloletnie błędów w Chrome i WebKit

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

Nie ma sposobu, aby "usunąć" kontekst w WebGL. Konteksty są usuwane przez wyrzucanie śmieci, gdy tylko system się do niego zbliży. Wszystkie zasoby zostaną zwolnione w tym momencie, ale najlepiej, jeśli usuniesz własne zasoby, zamiast czekać, aż przeglądarka je usunie.

Jak już powiedziałem, jest to błąd. To ostatecznie zostanie naprawione, ale nie mam ETA.

Sugerowałbym, aby nie usuwać kanwy. Zachowaj je i wykorzystaj ponownie.

Inną propozycją jest poinformowanie nas, dlaczego potrzebujesz 200 płócien. Być może problem, który próbujesz rozwiązać, byłby lepiej rozwiązany w inny sposób.

2

Będę założyć, że dopóki nie zwolnią wszystkich zasobów dołączonych do kontekstu, coś nadal będzie zawierać odniesienia do niego, a zatem nadal będzie istnieć.

Kilka rzeczy, aby spróbować:

  • Here is some debug gl code. Jest tam funkcja resetowania kontekst to stan początkowy. Spróbuj przed usunięciem płótna, do którego należy.

  • To możliwie że jakiś system wydarzenie może posiadać odniesienie do swoich kontekstach, utrzymując je w stanie zombie.

  • Czy usuwasz płótna z DOM? Jestem pewien, że istnieje limit zasobów, które strona może utrzymywać w jednym przypadku.

SO narzekało, że nasz wątek z komentarzem jest coraz dłuższy. Wypróbuj te rzeczy jako pierwsze i daj mi znać, jeśli to pomoże.

+0

Pomógł kod debugowania. Rzeczy są o wiele lepsze, jeśli chodzi o śledzenie kontekstów i od czasu do czasu czyszczenie ich wszystkich za pomocą WebGLDebugUtils.resetToInitialS tate (gl) ;, następnie usuń kanwy, a następnie usuń konteksty. – user2089247

+1

To połączenie jest zepsute, ale kod jest również hostowany pod adresem https://code.google.com/p/webglsamples/source/browse/khronos/webgl-debug.js?name=211f7fbdc9&r=211f7fbdc9752db2540432c91f6ec266879d88d4#267 – orlade