Skip to content

パイプライン、レンダリング、デスクトップ合成

固定パイプライン

koharu-pipeline は実行時グラフではなく、小さな名前付きワークフローを調整します。

flowchart LR
  detection["検出"] --> ocr["OCR"] --> translation["翻訳"]
  detection --> inpainting["インペイント"]

実行単位は 1 ページの 1 ステージです。ページはプロジェクト順に入りますが、検出完了直後にそのページの後続分岐を実行可能にし、全ページの検出完了を待ちません。

各ステージは意味シーンパッチを作り、アプリが即時コミットして現在キャンバスを同期します。1 回の呼び出しの全リビジョンは 1 つの undo 操作になります。

スケジューリングと常駐

代表的な異種モデル同時実行は計算・メモリ帯域競合でスループットが低下したため、アクセラレーター推論は 1 つの受付レーンを使います。CPU 専用実行はモデル別レーンを持てます。

モデルは遅延ロードされ、再利用のために常駐します。常駐マネージャーは常駐量とピーク作業メモリを観測し、安全余裕を残し、必要なら LRU 順でアイドルモデルを解放します。学習した OOM はクリーンアップ後に 1 回再試行します。

停止は協調的です。新しいステージを開始せず、実行中のネイティブ呼出しは安全に戻り、未コミットなら結果を破棄します。

保持レンダリング

Renderer はシーンスナップショットとページ ID から不変の Frame を作ります。フレームは順序付きレイヤー、Entity 検索、表示情報、依存、診断、ベクターシーンを保持します。

表示文字は翻訳だけです。組版、フィット関係、フォント、画像、表示、不透明度はすべてシーンから得ます。キャンバス、PNG、レイヤークロップ、PSD は同じフレームを利用します。

デスクトップ合成

デスクトップランタイムは 1 つの winit ウィンドウと 1 つの WGPU Surface を所有します。koharu-canvas は保持ページをキャンバステクスチャへ描画します。ウィンドウレス CEF は React のウィンドウ枠、メニュー、操作部、インスペクターをプラットフォーム共有テクスチャへ描画します。cef-rs が同じ WGPU 30 Device へ import し、コピー後の UI テクスチャの透明ピクセルから下のキャンバスが見えます。

CEF の pooled resource は accelerated paint callback の間だけ有効なため、Koharu は callback から戻る前にクロップして所有 GPU テクスチャへコピーします。Presenter は UI とキャンバスのテクスチャを合成し、唯一の Surface Present を行います。上限付きの latest-wins 型 in-process mailbox が無制限な Present backlog を防ぎます。accelerated import が利用できない、または失敗した場合は、ソフトウェア描画で Browser を再作成します。

見た目の変更は最終デスクトップウィンドウで検証してください。ブラウザーだけのスクリーンショットではネイティブキャンバスの存在を証明できず、キャンバス readback だけでは alpha、操作部、最終色合成を証明できません。決定的な Compositor テストには off-screen WGPU readback を使い、最終合成にはネイティブウィンドウのキャプチャを使います。