テクノロジー

iPad miniでWindows版ゲームが60fpsで動いた。それでも「遊べる」と言えない理由――Androidとの決定的な差

管理者より

Macである程度動いたので、iOSでも試してみたいと思った。Androidゲーム機でSteamを動かす話はあるけど、iOSではできないのだろうかと考えたのがきっかけだ。

iPad mini上で表示された都市伝説解体センターのタイトル画面。左上にFPS表示59.9、NEW GAMEとOPTIONのメニューがある

iPad mini(第6世代)の画面。左上の数字は毎秒のフレーム数で、59.9 を示している(画面:©Hakababunko / SHUEISHA, SHUEISHA GAMES)

本記事で使用している『都市伝説解体センター』の画面について タイトル:都市伝説解体センター / 公式サイト:https://umdc.shueisha-games.com/ / 開発:墓場文庫 販売:集英社ゲームズ / ©Hakababunko / SHUEISHA, SHUEISHA GAMES

iPad mini の画面に、Windows 版『都市伝説解体センター』のタイトル画面が映っている。左上のフレームレート表示は 59.9。NEW GAME を選ぶと、プロローグが始まり、会話が進む。

Mac から映像を飛ばしているのではない。iPad の中で、PC 用の Windows 版実行ファイル(exe)そのものが動いている。 Intel や AMD の CPU 向けに書かれた命令を、iPad の CPU 向けにその場で翻訳しながらだ。

ただし、写真の外に種明かしがある。この iPad には USB ケーブルで Mac がつながっていて、Mac 上のデバッガが「このメモリは実行してよい」という許可を出し続けている。この接続が切れると、ゲームは新しく翻訳したコードを実行できなくなり、止まってしまう。

Android のスマートフォンでは、Windows 版ゲームを動かすアプリがすでに当たり前に使われている。同じ ARM のチップを積んだ iPad で、なぜここまでの仕掛けが要るのか。本稿は、筆者が11日間にわたって進めた iPad での検証と、Android との差の整理である。

先に範囲を書いておく。 確認できたのは、2作品でタイトル画面以降まで進んだところまで。長時間のプレイ、発熱、バッテリー消費は測っていない。そして、この方法は一般の利用者が使える形では配布できない。

iPad上の構成図。Windows版ゲームのx86-64コードをFEXが翻訳し、ARM64向けにビルドしたWineがWindowsのAPIを再現、DXVKとMoltenVKでMetalに描画する。USBでつないだMacのデバッガが、生成コードを実行可能として登録し続ける

図:iPad の中で何が動いているか。すべてが1つのアプリ、1つのプロセスの中にある。

この記事の新しさ――iOS で Windows を動かす試みは初めてではない

iOS で Windows のプログラムを動かす試み自体は、これまでもあった。

  • UTM:PC 全体をエミュレートするアプリ。App Store 版(UTM SE)は実行時のコード生成(JIT)を使わない代わりに遅い。JIT を使う版は、公式ストア外からの導入と、JIT を有効にする外部ツールが必要になる
  • Madeira:2026年3月に公開された研究プロジェクト。iPhone 上で Wine と x86 翻訳器の FEX を1つのプロセスにまとめて動かし、『Thumper』と『ULTRAKILL』が遊べる水準としている。JIT のためにデバッガの接続が必要で、App Store では配布できないと明記している

本稿の検証も、最終的には Madeira と同じ系統の構成(Wine + FEX を1プロセスで動かす)に行き着いた。独自に進めたものだが、「iOS ではこの形になる」という収束は興味深い。本稿が付け加えるのは次の点だ。

  1. iPad mini(A15)で、日本の作品を含む Windows 版ゲームが実際の画面まで動いた実測と、そこに至るまでに試して捨てた3つの方式の比較
  2. メモリ上限や起動時間など、iPad 特有の壁を数字で示したこと
  3. Android との差を、「OS が何を許すか」という観点で整理したこと

Android では、もう当たり前になっている

Android で Windows 版ゲームを動かす代表的なアプリが Winlator だ。Windows 互換層の Wine と、x86-64 の命令を ARM64 に翻訳する Box64 を組み合わせる。2025年9月に「Final」と銘打った 11.0 を出した後も更新は続き、2026年8月の 11.2 では Box64 と GPU ドライバの新版を同梱した。ゲーム周辺機器メーカー GameSir の GameHub は、2025年11月に Google Play でも配信を始めている。

これらが成り立つのは、Android が次のことを許しているからだ。

  • アプリ自身が、実行時に生成したコードをメモリ上で実行できる(JIT)
  • アプリが子プロセスを起動できる
  • 利用者が APK ファイルを直接インストールできる(サイドロード)
  • GPU の API として Vulkan が標準で使え、Qualcomm の Adreno 向けにはオープンソースのドライバ Turnip へ差し替えることもできる

Android にも制約はある。Android 10 以降、アプリが自分のフォルダ内の実行ファイルを直接起動することが制限された。Winlator は古い API 水準を対象にすることでこれを避けており、その分、新しい水準を求める Google Play での配信には向かない。それでも、利用者が APK を入れさえすれば上の条件がそろう。

iOS と Android、何が違うのか

観点AndroidiOS / iPadOS
実行時のコード生成(JIT)アプリ自身が使える。x86 翻訳器が高速に動く他社アプリには原則不可。デバッガ接続時の抜け道のみで、iOS 26 ではその方法も制限が強まった
子プロセスの起動可能(Wine の補助プロセスも動く)不可。Apple も開発者フォーラムで「iOS アプリは子プロセスを起動できない」と明言している
アプリの配布APK を直接インストールできるApp Store 経由が基本。規約 2.5.2 で、機能を追加・変更するコードのダウンロードや実行を禁止
GPU の APIVulkan を標準搭載。ドライバの差し替えも可能Metal のみ。Vulkan は MoltenVK などで変換する
x86 翻訳Box64、FEX などをアプリに同梱Mac の Rosetta 2 に当たる仕組みは無い。翻訳器は自前で持ち込み、JIT の制限を受ける
メモリ端末の搭載量次第OS がアプリごとに上限を設け、超えると強制終了(jetsam)

表:Android 開発者向け資料、Apple の App Store Review Guidelines と開発者フォーラム、各プロジェクトの公開情報をもとに編集部が作成。

App Store の規約は、2024年4月からレトロゲーム機や PC のエミュレーターを認めている。ただし JIT が使えるようになったわけではない。EU や日本では法規制を受けて代替アプリストアやブラウザの独自エンジンが認められ、日本でも iOS 26.2 以降、代替ブラウザエンジンには JIT が認められた。Apple が JIT を認めているのはブラウザエンジンに限られ、ゲーム用の翻訳器が JIT を使える道は、調べた範囲では開かれていない。

4回、方式を変えた

最初は「Mac で動いた部品を持ち込めばよい」と考えていた。甘かった。Mac と同じ部品は、ほとんど使えなかった。iPad には Intel 向けプログラムを翻訳する Rosetta 2 が無く、Mac 版 Wine や Apple の D3DMetal はそのままでは動かない。方式を4回変えている。

時期方式構成結果
1日目32bit 専用の Wine 環境Boxedwine(x86 をソフトウェアで解釈)32bit の簡単なアプリは動作。対象ゲームは 64bit で起動不可
1日目Linux 用 x86 エミュレーター上の WineBlink + Wine 8Wine 自体は起動するが、補助プロセス(wineserver)を作れず停止
1〜6日目PC 全体をエミュレートUTM(JIT を使わない方式)+ Linux + Wine 11iPad Air(M3)で Steam のログイン画面まで約22分。実用外
7〜11日目Wine を iPad 用に移植(採用)Wine を ARM64 向けに直接ビルドし、ゲームの x86-64 コードだけを FEX で翻訳。描画は DXVK → MoltenVK → MetaliPad mini(第6世代、A15、iPadOS 26)で3作品を検証

表:筆者の検証記録(11日間)。

最初の3つは、どれも「子プロセスが作れない」「JIT が使えない」という iOS の制約に正面からぶつかった。最後の方式は、Wine そのものを iPad アプリとして作り直し、翻訳が必要なのはゲームのコードだけにする。画面を iPadOS に渡す部分も新たに書いた。

動いたもの、動かなかったもの

時期作品エンジン到達点
10日目Veritas Tales―タイトル画面まで約70秒(当初は約680秒)、オープニングは 54fps。タッチ操作でタイトルを抜けられることを確認
11日目都市伝説解体センターUnityタイトル画面で約60fps。新規ゲームから、プロローグの会話画面まで進んだ
10日目Slay the Spire 2Godot(.NET)メインメニューには届くが、描画開始後に GPU 用メモリが急増し、約2.87GB の上限を超えて強制終了。現在は保留

表:iPad mini(第6世代)での実測。長時間のプレイは未確認。

起動時間の短縮は、翻訳したコードをキャッシュとして保存し、次回の起動で再利用できるようにした効果が大きい。Veritas Tales では、最初の絵が出るまでが5.1秒になった。

Steam と権利の扱い

iPad では Steam クライアントそのものが動かない。Steam は複数のプロセスで動くソフトで、子プロセスを作れない iOS では原理的に起動できないからだ。

このため、iPad での検証は次の条件の範囲に限っている。

  • 対象は、筆者の Steam アカウントで所有しているゲームだけ。ゲームデータは筆者のアカウントから正規に入手した
  • 3作品とも、Steam の DRM(実行ファイルを暗号化して保護する仕組み)が使われていないことを事前に確認した
  • ゲーム本体の実行ファイル(exe)は書き換えていない。DLC など、所有していないコンテンツを有効にする変更もしていない
  • iPad 上では、実績、クラウドセーブ、フレンド機能など、Steam クライアントに依存する機能は使えない。セーブデータは Mac の Steam クライアントを経由して同期する手順を用意したが、実運用はまだしていない
  • 検証用のアプリとゲームデータは筆者の端末でだけ使い、他人には配布していない

Steam クライアントが無い状態でゲームを起動するための技術的な詳細は、本稿では扱わない。ゲームごとの利用規約やライセンスとの関係まで含めると、個人の検証の範囲を超えて一般化できる内容ではないからだ。iPad で Windows 版ゲームを正式に遊べるようにするには、Steam クライアントそのものが動くか、パブリッシャーや Valve による公式な対応が必要になる。

なぜ iOS は難しいのか――3つの壁

壁1:JIT が使えない

x86 の命令を ARM の命令へ変換しながら実行するには、「変換したコードをメモリに書き込み、そのまま実行する」必要がある。iOS はセキュリティのため、書き込んだメモリを他社アプリが実行することを基本的に認めていない。iPadOS 26 の新しい端末では、実行可能にしたつもりの領域も、システム側の検証機構(TXM)に登録されていなければ実行できない。しかも、実行権限の要求は「成功」を返したうえで、実際には効かない。

筆者の iPad 版では、Mac で動くデバッガを常時接続し、デバッガ経由で実行可能なメモリを確保した。ゲームが実行中に新しいコードを生成するたびに、デバッガへの問い合わせが発生する。Unity 製の都市伝説解体センターは実行中に大量のコードを生成するため、タイトル画面までにこの処理が約2万6,000回発生し、起動が大きく遅れた。

壁2:子プロセスが作れない

通常の Wine は、Windows のカーネルの役を担う wineserver を別プロセスとして動かし、初期化にも別プロセスを使う。iPad 版では wineserver をアプリ内のスレッドとして動かし、初期化済みの環境をアプリに同梱して回避した。Steam のように複数プロセスで動くソフトは、この方法でも動かない。

壁3:配布できない

JIT のためにデバッガを接続する構成は、App Store では認められない。筆者は開発者用の署名で自分の端末に入れているだけだ。EU などの代替アプリストアでも、JIT が使えるようになるわけではない。

そのほかの壁

筆者の記録には、iOS 固有の細かな壁も並ぶ。

  • メモリ上の下位 4GB が OS に予約されていて、Windows のプログラムが前提とする固定アドレスを使えない
  • ARM64 版 Windows が特定のレジスタ(x18)に置く情報を、Apple のカーネルはシステムコールのたびに消去する。このため Wine、FEX、DXVK を別のレジスタで動くよう改造した
  • 署名されていないファイルを、実行可能なメモリとして読み込めない
  • iPad mini(A15)の GPU は、PC ゲームで一般的な BC 形式のテクスチャ圧縮に対応していない。展開すると容量が約4倍になるため、別形式への変換や縮小が必要だった
  • アプリごとのメモリ上限(iPad mini で約2.87GB)を超えると、OS に強制終了される。メモリ上限を引き上げる権限を付けても、搭載メモリは超えられない

まとめ――iPad で遊べる日は来るのか

iPad で Windows 版ゲームの実行ファイルを動かすこと自体は、技術的には可能だった。2作品でタイトル画面以降まで到達し、条件がそろえば 60fps も出た。

しかし、それは Mac のデバッガに支えられた、開発者の端末だけで成り立つ状態だ。Android との差は CPU や GPU の性能ではなく、JIT、子プロセス、配布を OS が許すかどうかにある。この3つは、iOS のセキュリティ設計の中心にあり、技術的な工夫だけでは越えられない。

iPad で Windows 版ゲームが一般に遊べるようになるには、Apple が JIT の扱いを変えるか、ゲーム側が iPad 版を正式に出すかのどちらかが必要になる。当面は後者、つまり正式な移植を待つのが現実的な道だろう。

用語と主なソフトウェアの解説

名前種類何をするものか
WineOSS(WineHQ)Windows の API を再実装し、Windows の実行ファイルをそのまま動かす互換層。Windows 本体は使わない
JIT(実行時コンパイル)技術用語プログラムを実行しながら機械語に変換し、その場で実行する方式。x86 翻訳器を実用的な速度で動かすのに欠かせない
FEX(FEX-Emu)OSSx86 / x86-64 のプログラムを ARM64 で動かす翻訳器。本稿の iPad 版で採用した
Box64OSSx86-64 のプログラムを ARM64 で動かす翻訳器。Android の Winlator などが使う
WinlatorOSS(Android アプリ)Wine と Box64 を組み合わせ、Android で Windows アプリを動かす
TurnipOSS(Mesa)Qualcomm の Adreno GPU 向けのオープンソース Vulkan ドライバ
Vulkan / Metal描画 APIVulkan は Android や Windows で使われる業界標準。Metal は Apple 製品の GPU を使う唯一の公式 API
DXVKOSSWindows の Direct3D 8〜11 を Vulkan に変換する層
MoltenVKOSS(Khronos Group)Vulkan の呼び出しを Metal に変換する層
UTM / QEMUOSSPC 全体をエミュレートするソフト。UTM は QEMU を iOS・macOS 向けにしたもの
Boxedwine / BlinkOSSそれぞれ、32bit Windows アプリを Wine ごとエミュレートするソフトと、x86-64 Linux のプログラムを動かすエミュレーター
wineserverWine の構成要素Windows のカーネルに当たる役割を担う、Wine の補助プロセス
TXMApple の仕組み新しい iPhone・iPad で、実行してよいコードをシステム側で管理する機構
jetsamiOS の仕組みメモリを使いすぎたアプリを OS が強制終了する機構
サイドロード技術用語公式ストアを通さずにアプリを端末へ入れること
DRM技術用語著作物の不正な利用を防ぐための技術的な保護の仕組み

確認済みと未確認

確認済み(実測)未確認
iPad mini(A15)で Veritas Tales がオープニングを 54fps で再生し、タッチ操作でタイトルを抜けた長時間のプレイでの安定性、発熱、バッテリー消費
都市伝説解体センターがタイトル画面約60fpsで動き、プロローグの会話画面まで進んだ指での実際のタッチ操作(検証は自動入力)、音声出力
Slay the Spire 2 がメインメニューに到達した同作のメモリ上限超過の解消
4つの方式を比較し、Wine の移植方式を採用したMac のデバッガ無しでの実行、iPad 上での Steam クライアント実行
―他の iPad・iPhone での再現性、D3D12 を使うゲーム

キーワード:#Winlator#FEX#JIT

出典

コメント