Estoy tratando de destruir (o destruir o desechar) una 'instancia' de Three.JS usando esto:
Ejemplo completo: https://jsfiddle.net/v7oLzs4m/58/
function kill() { const rendererDomWas = renderer.domElement; renderer.dispose(); controls.dispose(); renderer = scene = camera = controls = null; document.body.removeChild( rendererDomWas ); shouldRender = false; } function animate() { if(!shouldRender) {return} // no more requesting animation frames if 'shouldRender' is false frameID = window.requestAnimationFrame( animate ); renderer.render( scene, camera ); } (es decir, desechar, establecer referencias en nulo y evitar que el bucle de dibujo touching el renderizador mientras shouldRender es false )
Parece que funciona al principio (el contenido del renderizador deja de mostrarse), pero cuando vuelvo a crear la instancia, nunca vuelve.
Es como si algo todavía estuviera... aferrándose al GLContext que evita que se invoque nuevamente.
¿Por qué no puedo volver a crear una nueva instancia de Three.JS?
No estoy seguro de por qué esto funciona (ya que ya estaba haciendo esto en mi Fiddle...)
Pero resulta que el ingrediente secreto (para mí) para permitir que Three.JS se GC'd/se elimine es este:
window.cancelAnimationFrame(frameID);Supongo que esto evita que la función de representación se almacene en el bucle de dibujo a nivel de hardware, que contiene referencias a GLContext (y la cadena)
El GC nunca puede suceder a menos que el 'bucle esté roto'
(Corríjanme si me equivoco por favor)