1 つのライフサイクルを意図的に繰り返す
ロード後の基準値を記録し、同じ短いレベルをプレイしてメニューに戻る操作を何度か繰り返します。ツールが対応していれば、クリーンアップとガベージコレクションの後、同じタイミングで取得したスナップショットをブラウザーのメモリツールで比較します。合計メモリだけを見るのではなく、シーンノードなど特定の種類のオブジェクト数が増えていないか調べます。
開発者ツールを閉じた状態でテストを 1 回実行し、測定自体の動作が変化するように見える場合は開発者ツールを開いて 1 回テストを実行します。有用な信号は、あるスナップショットの数が別のマシンのスナップショットよりも大きいかどうかではなく、同じクラスと保持されたパスがサイクルにわたって蓄積されているかどうかです。
シーンごとの終了処理を明示する
シーン終了時には、予約済みのアニメーションフレームをキャンセルし、タイマーを止め、より長く存続する対象に登録したリスナーを削除し、シーンのエンティティを保持するコレクションを空にします。削除できるようコールバックへの参照を保持するか、関連するリスナーをAbortControllerでまとめて、シーンの終了時に一括で中止します。
境界をテストします。シーンに入り、終了し、以前の入力操作を発生させても、前のシーンが反応しないことを確認します。キャッシュしたアセットを意図的に共有または解放しているかも確認してください。無差別なクリーンアップは不要な再読み込みを招き、意図せず残った参照は大きなシーンをメモリに保持します。
ブラウザゲームのメモリリークについての質問
メモリの増加はリークの証拠となるでしょうか?
いいえ。ブラウザーはメモリを確保し、独自のタイミングでオブジェクトを回収します。同じライフサイクルを繰り返すたびに、コードが保持している参照を通じてインスタンスが徐々に増える場合、リークの可能性が高まります。
イベント リスナーを削除するとクリーンアップに役立ちますか?
はい。存続期間の長い対象がシーンデータを参照するコールバックを保持している場合に有効です。MDNはremoveEventListener()を説明し、AbortSignalを渡して複数のリスナーをまとめて削除する方法も紹介しています。
関連情報
古い情報を見つけましたか? 訂正を連絡