ゲームラグ白書 › L1 クライアントのゲームプロセス
クライアントのメモリリーク Client memory leak
原因ID cg-leak · 主担当 ゲーム開発チーム・クライアント開発
図と実験のあるメインページでこのカードを開く →
長く起動しておくほどメモリが増えてだんだん重くなり、最後にはゲームが強制終了します。
なぜ エリアを行き来するたびに、テクスチャ・UI・エフェクトが解放されずに残る → すると GCが頻繁になり、OSのメモリが足りなくなってスワップが発生 → 画面では 数時間プレイした後、だんだんカクつくようになり、強制終了(プレイヤーには切断のように見える)
- 症状
- カクつき, 切断
- 要因
- ストール
- 誰に起きるか
- 自分だけ
- いつ
- 長時間稼働するほど
- 担当
- 主担当 ゲーム開発チーム・クライアント開発
- ゲーム開発チームの対応
- エリア切り替え時にメモリ使用量を計測、解放されないテクスチャ・UI・エフェクトを見つけて修正、長時間の自動テスト(ソークテスト)。
- グラフでは
- 徐々に上昇 · ゲームプロセスのメモリ
- 確認箇所
- パフォーマンスモニターでProcess(ゲーム)\Private Bytesを数時間記録。モバイルはAndroidのApplicationExitInfoの終了理由(REASON_LOW_MEMORY)とiOSのjetsamレポート
- 該当する場合
- エリアを行き来するたびにメモリが上がって下がらず、起動したままの時間が長いほどカクつき・強制終了が増える
- 該当しない場合
- メモリは一定なのに、長く起動しておくほど震えるだけなら「float型で持つ時刻の精度低下」
- 確認手段
- ユーザー側の環境で確認
- もっと詳しく
- スマホは主にメモリを圧縮してしのぎます。それでもメモリが足りなくなると、OSがゲームをすぐに終了させます(落ちる)。RAMが少ない端末ほど先に終了させられます。
出典
- Memory allocation among processes Android (Google)
AndroidはメモリをzRAMに圧縮してしのぎ、足りなくなると低メモリキラーがプロセスを終了させる。フォアグラウンドのアプリが終了するとクラッシュのように見える - Identifying high-memory use with jetsam event reports Apple
iOSはメモリ逼迫が解消しないとアプリを強制終了(jetsam)し、アプリごとのメモリ上限を超えると終了の対象になる - Find user-mode memory leaks with Performance Monitor (PerfMon) Microsoft
Process > Private Bytes(プロセスが割り当てた専用メモリ)・Virtual Bytesを長時間記録し、増える一方ならリーク - ApplicationExitInfo Android (Google)
REASON_LOW_MEMORY:システムの低メモリキラーがアプリのプロセスを終了させた(非対応の端末ではREASON_SIGNALED・SIGKILLとして報告)
あわせて読みたい原因
同じ層:L1 クライアントのゲームプロセス
同じ症状(カクつき)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る