Repetir un ciclo de vida a propósito
Capture una línea de base después de cargar, juegue el mismo nivel corto, regrese al menú y repita esa ruta exacta varias veces. Utilice las herramientas de memoria del navegador para comparar instantáneas tomadas en el mismo punto después de la limpieza y la recolección de basura cuando las herramientas lo permitan. Busque recuentos crecientes de un tipo de objeto específico, como nodos de escena, en lugar de reaccionar únicamente a la memoria total.
Ejecute la prueba una vez con las herramientas de desarrollador cerradas y una vez abierta si la medición en sí parece cambiar el comportamiento. La señal útil es si las mismas clases y rutas retenidas se acumulan a lo largo de los ciclos, no si una instantánea tiene un número mayor que el de otra máquina.
Definir cómo se limpia cada escena al terminar
Cuando termina una escena, cancela el frame de animación pendiente, detén los temporizadores, elimina los listeners registrados en objetos de mayor duración y vacía las colecciones que contienen las entidades de la escena. Conserva las referencias a los callbacks para poder eliminarlos, o agrupa listeners relacionados con un AbortController y cancela el grupo al desmontar la escena.
Prueba el límite: entra y sal de una escena, activa la acción de entrada anterior y confirma que la escena previa ya no responde. Comprueba también que los recursos en caché se compartan o se liberen de forma deliberada. Una limpieza indiscriminada puede causar recargas innecesarias, mientras que una referencia retenida por error puede mantener viva una escena grande.
Preguntas sobre pérdida de memoria del juego de navegador
¿El aumento de la memoria demuestra una fuga?
No. Los navegadores reservan memoria y recolectan objetos según su propio calendario. Una fuga resulta más probable cuando sesiones equivalentes retienen progresivamente más instancias por una referencia que el código todavía conserva.
¿Eliminar un detector de eventos puede ayudar a la limpieza?
Sí, si un objeto de larga duración conserva un callback que mantiene referencias a datos de la escena. MDN documenta removeEventListener() y también explica cómo pasar un AbortSignal para eliminar juntos varios listeners.
Más información
¿Has visto algo desactualizado? Notificar una corrección