Registre-se em um limite deliberado do ciclo de vida
Evite anexar um manipulador de keydown de janela de uma função de renderização ou de cada quadro. Coloque a configuração específica da cena em uma função de inicialização ou montagem e certifique-se de que a função não possa ser executada duas vezes sem limpeza. Mantenha uma referência ao retorno de chamada ao usar removeEventListener; retornos de chamada anônimos criados repetidamente são difíceis de corresponder posteriormente. Como alternativa, forneça um AbortController a um grupo de manipuladores relacionados e passe seu sinal nas opções do ouvinte e, em seguida, aborte esse grupo quando a cena terminar.
Escolha os alvos do evento com cuidado. Um ouvinte de janela global pode ser apropriado para teclas enquanto um jogo está ativo, mas o manipulador de cliques de um botão pertence a esse botão. Não registre um manipulador de delegação pai e um manipulador direto para a mesma ação, a menos que a propagação de eventos faça parte intencionalmente do design.
Teste a entrada repetida de cenas como uma verificação de sintomas
Abra uma cena, pressione sua ação uma vez, saia e abra-a novamente. Uma entrada ainda deve causar um efeito. Repita o ciclo cinco vezes e verifique se a contagem de respostas permanece uma por pressionamento; esta é uma verificação funcional, não uma medição de memória. Confirme também se a entrada da cena antiga não muda mais sua pontuação ou estado após a saída. O MDN documenta o suporte do AbortSignal para agrupar ouvintes e observa que funções anônimas precisam de referências retidas para remoção explícita.
Mantenha a desmontagem alinhada com a propriedade
Quando uma cena é substituída, aborte ou remova seus ouvintes antes de descartar os objetos aos quais eles fazem referência. Se alguns ouvintes pertencerem a todo o shell do aplicativo, mantenha-os em um proprietário de vida mais longa, em vez de removê-los a cada rodada. Adicione um caso de regressão em torno dos fluxos de reinicialização, pausa e retorno ao menu, pois cada transição pode acidentalmente montar a mesma cena duas vezes ou pular sua limpeza.
Perguntas sobre evitar ouvintes duplicados de eventos de jogo
Por que pressionar uma tecla produz múltiplas ações de jogo?
A mesma ação pode ter vários manipuladores registrados, ou tanto um ancestral quanto um filho podem processar o evento. Conte registros e inspecione a propagação de eventos no limite do ciclo de vida da cena.
O AbortController pode remover ouvintes de eventos?
Sim. Adicione ouvintes relacionados com o mesmo sinal e aborte o grupo quando seu proprietário terminar. Isso dá ao grupo um caminho de desmontagem claro; isso não substitui a decisão de qual proprietário os controla.
Leitura complementar
Viu alguma informação desatualizada? Informar uma correção