是否收集了 WebGLTextures 垃圾?
Are WebGLTextures garbage collected?
在 WebGL 中,使用以下方法创建和销毁纹理:
WebGLTexture? createTexture();
void deleteTexture(WebGLTexture? texture);
而在 GLES 中您使用数字(地址?)来引用纹理,而在 WebGL 中有一个 WebGLTexture
对象。
这是否意味着如果此类对象超出范围并被垃圾收集,其关联纹理也将从 GPU 中删除?如果不是,为什么不呢?
(这取决于实现 - 我认为至少规范没有提及 - 所以我对主要浏览器很感兴趣。)
是也不是。
是的,它被垃圾收集了。但是只要浏览器决定收集它,垃圾收集就会发生。从大多数浏览器 JavaScript 引擎的 POV 来看,WebGLTexture
对象是一个只包含 int
的小对象,因此它没有简单的方法来了解收集它的任何特殊压力。换句话说,当 OpenGL 运行 内存不足时,与 OpenGL 无关的 JavaScript 垃圾收集器无法知道它需要释放这些微小的 WebGLTexture
对象才能按顺序释放纹理内存。它只查看 CPU 内存。
这实际上是一个众所周知的垃圾回收问题。这对记忆很有帮助。它对其他资源来说不是很好。
所以,是的,WebGLTextures
是垃圾收集器,是的,纹理将被释放,但实际上如果你不想 运行 内存不足,你需要自己删除它们。
当然,如果您刷新页面或访问同一选项卡中的新页面,浏览器将全部释放它们,但您不能指望浏览器进行垃圾收集 WebGLTextures
(或任何其他 WebGL 资源) 以任何有用的方式。
在 WebGL 中,使用以下方法创建和销毁纹理:
WebGLTexture? createTexture();
void deleteTexture(WebGLTexture? texture);
而在 GLES 中您使用数字(地址?)来引用纹理,而在 WebGL 中有一个 WebGLTexture
对象。
这是否意味着如果此类对象超出范围并被垃圾收集,其关联纹理也将从 GPU 中删除?如果不是,为什么不呢?
(这取决于实现 - 我认为至少规范没有提及 - 所以我对主要浏览器很感兴趣。)
是也不是。
是的,它被垃圾收集了。但是只要浏览器决定收集它,垃圾收集就会发生。从大多数浏览器 JavaScript 引擎的 POV 来看,WebGLTexture
对象是一个只包含 int
的小对象,因此它没有简单的方法来了解收集它的任何特殊压力。换句话说,当 OpenGL 运行 内存不足时,与 OpenGL 无关的 JavaScript 垃圾收集器无法知道它需要释放这些微小的 WebGLTexture
对象才能按顺序释放纹理内存。它只查看 CPU 内存。
这实际上是一个众所周知的垃圾回收问题。这对记忆很有帮助。它对其他资源来说不是很好。
所以,是的,WebGLTextures
是垃圾收集器,是的,纹理将被释放,但实际上如果你不想 运行 内存不足,你需要自己删除它们。
当然,如果您刷新页面或访问同一选项卡中的新页面,浏览器将全部释放它们,但您不能指望浏览器进行垃圾收集 WebGLTextures
(或任何其他 WebGL 资源) 以任何有用的方式。