WebGL 对象是否被垃圾收集?

Are WebGL objects garbage collected?

在 JavaScript 中,我分配的内存(例如 ArrayBuffer)在我不再被 GC 引用时被释放,我理解对吗?

缓冲区或纹理等 WebGL 对象与由 gl.bufferData()gl.textureImage2D() 分配的 GPU 上的内存块相关联。

我想知道:如果我放弃对 WebGLTexture 或 WebGLBuffer 对象的最后引用,它是否会通过 JavaScript VM 自动释放的 GPU 内存块进行垃圾收集?


来自spec

Note that underlying GL object will be automatically marked for deletion when the JS object is destroyed


但是你应该注意到,当你放弃最后一个引用时,对象可能不会被销毁,所以调用 deleteBuffer.

仍然是一个很好的做法

从这个答案复制:

单词 WebGLTexture 更改为 WebGLObject


是也不是。

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

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

所以,是的,WebGLObject 对象被垃圾收集了,是的,texture/buffer/renderbuffer/program/shader 将被释放,但实际上如果你不想 运行,你需要自己删除它们内存不足。

当然,如果您刷新页面或访问同一选项卡中的新页面,浏览器会释放它们,但您不能指望浏览器垃圾收集 WebGLObject 个对象(textures/buffers/renderbuffers/programs/shaders) 以任何有用的方式。