ホーム⇄ガチャ往復で残存するメモリ累積(~20MB/往復、MEMLEAK-004 候補)と new Image() 中リスク3箇所の置換
Description
INS-922 の対応中に定量的に確認した、立ち絵修正後も残る別のメモリ累積の追跡 issue。
実測(iPhone 16 Pro シミュレータ、ホーム⇄ガチャ20往復・各4秒待ち)
アプリ本体+WebKit系プロセス(WebContent/GPU/Networking)の RSS 合計:
| ビルド | ループ中の増加 | 傾き | 尾行後の WebContent 残留 |
|---|---|---|---|
| INS-922 修正前 (develop e4c3da94) | +534MB | 19.2MB/往復 | 452→810MB(+358MB 戻らず) |
| INS-922 修正後 (PR #863) | +577MB | 23.4MB/往復 | 477→837MB(+360MB 戻らず) |
- 両ビルドで同規模 = 支配的リークは立ち絵(INS-922)とは別要因
- 直近100件の fetch はすべて CDN システム素材(訪問ごとの preload bundle 再ロード)
- 既知調査
audit/findings/memory-leak.mdの MEMLEAK-004(高速画面遷移で Pixi テクスチャが Assets.cache に孤児化) が最有力候補。修正案も同ドキュメントに記載あり - 実機なら十数往復で jetsam 圏内の規模
合わせて対応したい: [P6] baseline の new Image() 中リスク3箇所
lint [P6](raw-resource-lifecycle)の baseline に残した既存9箇所のうち、反復デコードが起きる「中」3箇所(評価詳細は audit/findings/memory-leak.md 2026-07-11 追記):
components/CharacterObtainedOverlay.tsx:261— 光線 mask 計測用に blob URL(原寸 ~1.5MB)を追加デコード。10連 reveal ごとに反復。最優先scenes/Home/useHomeCharacterVoice.ts:169— キャラ切替ごとに立ち絵レイヤー複数枚をデコードscenes/Event.tsx:171— イベント遷移ごとに立ち絵2枚をデコード
いずれも純増リークではない(HTTP キャッシュで再取得はされない)が、preloadCdnImages / lib/dom-image.ts への置換で baseline を減らす。
検証手段(整備済み)
bun ios-sim memは WebKit 系プロセス込み計測に修正済み(アプリ本体だけ見ると WebContent のリークが見えない罠に注意)- 再現プロトコル: 起動→ホーム→30秒アイドル→ホーム⇄ガチャ20往復(loadScene、各4秒待ち)→190秒尾行、傾き MB/往復で判定
Comments (1)
根本原因を特定・修正しました(PR #867)
原因は MEMLEAK-004(孤児化)ではなかった
MEMLEAK-004 の修正(2843d684)は計測時点の develop に既に入っていました。真の原因:
unloadPreloadBundleはテクスチャの実解放(destroy +ImageBitmap.close)を PixiStage の renderer destroy 時に遅延する設計- ホーム・ガチャは両方 DOM オンリー(PixiStage なし)のため、往復してもフラッシュが一度も走らず破棄予約が無限累積
実証
- Chrome 実測: +24,000,000 bytes/往復ちょうど(star_rank1〜6-1000.webp = 1000×1000×4byte×6枚)→ iOS 実測の 19〜23MB/往復 と一致
- 修正前はレンダラ RSS ~60MB/往復で増加し 7往復(~800MB)でレンダラプロセス死。修正後は破棄予約 0 恒常・RSS 飽和
- e2e に回帰アサーション追加(フラッシュ無効化で fail する陰性対照済み)
new Image()中リスク3箇所も置換済み([P6] baseline 10→7件)
実機確認方法
ホーム⇄ガチャを数往復後、Safari Web Inspector コンソールで __pendingTextureStats() が {count: 0} のままであること(修正前は往復×6件で単調増加)。
残課題(このissueのスコープ外として記録)
iOS シミュレータの WebContent RSS は修正後もループ中 10〜21MB/往復揺れますが、①シーン非依存(home⇄members でも発生)②アイドル10分で 823→474MB 自然回収 ③合成 churn テスト(720MB分の fetch+decode+close)は +6MB で完全解放、よりコードレベルのリークの証拠なし。シミュレータはメモリ圧力通知が発火せず遅延回収キャッシュが積もって見える環境要因が濃厚です。実機での長時間検証(Instruments VM Tracker)が必要なら別 issue で。詳細: audit/findings/memory-leak.md 追記 2026-07-11 (2)