WebGLTextures是垃圾收集?

Bar*_*lom 3 javascript garbage-collection webgl

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

WebGLTexture? createTexture();
void deleteTexture(WebGLTexture? texture);
Run Code Online (Sandbox Code Playgroud)

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

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

(这是依赖于实现的 - 至少我认为规范没有提到它 - 所以我对主要浏览器感兴趣.)

gma*_*man 5

是的,不是.

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

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

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

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