正規の入口
ランチャーが選ぶ起動経路(route)で、runtime選択、環境構築、prefix準備を行ったか。
PASS / launcher onlyCase note 2026-07 Wineランチャー · 初回動画 · GStreamer plugin scan Status: closed
複数のWindowsゲームを扱うWineランチャーでは、「ゲームが動く」ことと 「初回動画がすぐ始まる」ことは別問題になる。約40秒の待ち時間を 描画・再生・初回準備へ分け、ゲーム本体を変更せずランチャーの起動順序で解消した。 個別作品の答えではなく、初回遅延の持ち主を測る手順を持ち帰るためのCase Noteである。
検証対象はKiriKiri 2系のWindows向けノベルゲームだった。ただし、原因を KiriKiri 2全般へ一般化しない。再利用するのは、複数タイトルを扱う互換ランチャーで 初回準備の責務と待ち時間の持ち主を切り分ける方法である。
互換レイヤーでは、ランチャー経由で起動できること、修正DLLが届くこと、通常画面が描けること、 動画が見えること、滑らかなこと、初回が速いことは別の成立条件になる。 ひとつの成功を隣の軸へ転用すると、原因はすぐに混線する。
ランチャーが選ぶ起動経路(route)で、runtime選択、環境構築、prefix準備を行ったか。
PASS / launcher onlysourceやroute名でなく、対象タイトルが実際に読むDLLの実体(loaded byte)を照合する。
PASS / title-local注意書き、タイトル、本編のDirect2D描画が成立するか。
PASS / visible動画が表示され、音と画面転移に異常がないか。
PASS / audio included見た範囲で引っかかりがないか。数値1% lowとは分ける。
PASS / subjective only可視再生が成立した後、初回だけどこで待っているか。
PASS / after ordering fix最終結果だけを見ると、動画の初回準備を前倒しした小さな変更に見える。 しかし、その前に描画と配備の問題を閉じなければ、待ち時間の測定そのものが成立しなかった。
01 — RUNTIME COHERENCE
過去のruntimeでは、動画開始地点で古い描画DLLと新しい呼び出し側の 呼び出し規約(ABI)が食い違い、未初期化の呼び出し先(NULL dispatch)で落ちていた。 movie decodeの未実装ではなく、描画device生成時の世代不整合だった。
この原因は当時のruntimeだけに属する。後の白画面や初回待ちへ持ち越さない。02 — APPLE OPENGL / FL10
Apple OpenGL 4.1が公開しない2つのextensionを、Wine 10は Direct3Dの機能段階であるfeature level 10の必須条件にしていた。 Apple driverにだけ既存fallbackを認めると、小さなprobeはDirect3D 10_1とDirect2D device/contextの生成に成功した。
probe成功は製品受入ではない。正規ランチャー経由で通常画面と動画を別々に確認する。03 — TITLE-LOCAL DEPLOYMENT
修正DLLは対象タイトル専用runtimeへ置き、共有runtimeは元のbyteへ戻した。 build前後にaccepted artifact、managed copy、app bundle内copyの一致を確認し、 保存済みの古いroute指定が上書きできないようにした。
sourceを直した、buildが通った、route名が正しい。それだけでは「届いた」証拠にならない。04 — FIRST-LOAD CRITICAL PATH
正規routeで通常画面、動画、音、画面転移は成立した。それでも新しいランチャーbuildでは最初の動画だけ遅い。 ここで初めて症状を「動画失敗」から「first-load latency」へ切り離した。
大量traceではなく、ゲームを起動しないcomponent harnessで最大区間から測る。GStreamerは、利用できる再生部品(plugin)を検査し、その一覧をregistryへ保存する。 registryが存在していても、更新後のapp実体と整合せず再検証が必要な状態(stale)になり得る。 Release appに同梱した検査器と同じplugin setだけを隔離環境で測った。 Wine、ゲーム、rendererを動かさないので、観測のための重いtraceが症状を変えない。
| 条件 | cold / stale | warm |
|---|---|---|
| 同じapp実体 / 新しい検証環境 | 2.425751s | 0.100729s |
| コピー後の新しいファイル識別(file identity) | 40.829966s | 0.137259s |
| 実利用registryを事前配置 / 新しいRelease path | 42.342594s | 0.108796s |
原因の射程: GStreamer全般でも、codec全般でも、movie graph全般でもない。 対象は、新しいapp実体に対するplugin registryのstale再検証を、旧実装が 最初の動画まで先送りしていた起動順序(ordering)である。
registry検査は必要な処理なので無効化しない。ランチャー起動時に始め、 この準備を必要とするタイトル別の互換設定(profile)だけは、完了を待ってから Wine processを起動(spawn)する。
同じRelease artifact、同じ正規routeで、初回と2回目を含む6つの観測軸を別々に記録した。 最初の動画はすぐ始まり、同一process内の2回目にも目立つ遅延はなかった。 動画の可視再生、音、画面転移、通常画面にも異常は見られなかった。 ゲーム本体、ゲームデータ、動画ファイル、savedataは変更していない。
直接Wine起動はsubsystem probeには使えても、launcher所有の準備を通らない。製品受入へ昇格しない。
source、build成功、route名では不十分。accepted artifactからapp bundleの実体までidentityを繋ぐ。
動画が見えた後に、first-loadを別の問題として測る。成功run内の警告をroot causeへ格上げしない。
失敗をreadyへ昇格せず、古いwaiterが新しいretryを消さないgeneration guardまで検証する。
目視は目視の射程でhard evidenceになる。数値、別runtime、未観測の内部区間へ一般化しない。
本稿は、KiriKiri 2系タイトルでの検証を一事例として扱い、個別作品名、ゲームデータ、 ローカル識別子、非公開runtimeのartifact identityを掲載していません。 原因を特定エンジン全般へ広げず、汎用Wineランチャーで再利用できる 因果境界、初回準備の所有位置、測定結果だけを再構成しています。