删除WebGL上下文

9
我有一个页面,其中使用了许多WebGL上下文,每个画布都有一个上下文。画布可以重新加载、调整大小等,每次会创建新的上下文。它可以在几次重载后工作,但最终当我尝试创建新的上下文时,它会返回一个null值。我认为是因为内存不足。
我希望能够删除我不再使用的上下文,以便恢复内存并将其用于我的新上下文。有没有办法做到这一点?或者有没有更好的处理多个画布的方法?
谢谢。

getContext()调用返回null,因此当我尝试设置视口时会出现错误,因为该对象为空。 - user2089247
在调用getContext()之后,您应该首先检查您的上下文是否有效,然后再执行任何其他操作。 - Aesthete
当创建第200个上下文时,它会失败。前199个是美丽和精彩的。代码非常简单。 - user2089247
是的,绝对超过100。 - user2089247
哦,是的,如果我刷新/重新加载它会清除内存,就像我刚打开浏览器一样工作。所以我要找的就是刷新这些上下文的东西。我已经尝试删除附加到画布的上下文,但上下文并没有被清除。 - user2089247
显示剩余2条评论
2个回答

7

这是Chrome和WebKit中存在已久的一个bug。

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

在WebGL中,没有“删除”上下文的方法。 上下文会在系统有空时由垃圾回收机制自动删除。 所有资源将在此时释放,但最好删除您自己的资源,而不是等待浏览器删除它们。

正如我所说,这是一个错误。 它最终将被修复,但我没有估计时间。

我建议不要删除画布。 保留它们并重新使用它们。

另一个建议是告诉我们为什么需要200个画布。 也许您试图解决的问题可以用其他方法更好地解决。


4
我认为,在释放与上下文相关的所有资源之前,某些内容仍将保留对它的引用,因此它仍然存在。
一些尝试:
- 在删除归属于canvas的上下文之前,请尝试使用一些调试gl代码。那里有一个函数可以将上下文重置为其初始状态。 - 一些事件系统可能会保留对您的上下文的引用,使它们处于僵尸状态。 - 您是否从DOM中删除了您的画布?我确定页面可以在一个实例中维护的资源数量是有限制的。
SO抱怨我们的评论线程有点长。首先尝试这些方法,让我知道是否有帮助。

调试代码已经起到了帮助作用。通过使用 WebGLDebugUtils.resetToInitialState(gl) 来跟踪上下文并定期清理所有上下文,情况有了很大改善。然后删除画布和上下文。 - user2089247

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接