操作
バグ #477
完了バグ #474: コードベース健全性: メモリリーク・重大バグの一括調査と修正
動画BGA・スキン描画のネイティブリソースリーク解消(Texture/Pixmap)
バグ #477:
動画BGA・スキン描画のネイティブリソースリーク解消(Texture/Pixmap)
説明
現象¶
libgdx の Disposable なネイティブリソース(Texture/Pixmap 等)が解放されず、プレイ/曲切替/動画ループのたびに JVM 外メモリが蓄積する。
対象箇所(重要度順)¶
-
FFmpegProcessor(最大の蓄積リーク)
src/bms/player/beatoraja/play/bga/FFmpegProcessor.java:172,233,95- 動画フレームの
pixmap(ネイティブ)がrestart()(:233)でnull代入のみ、dispose()(:95)でもshowingtexしか解放しない。動画をループ/再生し直すたび Pixmap が 1 枚ずつ漏れる。
- 動画フレームの
-
SkinTimingVisualizer
src/bms/player/beatoraja/skin/SkinTimingVisualizer.java:119- BMSModel が変わるたび
backtex用 Texture を再生成するが旧 Texture を dispose しない。曲切替で蓄積。
- BMSModel が変わるたび
-
PomyuCharaLoader
src/bms/player/beatoraja/skin/PomyuCharaLoader.java:279-280- ダミー透過
Pixmap/Textureが dispose されず確実リーク。共有transparentが複数 SkinImage に分散し double-dispose / 未解放の両方の温床。
- ダミー透過
-
BGAProcessor
src/bms/player/beatoraja/play/bga/BGAProcessor.java:101-
blanktex(1x1 黒)がdispose()で未解放。プレイ回数ぶん蓄積。
-
-
MainController
src/bms/player/beatoraja/MainController.java:395,402,407,480,585- 終了時
dispose()でSpriteBatch/systemfont(BitmapFont)/messageRenderer/plainTexture/inputが未解放(input はコメントアウト)。
- 終了時
-
SearchTextField
src/bms/player/beatoraja/select/SearchTextField.java:214-
extends Stageだがsuper.dispose()をコメントアウト。Stage 内部の SpriteBatch/actor リソースが漏れる。
-
-
ShaderManager
src/bms/player/beatoraja/ShaderManager.java:25-31- dispose 後に static
shadersMap を clear しない → dispose 済み ShaderProgram への参照が残り、再取得で解放後参照の危険。
- dispose 後に static
-
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 外メモリが頭打ちになることを確認。
- ツールでテクスチャメモリ・ネイティブヒープの推移を監視。
操作