WebGLTextures是垃圾收集?

时间:2015-07-06 15:42:32

标签: javascript garbage-collection webgl

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

是和否。

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

这实际上是众所周知的垃圾收集问题。这对记忆很有好处。对其他资源来说并不是那么好。

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

当然,如果您刷新页面或访问同一选项卡中的新页面,浏览器将释放所有内容但您无法依靠浏览器来垃圾收集WebGLTextures(或任何其他WebGL资源)任何有用的方式。