プロジェクト

全般

プロフィール

バグ #459

完了

選曲したらゲームがフリーズした

バグ #459: 選曲したらゲームがフリーズした

いづ さん さんが8日前に追加. 7日前に更新.

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

100%

予定工数:

説明

st2 Armageddon -Eclipse- を選曲したらフリーズした


ファイル

beatoraja.log (811 KB) beatoraja.log いづ さん, 2026/06/28 20:23

いづ さん さんが7日前に更新 操作 #1

再起動したら読み込めたので、曲単体の問題ではなさそう。
プレイ時間?タイミング?

エージェント ちゃん さんが7日前に更新 操作 #2

  • ステータス未着手 から 実装中 に変更
  • 進捗率0 から 10 に変更

実装に着手しました。

  • ブランチ: feature/459
  • 対応方針: フリーズは選曲後の音源ロード(AbstractAudioDriver.setModel)が完了せず停止する症状。間欠・再現不可で単一ログからは根本原因を断定できないため、(1) ロード遅延時に全スレッドダンプ+状態をログ出力する監視ウォッチドッグを追加して次回必ず原因を捕捉できるようにしつつ、(2) wav 読み込みを共有 ForkJoinPool から専用バウンデッドプールへ移し、全体タイムアウト+中断を入れて、1件のデコードハングがアプリ全体を巻き込まないよう堅牢化する。

エージェント ちゃん さんが7日前に更新 操作 #3

  • ステータス実装中 から 完了 に変更
  • 進捗率10 から 100 に変更

対応が完了しました。

概要

選曲後にロード画面で無期限フリーズする不具合への対応。原因は AbstractAudioDriver.setModel が wav 読み込みを共有 ForkJoinPool.commonPool 上の parallelStream で実行しており、1件のデコードが詰まると全体が無期限ハングする(タイムアウト・中断・診断手段なし)点。間欠・再現不可で単一ログでは根本原因を断定できないため、診断強化とハードニングの両面で対応した。

変更点

  • 診断: ThreadDumpFormatter(全スレッドのスタック整形出力)と MediaLoadWatchdog(ロードが閾値超で継続中ならスレッドダンプ+状態を定期ログ出力、既定しきい値15s/間隔10s/最大5回・システムプロパティで調整可)を追加し、BMSResource に配線。次回フリーズ時に原因を確実に捕捉できるようにした。
  • ハードニング: BoundedParallelExecutor で wav 読み込みを専用デーモンプール+全体タイムアウト+中断対応に変更。setModel はバッファのローカル参照確保で遅延書き込み汚染を防止、タイムアウト時はログを残しロード終了で無期限ハングを回避、abort() で実行中ロードを中断。正常中断は fine・真のタイムアウトのみ SEVERE。
  • Config/AudioConfig スキーマ変更なし(設定移行不要)。
  • 変更ファイル: audio/AbstractAudioDriver.java, BMSResource.java, runtime/ThreadDumpFormatter.java, runtime/MediaLoadWatchdog.java, runtime/BoundedParallelExecutor.java +テスト4件 の計9件。

テスト

  • .\gradlew.bat test : 成功(BUILD SUCCESSFUL)。新規9テスト全合格(failures=0 errors=0)。

関連 MR

  • !135 (feature/459 → develop)

残課題 / 補足

  • 本修正はハングの根本原因を断定するものではなく、再発時にスレッドダンプ付きログで原因を確定でき、かつ1件のデコード詰まりがアプリ全体を巻き込まないようにする対策。再発した場合は media load still in progress: ... 以降のログを共有いただければ原因特定が可能。

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