javascript - ¿Los objetos de WebGL son recolectados por el garbage collector?
En JavaScript, la memoria que asigné (por ejemplo, un ArrayBuffer) se libera cuando ya no tengo ninguna referencia a ella según la GC, ¿lo entendí correctamente?
Los objetos de WebGL como Buffers o Texturas están asociados con un bloque de memoria en la GPU según lo asignado por gl.bufferData() o gl.textureImage2D().
Me pregunto: si abandono mi última referencia a un objeto WebGLTexture o WebGLBuffer, ¿se recolecta automáticamente como basura y se libera su bloque de memoria GPU por la máquina virtual de JavaScript?
Respuesta #1
Sí
Desde especificación
Tenga en cuenta que el objeto GL subyacente se marcará automáticamente para eliminación cuando el objeto JS sea destruido
Pero debes notar que el objeto probablemente no se destruiría en el momento en que renuncias a la última referencia, por lo que todavía es una buena práctica llamar a deleteBuffer.
Respuesta #2
Copiado de esta respuesta: ¿Se recolectan como basura los WebGLTextures?
con la palabra WebGLTexture cambiada a WebGLObject
Sí y no.
Sí, son recogidos por el recolector de basura. Pero la recolección de basura ocurre cuando el navegador decide recolectarlos. Desde el punto de vista de la mayoría de los motores de JavaScript de los navegadores, el objeto WebGLObject es un objeto pequeño que solo contiene un int, por lo que no hay una forma sencilla de saber si existe una presión especial para recolectarlo. En otras palabras, cuando la GPU se queda sin memoria, el recolector de basura de JavaScript, que no tiene conexión con la GPU, no tiene manera de saber que necesita liberar estos pequeños objetos WebGLObject para liberar memoria de texturas. Solo está mirando la memoria de la CPU.
Este es en realidad un problema bien conocido de la recolección de basura. Es excelente para la memoria. No es tan bueno para otros recursos.
Entonces, sí, los objetos WebGLObject son recolectados por el garbage collector y sí, la textura/búfer/renderbuffer/programa/shader serán liberados, pero prácticamente hablando, necesitas eliminarlos tú mismo si no quieres quedarte sin memoria.
Por supuesto, el navegador los liberará a todos si actualizas la página o visitas una nueva página en la misma pestaña, pero no puedes contar con que el navegador recolecte basura de los objetos WebGLObject (texturas/búferes/renderbuffers/programas/shaders) de manera útil.