我正在为网络和移动开发一个WebGL应用程序。我经常使用硬刷新来测试我的WebGL实现的结果。在视图尝试之后,我得到了错误:
Error: WebGL: Exceeded 16 live WebGL contexts for this principal, losing the least recently used one.
这不会出现在新启动的浏览器上,而是在多次刷新站点之后。我想WebGL上下文还没有完成、发布、销毁、清理、释放。
我该怎么做?
Khronos在这里创建了一个用于释放和垃圾收集WebGL上下文的测试套件:https://www.khronos.org/registry/webgl/sdk/tests/conformance/context/context-creation-and-destruction.html (注:这可能会使浏览器崩溃!)
测试通过PASS
和TEST COMPLETE
进行,因此基本测试不会检测到任何问题。但是,打开JavaScript控制台时,它会读取以下33个实例:
Error: WebGL: Exceeded 16 live WebGL contexts for this principal, losing the least recently used one.
这是浏览器处理WebGL的方式中的一个错误吗?还是我做错什么了?我从未想过释放任何WebGL上下文。
我正在使用Firefox Developer Edition 48.0a2和Firefox 46.0.1。
如何释放和垃圾收集WebGL上下文?
发布于 2016-05-06 12:58:14
我想我可能误解了你的问题
你说你在做艰苦的复习。意味着你在浏览器中按刷新?在这种情况下,首先我会禁用所有的扩展,看看问题是否仍然存在。如果是的话,我会向mozilla提交一个bug
否则,如果你试图免费的画布,创造一个知道的,并希望垃圾收集良好。这是我在重读你的问题之前写的答案
简单地说,你不能强迫垃圾收集。你最好还是重复使用同样的画布。
这里有一个解决方案来释放所有数据并重新设置画布
但是,在您的特定情况下,您是否100%确定没有保留对WebGL上下文或画布的某些引用?例如,如果你这样做
canvas.addEventListener('click', function(..) {});
你刚刚做了一个绝不会被垃圾收集的画布。它附带了一个事件侦听器函数。您没有办法删除该函数,因为您没有保留对它的引用。您需要删除所有侦听器,作为可能泄漏引用的许多方法的一个示例。
有很多方法可以意外地保存对画布和WebGL对象等HTML元素的引用。保持超过零的引用,它将永远不会被垃圾收集。
另一方面,如果是我,我会尝试重复使用画布。为了确保我释放了所有我可能调用的跟踪所有资源的创建/删除函数。示例
var textures = [];
function createTexture(gl) {
var tex = gl.createTexture();
textures.push(txt);
}
function deleteTexture(gl, tex) {
gl.deleteTexture(tex);
textures.splice(textures.indexOf(tex), 1);
}
因为我正在跟踪所有的纹理,所以我可以很容易地删除所有剩下的纹理
while (textures.length) {
gl.deleteTexture(textures.pop());
}
https://stackoverflow.com/questions/37072303
复制相似问题