在WebGL中,使用以下命令创建和销毁纹理:
WebGLTexture? createTexture();
void deleteTexture(WebGLTexture? texture);
在GLES中,您使用数字(地址?)来引用纹理,而在WebGL中有一个WebGLTexture
对象。
这是否意味着如果这样的对象超出范围并被垃圾收集,其关联的纹理也将从GPU中删除?如果没有,为什么不呢?
(这取决于实现 - 至少规范并没有提到它我认为 - 所以我对主要浏览器感兴趣。)
答案 0 :(得分:5)
是和否。
是的,它是垃圾收集。但是,只要浏览器决定收集它,就会发生垃圾收集。从大多数浏览器JavaScript引擎的POV来看,WebGLTexture
对象是一个只包含int
的小对象,所以它没有简单的方法来知道收集它的任何特殊压力。换句话说,当OpenGL内存不足时,没有与OpenGL连接的JavaScript垃圾收集器无法知道它需要释放这些微小的WebGLTexture
对象以释放纹理内存。它只关注CPU内存。
这实际上是众所周知的垃圾收集问题。这对记忆很有好处。对其他资源来说并不是那么好。
所以,是的,WebGLTextures
是垃圾收集的,是的,纹理将被释放,但实际上你需要自己删除它们,如果你不想耗尽内存。
当然,如果您刷新页面或访问同一选项卡中的新页面,浏览器将释放所有内容但您无法依靠浏览器来垃圾收集WebGLTextures
(或任何其他WebGL资源)任何有用的方式。