网站搜索

javascript - WebGL 对象会被垃圾回收吗?


在 JavaScript 中,我分配的内存(例如 ArrayBuffer)在我不再持有任何引用时会被垃圾回收器释放,这是我理解正确的吧?

像缓冲区或纹理这样的 WebGL 对象与 GPU 上的内存块相关联,这些内存块是通过 gl.bufferData() 或 gl.textureImage2D() 分配的。

我想知道:如果我放弃对 WebGLTexture 或 WebGLBuffer 对象的最后一个引用,它会不会被垃圾回收,并且对应的 GPU 内存块会自动被 JavaScript 虚拟机释放?

答案#1

是

来自规格

请注意,当 JS 对象被销毁时,底层 GL 对象将会被自动标记为删除

但你应该注意,对象在你放弃最后一个引用时可能还不会被销毁,所以调用 deleteBuffer 仍然是一个好习惯。

答案#2

从这个回答复制:WebGLTextures 会被垃圾回收吗?

将单词 WebGLTexture 改为 WebGLObject

是也不是。

是的,它们会被垃圾回收。但垃圾回收发生的时间取决于浏览器何时决定回收它们。从大多数浏览器 JavaScript 引擎的角度来看,WebGLObject 对象只是一个包含 int 的微小对象,所以没有简单的方式来知道有任何特殊的回收压力。换句话说,当 GPU 内存不足时,JavaScript 垃圾回收器与 GPU 无关联,因此无法知道需要释放这些微小的 WebGLObject 对象以腾出纹理内存。它只关注 CPU 内存。

这实际上是垃圾回收的一个众所周知的问题。它对内存很好,但对其他资源就不那么好了。

所以,是的,WebGLObject 对象会被垃圾回收,是的,纹理/缓冲区/渲染缓冲区/程序/着色器会被释放,但从实际操作来看,如果你不想耗尽内存,你需要自己删除它们。

当然,如果你刷新页面或在同一标签页访问新页面,浏览器会释放它们,但你不能指望浏览器以任何有用的方式回收 WebGLObject 对象(纹理/缓冲区/渲染缓冲区/程序/着色器)。