Regístrese en un límite deliberado del ciclo de vida
Evite adjuntar un controlador de pulsación de tecla de ventana desde una función de renderizado o desde cada cuadro. Coloque la configuración específica de la escena en una función de inicio o montaje y asegúrese de que la función no pueda ejecutarse dos veces sin una limpieza. Mantenga una referencia a la devolución de llamada cuando utilice removeEventListener; las devoluciones de llamada anónimas creadas repetidamente son difíciles de comparar más adelante. Alternativamente, asigne un AbortController a un grupo de controladores relacionados y pase su señal en las opciones del oyente, luego aborte ese grupo cuando finalice la escena.
Elija los objetivos del evento con cuidado. Un detector de ventana global puede ser apropiado para las teclas mientras un juego está activo, pero el controlador de clic de un botón pertenece a ese botón. No registre un controlador delegado en el elemento padre y un controlador directo para la misma acción a menos que la propagación de eventos sea intencionalmente parte del diseño.
Pruebe la entrada repetida a la escena como verificación de síntomas
Abra una escena, presione su acción una vez, salga y ábrala nuevamente. Una entrada aún debería causar un efecto. Repita el ciclo cinco veces y verifique que el recuento de respuestas siga siendo uno por pulsación; Esta es una verificación funcional, no una medición de la memoria. Confirme también que la entrada de la escena anterior ya no cambie su puntuación o estado después de la salida. MDN documenta el soporte de AbortSignal para agrupar listeners y señala que las funciones anónimas necesitan conservar referencias para su eliminación explícita.
Mantenga el desmontaje alineado con la propiedad
Cuando se reemplaza una escena, cancele o elimine sus listeners antes de deshacerse de los objetos a los que hacen referencia. Si algunos listeners pertenecen a todo el shell de la aplicación, manténgalos en un propietario de mayor duración en lugar de eliminarlos durante cada ronda. Agregue un caso de regresión en torno a los flujos de reinicio, pausa y regreso al menú, ya que cada transición puede montar accidentalmente la misma escena dos veces u omitir su limpieza.
Preguntas sobre evitar listeners de eventos de juegos duplicados
¿Por qué presionar una tecla produce múltiples acciones de juego?
La misma acción puede tener varios controladores registrados, o tanto un antepasado como un hijo pueden procesar el evento. Cuente los registros e inspeccione la propagación de eventos en el límite del ciclo de vida de la escena.
¿Puede AbortController eliminar detectores de eventos?
Sí. Agregue listeners relacionados con la misma señal y aborte el grupo cuando termine su propietario. Esto le da al grupo un camino claro de desmantelamiento; no reemplaza decidir qué propietario los controla.
Más información
¿Has visto algo desactualizado? Notificar una corrección