WebGLTextures是否会被垃圾回收?

5
在WebGL中,使用以下方法创建和销毁纹理:
WebGLTexture? createTexture();
void deleteTexture(WebGLTexture? texture);

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

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

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


PS:我知道这个问题之前被问过,但是S.O.是一个答案的集合,因此链接到更通用的问题似乎是合适的。 - gman
1个回答

5
是的和不是。
是的,它是垃圾回收的。但是垃圾回收发生在浏览器决定回收它的时候。从大多数浏览器JavaScript引擎的角度来看,WebGLTexture对象是一个只包含int的小对象,因此它没有简单的方法知道任何特殊的压力来回收它。换句话说,当OpenGL内存不足时,JavaScript垃圾收集器(与OpenGL没有关联)无法知道它需要释放这些微小的WebGLTexture对象以释放纹理内存。它只查看CPU内存。
实际上,这是垃圾收集的一个众所周知的问题。对于内存来说很好。对于其他资源来说并不那么好。
因此,是的,WebGLTextures被垃圾回收,纹理将被释放,但实际上,如果您不想耗尽内存,您需要自己删除它们。
当然,如果您刷新页面或在同一选项卡中访问新页面,浏览器会释放它们,但是您不能指望浏览器以任何有用的方式回收WebGLTextures(或任何其他WebGL资源)。

OpenGL运行内存不足会触发垃圾收集器,该GC是否会尽可能清理所有可清理的内容,无论其大小如何?此外,假设WebGL纹理仍然与DOM画布相连,画布是纹理来源,并且具有相当大的权重,那么这样就足以将其收集吗? - Bart van Heukelom
哦,我已经有一段时间没有做嵌入V8的项目了。我记得你可以手动为对象分配特定的“保留内存大小”,即使它们在Javascript内容中很小,GC也知道它们保留了很多。这个方法不再使用吗? - Bart van Heukelom
无法工作。GPU内存与CPU内存不同。当GPU内存已满时,GC本身没有压力。即使有的话,它也需要知道哪些对象代表CPU内存,哪些对象代表GPU内存。我认为任何浏览器都没有实现类似的功能。除此之外,GPU内存是共享的,这意味着GC管理之外的事情会影响可用内存量。 - gman

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