プロジェクト

全般

プロフィール

バグ #477

完了

バグ #474: コードベース健全性: メモリリーク・重大バグの一括調査と修正

動画BGA・スキン描画のネイティブリソースリーク解消(Texture/Pixmap)

バグ #477: 動画BGA・スキン描画のネイティブリソースリーク解消(Texture/Pixmap)

エージェント ちゃん さんが7日前に追加. 6日前に更新.

ステータス:
完了
優先度:
通常
担当者:
対象バージョン:
開始日:
2026/06/29
期日:
進捗率:

100%

予定工数:

説明

現象

libgdx の Disposable なネイティブリソース(Texture/Pixmap 等)が解放されず、プレイ/曲切替/動画ループのたびに JVM 外メモリが蓄積する。

対象箇所(重要度順)

  1. FFmpegProcessor(最大の蓄積リーク) src/bms/player/beatoraja/play/bga/FFmpegProcessor.java:172,233,95
    • 動画フレームの pixmap(ネイティブ)が restart()(:233)で null 代入のみ、dispose()(:95)でも showingtex しか解放しない。動画をループ/再生し直すたび Pixmap が 1 枚ずつ漏れる。
  2. SkinTimingVisualizer src/bms/player/beatoraja/skin/SkinTimingVisualizer.java:119
    • BMSModel が変わるたび backtex 用 Texture を再生成するが旧 Texture を dispose しない。曲切替で蓄積。
  3. PomyuCharaLoader src/bms/player/beatoraja/skin/PomyuCharaLoader.java:279-280
    • ダミー透過 Pixmap/Texture が dispose されず確実リーク。共有 transparent が複数 SkinImage に分散し double-dispose / 未解放の両方の温床。
  4. BGAProcessor src/bms/player/beatoraja/play/bga/BGAProcessor.java:101
    • blanktex(1x1 黒)が dispose() で未解放。プレイ回数ぶん蓄積。
  5. MainController src/bms/player/beatoraja/MainController.java:395,402,407,480,585
    • 終了時 dispose()SpriteBatch/systemfont(BitmapFont)/messageRenderer/plainTexture/input が未解放(input はコメントアウト)。
  6. SearchTextField src/bms/player/beatoraja/select/SearchTextField.java:214
    • extends Stage だが super.dispose() をコメントアウト。Stage 内部の SpriteBatch/actor リソースが漏れる。
  7. ShaderManager src/bms/player/beatoraja/ShaderManager.java:25-31
    • dispose 後に static shaders Map を clear しない → dispose 済み ShaderProgram への参照が残り、再取得で解放後参照の危険。
  8. SkinPlayDensityGraph src/bms/player/beatoraja/skin/SkinPlayDensityGraph.java:104-108
    • サイズ変更時 pixmap のみ作り直し texture を再生成せず、旧サイズ Texture に新サイズ Pixmap を draw → 不整合。

修正方針

  • 各生成箇所に対応する dispose() を追加。FFmpeg は restart()/dispose() で旧 pixmap.dispose()。所有関係が曖昧な PomyuChara の transparent/pixmap は所有者を一意化し double-dispose を防ぐ。ShaderManager は dispose 後 shaders.clear()。SkinPlayDensityGraph はサイズ変更時に Texture も再生成。

検証

  • 長時間プレイ(動画 BGA ループの連続プレイ・連続曲切替)で JVM 外メモリが頭打ちになることを確認。
  • ツールでテクスチャメモリ・ネイティブヒープの推移を監視。

他の形式にエクスポート: PDF Atom