Répéter volontairement un cycle de vie
Capturez une ligne de base après le chargement, jouez au même niveau court, revenez au menu et répétez cet itinéraire exact plusieurs fois. Utilisez les outils de mémoire du navigateur pour comparer les instantanés pris au même moment après le nettoyage et le garbage collection lorsque les outils le permettent. Recherchez le nombre croissant d'un type d'objet spécifique, tel que les nœuds de scène, plutôt que de réagir uniquement à la mémoire totale.
Exécutez le test une fois avec les outils de développement fermés et une fois ouvert si la mesure elle-même semble changer de comportement. Le signal utile est de savoir si les mêmes classes et chemins conservés s'accumulent au fil des cycles, et non si un instantané en a un plus grand nombre que celui d'une autre machine.
Prévoir le nettoyage de chaque scène
Lorsqu’une scène se termine, annulez sa frame d’animation en attente, arrêtez les minuteurs, supprimez les écouteurs enregistrés sur des objets qui vivent plus longtemps et videz les collections contenant les entités de la scène. Conservez les références aux callbacks pour pouvoir les supprimer, ou regroupez les écouteurs associés avec un AbortController et annulez le groupe lors du démontage de la scène.
Testez la transition : entrez dans une scène et quittez-la, déclenchez l’ancienne action d’entrée et vérifiez que la scène précédente ne réagit plus. Vérifiez aussi que les ressources mises en cache sont volontairement partagées ou libérées. Un nettoyage indiscriminé peut provoquer des rechargements inutiles, tandis qu’une référence conservée par erreur peut maintenir en mémoire une scène volumineuse.
Questions sur fuite de mémoire de jeu par navigateur
L'augmentation de la mémoire prouve-t-elle une fuite ?
Non. Les navigateurs réservent de la mémoire et collectent les objets selon leur propre calendrier. Une fuite est plus probable si des répétitions de sessions équivalentes conservent progressivement davantage d’instances par l’intermédiaire d’une référence encore détenue par le code.
La suppression d'un écouteur d'événement peut-elle aider au nettoyage ?
Oui, lorsqu’un objet à longue durée de vie conserve un callback qui référence des données de scène. MDN documente removeEventListener() et explique également comment transmettre un AbortSignal pour supprimer ensemble un groupe d’écouteurs.
Pour aller plus loin
Vous avez repéré une information dépassée ? Signaler une correction