WebGL对象是否进行垃圾回收?

6
在JavaScript中,我分配的内存(例如ArrayBuffer)在没有任何引用时会被GC释放,我理解得没错吧?
WebGL对象(如缓冲区或纹理)与由gl.bufferData()或gl.textureImage2D()分配的GPU上的内存块相关联。
我想知道:如果我放弃对WebGLTexture或WebGLBuffer对象的最后一个引用,它是否会随着JavaScript VM自动垃圾回收并释放其GPU内存块?

我认为没有。另外,gl.bufferData()gl.textureImage2D()好像并没有返回任何引用对象。 - apple apple
@appleapple 我知道。引用是使用 gl.createBuffer() 创建的,稍后使用 gl.bufferData() 为该引用分配了一个内存块。我们还需要考虑到我取消绑定了缓冲目标 gl.ARRAY_BUFFERgl.ELEMENT_ARRAY_BUFFER - Danny Raufeisen
好的,看来我错了。它会自动删除。 - apple apple
2个回答

4

是的


来自规范

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


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


谢谢! :) 这意味着,如果我从未手动调用gl.deleteBuffer(),那么我不一定会打开内存泄漏。 - Danny Raufeisen
1
@DannyRaufeisen 我不会依赖垃圾回收器来收集我的对象。这可能仍然会导致问题。毕竟,只要关闭选项卡,所有资源都应该被释放。 - apple apple

3

以下是这个回答的翻译:WebGLTextures是否会被垃圾回收?

WebGLTexture一词更改为WebGLObject


是的,也不是。

是的,它们会被垃圾回收。但是垃圾回收是在浏览器决定进行回收的时候执行的。从大多数浏览器JavaScript引擎的角度来看,WebGLObject对象是一个仅包含int的小对象,因此没有简单的方法可以知道任何特殊的压力来收集它。换句话说,当GPU内存用尽时,JavaScript垃圾收集器(与GPU无关)无法知道它需要释放这些微小的WebGLObject对象以释放纹理内存。它只查看CPU内存。

这实际上是垃圾回收的一个众所周知的问题。它对于内存很好,但对于其他资源来说并不太好。

因此,是的,WebGLObject对象会被垃圾回收,纹理/缓冲区/渲染缓冲区/程序/着色器也会被释放,但实际上你需要自己删除它们,如果你不想用尽内存。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接