首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何释放和垃圾收集WebGL上下文?

如何释放和垃圾收集WebGL上下文?
EN

Stack Overflow用户
提问于 2016-05-06 12:20:18
回答 1查看 6.5K关注 0票数 13

我正在为网络和移动开发一个WebGL应用程序。我经常使用硬刷新来测试我的WebGL实现的结果。在视图尝试之后,我得到了错误:

代码语言:javascript
运行
复制
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 (注:这可能会使浏览器崩溃!)

测试通过PASSTEST COMPLETE进行,因此基本测试不会检测到任何问题。但是,打开JavaScript控制台时,它会读取以下33个实例:

代码语言:javascript
运行
复制
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上下文?

EN

回答 1

Stack Overflow用户

发布于 2016-05-06 12:58:14

我想我可能误解了你的问题

你说你在做艰苦的复习。意味着你在浏览器中按刷新?在这种情况下,首先我会禁用所有的扩展,看看问题是否仍然存在。如果是的话,我会向mozilla提交一个bug

否则,如果你试图免费的画布,创造一个知道的,并希望垃圾收集良好。这是我在重读你的问题之前写的答案

简单地说,你不能强迫垃圾收集。你最好还是重复使用同样的画布。

这里有一个解决方案来释放所有数据并重新设置画布

如何在使用后从GPU中清理和卸载WebGL画布上下文?

但是,在您的特定情况下,您是否100%确定没有保留对WebGL上下文或画布的某些引用?例如,如果你这样做

代码语言:javascript
运行
复制
canvas.addEventListener('click', function(..) {});

你刚刚做了一个绝不会被垃圾收集的画布。它附带了一个事件侦听器函数。您没有办法删除该函数,因为您没有保留对它的引用。您需要删除所有侦听器,作为可能泄漏引用的许多方法的一个示例。

有很多方法可以意外地保存对画布和WebGL对象等HTML元素的引用。保持超过零的引用,它将永远不会被垃圾收集。

这里有一些关于发现漏洞的提示

另一方面,如果是我,我会尝试重复使用画布。为了确保我释放了所有我可能调用的跟踪所有资源的创建/删除函数。示例

代码语言:javascript
运行
复制
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);
}

因为我正在跟踪所有的纹理,所以我可以很容易地删除所有剩下的纹理

代码语言:javascript
运行
复制
while (textures.length) {
  gl.deleteTexture(textures.pop());
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37072303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档