Orrery
Windows向けビジュアルノベルとMacの距離を縮める、互換・管理基盤の開発プロジェクト。
背景
多くのビジュアルノベルはWindows向けで、Macではそのまま扱えない。描画、動画、音声、起動手順はタイトルごとに異なり、同じengine名でも必要な互換経路を決められない。OrreryMelammuとswingby-wineをまとめる互換レイヤー開発基盤。ランチャー、Wine fork、検証、再現性ゲートを同じ現在地で扱う。は実行ファイルと実行時の挙動から、どの層を扱うべきかを切り分ける。
全体像
役割分担
Melammuユーザーが触るmacOSランチャー。ゲームの登録、インストール、起動、prefix管理、タイトル別互換設定を担当する。はインストール、起動、prefix管理、ライブラリUIなどのmacOS側を担う。swingby-wineVN向けに調整しているWine fork。Windows APIや描画・動画・音声まわりの互換修正を含む。はWindows API、描画、動画、音声などの互換層を、swingby-dxvkはDXVKDirectXのAPI呼び出しをVulkanに変換するオープンソースのライブラリ。Wine上でDirectXゲームを動かす際に使われる。経由の描画(MoltenVKVulkanのAPI呼び出しをAppleのMetalに変換するライブラリ。macOSでVulkanを動かすために使われる。/Apple SiliconAppleがMac向けに設計したARMベースのチップ(M1/M2/M3/M4系)。従来のIntelチップとはCPU命令セットが異なり、Windowsアプリをそのまま実行できない。向け)を担う。共有runtimeには汎用修正を優先し、避けられないタイトル差分はprofile、prefix、DLL override、runtime overlay共有Wine全体を差し替えず、特定タイトルだけに必要なDLLセットを別runtimeとして重ねる運用。title-local patchの一種。へ隔離する。
公開ソースの範囲
GitHubのmelammu-vnで公開しているのは、folder index UIと汎用的なengine-signature inspectionを切り出したsource-only mirrorです。OrreryMelammuとswingby-wineをまとめる互換レイヤー開発基盤。ランチャー、Wine fork、検証、再現性ゲートを同じ現在地で扱う。本体の互換runtime、installer・account連携、個別タイトル向けprofile・patch、配布binaryは含まず、特定タイトルの動作を保証しません。
検証の方針
互換性の判断は、記憶やengine名ではなく、実バイナリのfingerprint、実行時にロードされたDLL、prefixのoverride、artifact gateで確認する。sourceを変更しビルドが通っただけでは反映済みとせず、実際にロードされるruntimeを照合する。解決済みだけでなく未解決の条件もevidenceとCase Notesへ残し、次の検証で再利用する。
特徴
- 01
Melammuユーザーが触るmacOSランチャー。ゲームの登録、インストール、起動、prefix管理、タイトル別互換設定を担当する。とswingby-wineVN向けに調整しているWine fork。Windows APIや描画・動画・音声まわりの互換修正を含む。を同じ作業基盤で扱い、ランチャー開発と低レイヤー互換検証を分断しない
- 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
- Melammuとswingby-wineをまとめる互換レイヤー開発基盤。ランチャー、Wine fork、検証、再現性ゲートを同じ現在地で扱う。
- Melammu
- ユーザーが触るmacOSランチャー。ゲームの登録、インストール、起動、prefix管理、タイトル別互換設定を担当する。
- swingby-wine
- VN向けに調整しているWine fork。Windows APIや描画・動画・音声まわりの互換修正を含む。
- 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
- なぜMacでWindowsゲームは動かないのかApple Silicon 以降、Windowsゲームを Mac で動かすのがなぜ難しいのか。翻訳が一段ずつ積み上がる構造を地図にした、Case Notes の入口
- Electron製Windowsランチャーの「動く」を6つに分けるElectron製のWindows向けゲーム配信ランチャーで、起動直後のAPI不足、黒い画面、認証の戻り道、子ゲームのruntimeを分け、成立済みと未証明を切り分けた記録
- Wineランチャー:初回動画を40秒待たせないWindowsゲームを扱うWineランチャーで、初回動画だけ約40秒遅れる原因を分け、ゲーム本体を変更せず起動順序で解消した記録
- Wine更新後、一部の旧作が起動しないWine更新後に一部の旧作が起動しなくなった現象を、file-backed mmapのEXEC付与順序まで切り分けた記録
- CatSystem2:動画OFFで設定メニューが白くなるCatSystem2で動画再生経路のON/OFF差分を比較し、ゲーム本体を変更せず採用運用と残課題を分けた記録
- DXVK:未bindの頂点ストリームで画面が黒くなるDXVKの固定機能シェーダでbinding 16が未bindになる条件を、DrawPrimitiveUPの入力まで追って修正した記録
- Artemis Engine:動画だけが白くなるDirectDrawの前面描画ビューがMetal表示の背後に隠れる原因を切り分け、Metal上へ表示した記録
- winegstreamer:高ビットレート動画で音声だけが途切れる映像が継続する一方で音声だけ約1秒途切れる現象を、winegstreamerのmultiqueue上限とA/Vインターリーブまで切り分けた記録
- CMVS:セーブサムネイルが黒くなるCMVSのGetBackBuffer + LockRectが読むフレームを、D3D9 / wined3dのPresent境界まで遡って復旧した記録
- D3D11/DXVK:セーブサムネイルが黒くなるGetBuffer(index > 0)が拒否される原因をDXVKのGetImageまで追い、保持中のback bufferを返して解消した記録