Orrery
Windows向けビジュアルノベルとMacの距離を縮める、互換・管理基盤の開発プロジェクト。
背景
多くのビジュアルノベルはWindows向けで、Macではそのまま扱えない。描画、動画、音声、起動手順はタイトルごとに異なり、同じengine名でも必要な互換経路を決められない。OrrerymacOSランチャーのKASANEと、Windowsゲーム互換レイヤーのSwingbyを組み合わせた互換・管理基盤。は実行ファイルと実行時の挙動から、どの層を扱うべきかを切り分ける。
全体像
役割分担
OrrerymacOSランチャーのKASANEと、Windowsゲーム互換レイヤーのSwingbyを組み合わせた互換・管理基盤。はKASANEKASANE(カサネ)は、Windows向けノベルゲームをMacで遊ぶためのランチャー。ユーザーが触るmacOS側として、ゲームの登録、インストール、起動、prefix管理、タイトル別互換設定を担当する。開発中の内部名Melammuは、公開リポジトリ名melammu-vnに残る。とSwingbyOrreryでWindowsゲームを動かす互換レイヤー。Swingby WineとSwingby DXVKから構成される。を組み合わせて構成する。KASANEKASANE(カサネ)は、Windows向けノベルゲームをMacで遊ぶためのランチャー。ユーザーが触るmacOS側として、ゲームの登録、インストール、起動、prefix管理、タイトル別互換設定を担当する。開発中の内部名Melammuは、公開リポジトリ名melammu-vnに残る。(カサネ)はWindows向けノベルゲームをMacで遊ぶためのランチャーで、インストール、起動、prefix管理、ライブラリUIなどのmacOS側を担う。Windowsゲーム互換レイヤーのSwingbyOrreryでWindowsゲームを動かす互換レイヤー。Swingby WineとSwingby DXVKから構成される。は、Windows API、描画、動画、音声などを担うSwingby WineVN向けに調整しているWine fork。リポジトリ名はswingby-wine。Windows APIや描画・動画・音声まわりの互換修正を含む。(リポジトリ名swingby-wine)と、DXVKDirectXのAPI呼び出しをVulkanに変換するオープンソースのライブラリ。Wine上でDirectXゲームを動かす際に使われる。経由の描画を担うSwingby DXVKDXVKをOrreryの検証に合わせて調整する派生実装。macOS・Apple Silicon上で確認した描画問題に必要な互換修正を加え、実機で検証する。リポジトリ名はswingby-dxvk。(リポジトリ名swingby-dxvk)から構成される。共有runtimeには汎用修正を優先し、避けられないタイトル差分はprofile、prefix、DLL override、runtime overlay共有Wine全体を差し替えず、特定タイトルだけに必要なDLLセットを別runtimeとして重ねる運用。title-local patchの一種。へ隔離する。
公開ソースの範囲
GitHubでは、KASANEKASANE(カサネ)は、Windows向けノベルゲームをMacで遊ぶためのランチャー。ユーザーが触るmacOS側として、ゲームの登録、インストール、起動、prefix管理、タイトル別互換設定を担当する。開発中の内部名Melammuは、公開リポジトリ名melammu-vnに残る。のライブラリ画面と、ゲームの実行ファイルから使用エンジンの手がかりを調べる機能を公開しています。これはOrrerymacOSランチャーのKASANEと、Windowsゲーム互換レイヤーのSwingbyを組み合わせた互換・管理基盤。の仕組みの一部を閲覧・検証できるようにしたもので、製品版そのものではありません。ゲームを動かす互換レイヤー、インストールやアカウント連携、タイトル固有の設定・修正、配布用アプリは含まれません。
検証の方針
「ビルドできた」だけでは、修正がゲームの実行に使われたとは判断しません。実際に読み込まれたファイルと設定を確認し、対象の場面を実機で再生・操作できたところまでを記録します。解決しなかった問題や確認できていない範囲も残し、次の調査で同じ推測を繰り返さないようにしています。
特徴
- 01
KASANEKASANE(カサネ)は、Windows向けノベルゲームをMacで遊ぶためのランチャー。ユーザーが触るmacOS側として、ゲームの登録、インストール、起動、prefix管理、タイトル別互換設定を担当する。開発中の内部名Melammuは、公開リポジトリ名melammu-vnに残る。とSwingbyOrreryでWindowsゲームを動かす互換レイヤー。Swingby WineとSwingby DXVKから構成される。を組み合わせ、ランチャー開発と低レイヤー互換検証を分断しない
- 02
タイトル固有の差分をprofile、prefix、DLL override、runtime overlay共有Wine全体を差し替えず、特定タイトルだけに必要なDLLセットを別runtimeとして重ねる運用。title-local patchの一種。へ隔離し、共有runtimeの回帰面を狭める
- 03
engine名だけで決めず、実バイナリ・実ロードDLL・実行時の経路から互換条件を切り分ける
- 04
実ロードDLL、prefix override、title-local patch、md5 gateビルド済みバイナリのmd5を期待値と照合し、修正済みDLLやランタイムがリビルドで巻き戻っていないか確認する仕組み。で、リビルドによる互換修正の巻き戻りを防ぐ
- 05
解決済みの現象だけでなく、未解決の回帰もCase Notes と次の測定条件に落として保留する
用語
- Wine
- WindowsをインストールせずにmacOS・Linux上でWindowsアプリを動かすオープンソースの互換レイヤー。Windows APIの呼び出しをPOSIX / macOS APIに変換する。
- POSIX
- UnixベースのOS(macOS・Linuxなど)が共通して持つAPIの仕様。WineはWindowsのAPI呼び出しをこの仕様に変換することでWindowsアプリをmacOS上で動かす。
- Orrery
- macOSランチャーのKASANEと、Windowsゲーム互換レイヤーのSwingbyを組み合わせた互換・管理基盤。
- KASANE
- KASANE(カサネ)は、Windows向けノベルゲームをMacで遊ぶためのランチャー。ユーザーが触るmacOS側として、ゲームの登録、インストール、起動、prefix管理、タイトル別互換設定を担当する。開発中の内部名Melammuは、公開リポジトリ名melammu-vnに残る。
- Swingby
- OrreryでWindowsゲームを動かす互換レイヤー。Swingby WineとSwingby DXVKから構成される。
- Swingby Wine
- VN向けに調整しているWine fork。リポジトリ名はswingby-wine。Windows APIや描画・動画・音声まわりの互換修正を含む。
- Swingby DXVK
- DXVKをOrreryの検証に合わせて調整する派生実装。macOS・Apple Silicon上で確認した描画問題に必要な互換修正を加え、実機で検証する。リポジトリ名はswingby-dxvk。
- Boot Camp
- AppleがIntel Mac向けに提供していた、MacにWindowsを直接インストールして切り替える機能。Apple Silicon(M1以降)では廃止された。
- Apple Silicon
- AppleがMac向けに設計したARMベースのチップ(M1/M2/M3/M4系)。従来のIntelチップとはCPU命令セットが異なり、Windowsアプリをそのまま実行できない。
- Rosetta 2
- Apple SiliconのMacでIntel向けアプリを変換して動かすApple純正の技術。Windowsアプリには対応しない。
- DirectX
- MicrosoftのWindows向けグラフィックスAPI。多くのゲームがDirectXで描画処理を行うため、Mac上で動かすには変換が必要になる。
- DirectDraw
- Windowsの古い2D描画API。2000年代前後のゲームやVNで使われることがあり、Wine上ではDirect3DやGDIとは別の描画経路として問題を切り分ける必要がある。
- wined3d
- Wineに含まれるDirect3D実装。Direct3DやDirectDrawの描画をOpenGLなどのホスト側描画へ変換する経路で、DXVKとは別の層。
- DXVK
- DirectXのAPI呼び出しをVulkanに変換するオープンソースのライブラリ。Wine上でDirectXゲームを動かす際に使われる。
- Vulkan
- クロスプラットフォームのグラフィックスAPI。DXVK経由で受け取ったDirectX命令を、MoltenVKを介してMetalへ渡す中継役。
- MoltenVK
- VulkanのAPI呼び出しをAppleのMetalに変換するライブラリ。macOSでVulkanを動かすために使われる。
- Metal
- AppleのGPU向けAPI。macOSでは最終的にMetalを通じて描画処理が実行される。
- DirectShow
- Windowsの古い動画再生フレームワーク。VNのOPやロゴ動画で使われることがあり、Wine上ではquartzやwinegstreamerを経由する。
- GStreamer
- 動画・音声のデコードや変換を担うマルチメディア基盤。Wineではwinegstreamerを通じてDirectShowやMedia Foundationの処理に関わる。
- md5 gate
- ビルド済みバイナリのmd5を期待値と照合し、修正済みDLLやランタイムがリビルドで巻き戻っていないか確認する仕組み。
- runtime overlay
- 共有Wine全体を差し替えず、特定タイトルだけに必要なDLLセットを別runtimeとして重ねる運用。title-local patchの一種。
- GDI
- Windowsが古くから持つ標準の描画API。DirectXより古い仕組みで、2000〜2010年代のゲームエンジンに多く使われていた。Wine上ではDirectXとは別の経路で処理される。
Case Notes
まず全体像
起動・検証
- Electronランチャーが起動直後に落ちるElectron製のWindows向けゲーム配信ランチャーで、起動直後のAPI不足、黒い画面、認証の戻り道、子ゲームのruntimeを分け、成立済みと未証明を切り分けた記録
- imagehlpのPE署名検証が通らない仮想マシン上のWindowsでは通る署名がWineでは通らない原因を、DigestLevelフラグの意味とPE digestの計算範囲まで追って修正した記録
- Wineを更新すると旧作が起動しないfile-backed領域へmmap時からPROT_EXECを付けると失敗する条件を切り分け、mprotectによる後付けで起動を復旧した記録
描画・保存
- DXVKでD3D9の画面が黒い未bindのbinding 16が頂点フェッチを破壊する条件を、DrawPrimitiveUPの入力まで追って修正した記録
- CatSystem2で動画OFFにするとメニューが消えるCatSystem2で動画ON/OFFだけを比較し、メニュー描画と最終表示を切り分け、採用運用と未実装の根本修正を分けた記録
- CMVSのセーブ画像が黒いCMVSでPresent後に失われるフレームをGetBackBuffer + LockRectへ供給し、セーブサムネイルの黒化を復旧した記録
- DXVKでD3D11のセーブ画像が黒いGetBuffer(index > 0)が拒否される原因をDXVKのGetImageまで追い、保持中のback bufferを返して解消した記録
動画再生
- Artemisで動画だけが白いまま映らないArtemis EngineのDirectDraw前面描画ビューがMetal表示の背後に隠れる原因を切り分け、動画フレームを表示した記録
- winegstreamerで動画の音だけ途切れる8 MBまで埋まった映像キューがdemuxerと音声供給を止める条件を切り分け、64 MBへの拡張で約1秒の無音を解消した記録
- msyncが無いと動画開始が5秒遅れる動画の直前だけ画面が数秒白く止まる原因を、詳細ログの歪みを見破りながらスレッド同期の欠如まで突き止めて修正した記録
- KASANE更新後の初回動画に42秒かかるKiriKiri 2系タイトルの検証で、GStreamerのplugin registry再検証に42秒かかる条件を測り、初回準備をゲーム起動前へ移して動画の待ち時間を解消した記録
- デコード済みなのに動画が黒い映像データが作られた地点から先をたどり、表示側へ渡す二つの説明情報が欠けていたと特定・修正した記録