javascript - 在一页 session 中可以加载的 WebGL 纹理数量是否有限制?

标签 javascript google-chrome memory-leaks textures webgl

我正在使用glfx.js一个网站的图像效果库,我有一个 Canvas ,然后渲染一张不断被新图像替换的图像,然后对其应用滤镜。

问题是运行几分钟后(加载大约 2300 个不同的纹理后)WebGL 会抛出此错误:

WebGL: INVALID_VALUE: texImage2D: bad image data

我已经将范围缩小到这个函数:

Texture.prototype.loadContentsOf = function(element) {
  this.width = element.width || element.videoWidth;
  this.height = element.height || element.videoHeight;
  gl.bindTexture(gl.TEXTURE_2D, this.id);
  gl.texImage2D(gl.TEXTURE_2D, 0, this.format, this.format, this.type, element);
};

在第 2,300 次调用 gl.texImage2D() 后,WebGL 抛出 INVALID_VALUE 错误,然后页面崩溃(Chrome 会发出“噢,啪!”)。

我通过调用以下命令来破坏纹理:

Texture.prototype.destroy = function() {
  gl.deleteTexture(this.id);
  this.id = null;
};

在一个页面 session 上可以加载的纹理数量是否有限制?我只需要在内存中保留大约 200 个,其他的我在使用后销毁。我销毁纹理后,WebGL 是否不会释放内存?

并澄清这不是图像本身的问题,如果我只是加载相同的图像多次,也会发生此错误。

我正在最新的 Chrome Canary 上对其进行测试。

最佳答案

我发现了问题。它与 WebGL 无关。问题是加载图像时出现内存泄漏。完成它们后,我将纹理设置为 null,而不是 Image 对象。完成后,只需添加 img = null 即可修复问题,Chrome 不再崩溃。

令人困惑的是,Chrome 在尝试加载图像时没有抛出错误,并且 onload 回调被调用得很好,但在尝试使用该图像时它会崩溃。我将在 Chromium 上提交一份错误报告,因为我认为这不是正确的行为(当无法加载图像时应该抛出一些其他错误)。

关于javascript - 在一页 session 中可以加载的 WebGL 纹理数量是否有限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19188974/

相关文章:

javascript - 使用 C# 从服务器端打开页面加载事件的模态弹出窗口

javascript - 受密码保护的 Chrome 扩展程序

ios - 收到内存警告。在 iPad 中级别=1

c++ - 使用cgo调用c库的golang时未检测到sanitizer-leak

javascript - Angularjs:需要验证 ng-repeat 内的下拉菜单

javascript - Puppeteer 与 Nativescript 解决方法

javascript - jquery 隐藏/显示 div 故障排除

javascript - `Proxy` 将 `this[toString]` 与 `this[Symbol.toStringTag]` 混淆

google-chrome - 如何关闭chrome浏览器自动更新

swift - 为什么这段 Swift 代码会泄漏内存,我该如何处理?