プロジェクト

全般

プロフィール

機能 #355

完了

機能 #343: [Phase 3] クロック/並行モデルと最小プレイアブル

クロック+スレッド分離アーキ

機能 #355: クロック+スレッド分離アーキ

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

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

100%

予定工数:

説明

目的

マスタークロック=オーディオサンプル位置を唯一源とし、スレッドを厳密分離。

スコープ

  • 音声コールバック(RT・無確保)/ 更新(オーディオクロック駆動の固定ステップで判定)/ 描画 / 資産ロード(rayon)の分離
  • フレーム落ちが判定に波及しない構造

検証

クロック導出/固定ステップロジックはコンテナでテスト、スレッド配線はホスト検証

担当

Codex 委譲(source-only)

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

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

実装に着手しました。

  • ブランチ: feature/355-clock-thread-arch
  • 対応方針: オーディオサンプル位置を唯一の時刻源とする MasterClock と、オーディオクロックに錨を打つ FixedTimestep(フレーム落ちが判定へ波及しない固定ステップ駆動)を整備し、音声RT / 更新 / 描画 / rayon 資産ロードの4スレッド分離スキャフォールドを ferrhythm bin(lib ターゲット追加)に実装する。クロック導出・固定ステップは非依存ロジックとしてコンテナ TDD、スレッド配線はホスト検証。

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

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

対応が完了しました。

概要

オーディオデバイスのサンプル位置を唯一の時刻源とし、スレッドを厳密分離するアーキの土台(スキャフォールド)を構築。フレーム落ちが判定へ波及しない構造を実装し、最小プレイアブル(#356)の前提を整えた。確定済みクレート集合を維持するため、新クレートは作らず bin ferrhythm に lib ターゲットを追加して実装。

変更点

  • MasterClock: 音声 CommandProducercore::SampleClock に適合させ唯一の時刻源として公開。プリロール用 origin オフセット(負のソング時刻を表現)。
  • FixedTimestep: オーディオサンプル位置に錨を打つ固定ステップ。ステップ境界はサンプル位置から導出されるため描画フレーム落ちに依らず処理境界集合が不変=判定非伝携。過大遅延時は古いステップを dropped として捨て cursor をオーディオへ再同期。
  • AssetLoader / par_load_map: rayon による順序保持の並列デコード土台。
  • Runtime: OutputBackend trait seam に対する更新/描画スレッド分離スキャフォールド。stop 冪等・Drop で停止。
  • 変更ファイル: crates/ferrhythm/src/{lib,error,clock,fixed_step,loader,runtime,main}.rscrates/ferrhythm/Cargo.toml(lib ターゲット+deps 追加)/Cargo.lock

テスト

  • cargo test : 成功(ferrhythm 18件+ワークスペース全緑)。分割 pump 決定性(フレーム落ち非伝携の証明)・cap 到達(dropped 観測)・origin 符号/飽和・rayon 順序保持・モックバックエンドのライフサイクルスモークを含む。
  • cargo clippy --all-targets -- -D warnings / cargo fmt --all -- --check : 成功
  • cargo check --target x86_64-pc-windows-gnu : 成功(bin→audio の wasapi 経路の型検査)
  • 要ホスト検証: 実 WASAPI/ASIO バックエンド経由で Runtime が音声RT/更新/描画スレッドを起動・停止・join すること(コンテナ不可)。

関連 MR

  • !17 (feature/355-clock-thread-arch → develop) マージ済み

補足

  • CI で test ジョブがディスク枯渇で system failure したが、原因は本コードではなくランナーの孤児 Docker ボリューム肥大(ブランチ別キャッシュ堆積)。恒久対処は #374 として分離起票済み。

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