Webgl上下文丢失但未恢复

时间:2015-01-25 10:51:49

标签: javascript memory webgl

我遇到了webgl上下文丢失/恢复的问题。

我的应用程序非常繁重,有大量的信息,图表,列表,......和地图。

在地图中我使用webGL以获得最佳性能。我的代码正在处理丢失和正确恢复的上下文。

我开始一项大型操作,导致从服务器加载数据,解析它,...这有时会使浏览器失去我的webgl上下文。问题是上下文永远不会恢复。当我再次做这个大操作时,我得到了恢复事件。

在我看来,它与内存和垃圾收集器释放时间有关。

但我真的不知道该怎么做,以及如何解决这个问题。

2 个答案:

答案 0 :(得分:2)

找到一种手动调用恢复上下文的方法。不知道这样做是否好/聪明,但它对我有用。

我们使用扩展程序WEBGL_lose_context来完成。 MDN reference

// Loading the extension
var ext = gl.getExtension("WEBGL_lose_context"); 

...
// This code in the context lost event, wait 3 secs for forcing 
// restore context
var restoreTimeout = setTimeout(function() { 
     ext.restoreContext(); 
}, 3000);

...
// This code in restore context event
// incase we got restore not from my timeout, i'm canceling it
restoreTimeout && clearTimeout(restoreTimeout);

答案 1 :(得分:-2)

处理丢失的方法可能是重新创建画布并重新初始化GL部件的应用程序。最后,所有资源都消失了,因此上下文重新创建的额外开销不应该太麻烦,您可以在webglcontextlost事件到达时立即采取行动。

(不确定这是不是最好的主意......)

评论Raziza关于WEBGL_lose_context的答案:

不要像你在那里那样使用这个。此扩展仅仅是一个调试工具,只应用于模拟此行为。

(另见:https://www.khronos.org/registry/webgl/extensions/WEBGL_lose_context/

顺便说一句:支持这一点,所以我得到积分并可能很快就答案发表评论;)