是否收集了 WebGLTextures 垃圾?

Are WebGLTextures garbage collected?

在 WebGL 中,使用以下方法创建和销毁纹理:

WebGLTexture? createTexture();
void deleteTexture(WebGLTexture? texture);

而在 GLES 中您使用数字(地址?)来引用纹理,而在 WebGL 中有一个 WebGLTexture 对象。

这是否意味着如果此类对象超出范围并被垃圾收集,其关联纹理也将从 GPU 中删除?如果不是,为什么不呢?

(这取决于实现 - 我认为至少规范没有提及 - 所以我对主要浏览器很感兴趣。)

是也不是。

是的,它被垃圾收集了。但是只要浏览器决定收集它,垃圾收集就会发生。从大多数浏览器 JavaScript 引擎的 POV 来看,WebGLTexture 对象是一个只包含 int 的小对象,因此它没有简单的方法来了解收集它的任何特殊压力。换句话说,当 OpenGL 运行 内存不足时,与 OpenGL 无关的 JavaScript 垃圾收集器无法知道它需要释放这些微小的 WebGLTexture 对象才能按顺序释放纹理内存。它只查看 CPU 内存。

这实际上是一个众所周知的垃圾回收问题。这对记忆很有帮助。它对其他资源来说不是很好。

所以,是的,WebGLTextures 是垃圾收集器,是的,纹理将被释放,但实际上如果你不想 运行 内存不足,你需要自己删除它们。

当然,如果您刷新页面或访问同一选项卡中的新页面,浏览器将全部释放它们,但您不能指望浏览器进行垃圾收集 WebGLTextures(或任何其他 WebGL 资源) 以任何有用的方式。