純正なら素直に動くのでは、と思った
p956では、Macで無料でどこまで遊べるかを幅広く試しました。結果は正直に言って惨敗で、ゲーム画面に一度も辿り着けませんでした。Steamは黒画面、ランチャーは白画面。原因はどちらも同じところにありました。
あのとき試したうちの一つが、Appleが自分で配っている Game Porting Toolkit(GPTK)です。純正で、しかも無料。今回はこれだけを深掘りします。
期待はありました。p958で調べたとおり、GPTK 4 では GTA V が 106fps → 176fps(+66%)という数字が出ています。翻訳の層を替えただけで、ゲーム側は何も変えずに、です。ハードが足を引っ張っているわけではないという話でもあります。
ただ、名前に「Porting Toolkit」と入っているのが気になっていました。移植するための道具だと言っているわけで、遊ぶための道具だとは書いていません。その差が実際どこに出るのかを、手元で確かめたのが今回です。
用語集
今回は略語が多いので、先に片付けておきます。
| 用語 | 平たく言うと |
|---|---|
| DirectX | Windowsのゲームが「画面をこう描いて」とGPUに頼むときの共通語。Windows専用なので、Macにはこの言葉を理解する相手がいません |
| Metal | Appleの同じ役割のもの。MacのGPUはこちらしか分かりません |
| D3DMetal | DirectXの言葉をMetalの言葉に通訳する部品。GPTKの心臓部で、Appleが作っています |
| Wine | Windowsの実行ファイルを他のOSで動かす仕組み。Windowsを丸ごと動かす仮想化とは違い、Windowsの機能を呼ばれたときだけ肩代わりする翻訳層です |
| Rosetta 2 | Intel向け(x86_64)のプログラムをApple Siliconで動かす仕組み。2027年秋のmacOS 28で終了予定と予告されています |
| DXIL / Metal IR | シェーダ(GPU上で動く小さなプログラム)の中間形式。DirectX側がDXIL、Apple側がMetal IR。ここも翻訳が必要です |
| CEF Chromium Embedded Framework | アプリの画面をWebページの技術で作るための部品。SteamやゲームランチャーのUIはこれで作られていることが多い。今回もここでつまずきます |
| 32bit / 64bit | 実行ファイルの世代。今回いちばん効いてきた区別で、同じDirectXの指定でも通る道が変わります |
GPTKは何をしているのか
GPTKは大きく2つの翻訳を同時にやっています。命令の翻訳と、シェーダの翻訳です。
翻訳が三重に重なっているのに実用速度が出ているのが、この仕組みのいちばん妙なところです。「Windowsを動かしている」のではなく「Windowsの言葉を訳している」だけなので、丸ごと動かす仮想化よりは軽い——という理屈は分かるのですが、それでも三重は三重です。
入手経路が2つあり、どちらも一長一短
ここで最初のつまずきがありました。公式のGPTKをダウンロードするには、Apple Developerのサインインが要ります(無料アカウントで済みます)。
今回はログインを伴う作業を避けたかったので、もう一つの経路を選びました。Gcenxという方が、GPTKをそのまま使える形にまとめて公開しているものです。
| 入手経路 | 版 | サインイン | 中身 |
|---|---|---|---|
| Apple 公式 | GPTK 4 | 必要(無料アカウント) | 評価環境・shader converter・Metal開発ツール一式 |
| Gcenx 版 | 3.0-3 2026-03-03 | 不要 | Wine+D3DMetal をまとめた .app(240MB) |
つまり手軽さと新しさが逆になっています。すぐ試せるほうは1世代古く、最新のほうは一手間かかる。今回はGcenx版(GPTK 3.0-3)で測っているので、冒頭の「+66%」はGPTK 4 の話で、この記事の数字とは別のものだと先に書いておきます。
入れてみたら、Wineは7.7だった
240MBの書庫を展開すると、Game Porting Toolkit.app が出てきます。あとは新しいプレフィックス(Windowsのふりをする作業フォルダ)を作るだけで、導入自体は数分でした。
中を覗いて、いちばん驚いたのがここです。
$ wine64 --version
wine-7.7 (Game Porting Toolkit 1.1)
$ file wine64
Mach-O 64-bit executable x86_64 ← Intel向け。Rosetta 2 経由で動く
| 項目 | 実測 |
|---|---|
| バンドルの版 | 3.0-3 |
| Wineのベース | wine-7.7(内部表記は Game Porting Toolkit 1.1) |
| D3DMetal | 3.0 |
| シェーダ変換器 | libmetalirconverter.dylib 同梱 |
| DLSS対応 | nvngx-on-metalfx.dll=DLSSの呼び出しをMetalFXに回す |
「3.0」というのはD3DMetalの版で、Wineは7.7のままでした。ここが後で全部に効いてきます。p956でCEFが描画されなかったのも、まさにWine 7.7のときの話だったからです。
一方で nvngx-on-metalfx.dll が入っているのは面白い発見でした。ゲームがDLSS(NVIDIAの画像拡大技術)を呼んだら、それをAppleのMetalFXに振り替えるという部品です。NVIDIAのGPUが無いMacで、NVIDIA向けの機能名を受け取って別物で応える、という力技です。
「動いた」は「D3DMetalで動いた」ではない
ここが今回いちばんの落とし穴でした。
まず定番のベンチマークである Unigine Heaven を入れて、DirectX 11を指定して走らせました。動きました。画面も出ました。ところがログを見て青くなりました。
Loaded L"C:\windows\system32\wined3d.dll": builtin ← D3DMetalではない
wined3d_guess_card_vendor Received unrecognized GL_VENDOR "Apple".
Returning HW_VENDOR_NVIDIA. ← Appleを認識できずNVIDIA扱い
err:d3d:wined3d_check_gl_call GL_INVALID_FRAMEBUFFER_OPERATION from glClear
wined3d は、Wineが昔から持っている「DirectXをOpenGLに置き換える」部品です。D3DMetalではなく、そちらが使われていました。しかもそのOpenGL経路も壊れていて、エラーを吐きながら描いている状態でした。
原因を追って、GPTKの中身を数えてみたら理由がはっきりしました。
ファイルサイズがそのまま答えでした。64bit側の d3d11.dll は約106KBしかありません。実装が入っていない、D3DMetalへ受け渡すだけの薄い板です。対して32bit側は約455KBあり、wined3d.dll と一緒に置かれています。こちらは昔ながらのOpenGL経路です。
Unigine Heaven も Valley も、実行ファイルは32bitでした。つまりこの2本でいくら測っても、GPTKの性能を測ったことにはならないのです。
「起動した」「画面が出た」で満足していたら、まったく別のものの数字を記事に載せていました😅
実測:64bitのDirectXなら、ちゃんと通る
そこで64bitのベンチマークを探し直しました。同じUnigineの Superposition は64bitで、しかもコンソール版があります。
そして、D3DMetalが本当に使われているかを確かめる方法が一つあります。Metal Performance HUD です。環境変数を1つ立てるだけで、Metalを使っているアプリの上に計測値が出ます。
export MTL_HUD_ENABLED=1
これが決定的でした。HUD自身が「Game Porting Toolkit 3.0」「D3D11」「Rosetta x86_64」「M4」と名乗ってくれます。推測ではなく、動いている当人の申告です。
読み込みログのほうでも wined3d.dll がまったく出てきません。32bitのときは出ていたので、経路が変わったことがはっきり分かります。
| サンプル | FPS | GPU時間 | フレーム間隔 |
|---|---|---|---|
| 1回目 | 48.27 | 20.73 ms | 20.72 ms |
| 2回目(約36秒後) | 47.37 | 21.03 ms | 21.11 ms |
1280×720・品質は最低寄りという条件で、47〜48fpsで安定しました。三重の翻訳を挟んでこの数字なら、素直に速いと思います。
上のスクリーンショットをよく見ると、右上のUnigine自身の表示は 67.5、Metal HUDは 48.27 です。別のときには 33.3 と 47.37 でした。
Unigine側はその瞬間の値、HUDはならした値なので、どちらも間違いではありません。ただどちらを引用するかを書かないと、倍近く違う数字が独り歩きします。速度の回で書いた「測っている場所が違うだけ」がまた出てきました。
OpenGLは、そもそも起動しない
比較のため、同じSuperpositionをOpenGLで走らせようとしました。D3DMetalを通さない場合の数字が欲しかったからです。
GLAppWindow::create_context(): wglCreateContextAttribsARB(): failed
Engine::video_restart(): can't set 1280x720 windowed video mode
ウィンドウには「Can't set video mode」だけが出て終わりました。GPTKでOpenGLは実質使えません。
おかげで「D3DMetalあり/なし」の比較は、このバンドル単体では取れませんでした。ただ、これ自体が性格をよく表しています。GPTKはDirectXをMetalに訳すための道具で、それ以外の道は整備されていないということです。
Steamは今回も動かなかった
さて、本題の「普通に遊べるのか」です。Wineが7.7だと分かった時点で予想はついていましたが、確かめました。
新しいプレフィックスにSteamを入れて起動します。自己更新は元気に走り、242MB ほどダウンロードしました。そのログにこう出ています。
Add pending download: bins_cef_win32.zip.vz... ← CEF本体を取ってくる
[ERROR:check.cc(376)] Check failed: false. NOTREACHED log messages are omitted...
[ERROR:check.cc(376)] Check failed: false. NOTREACHED log messages are omitted...
[ERROR:check.cc(376)] Check failed: false. NOTREACHED log messages are omitted...
↑ 約10秒おきに延々と繰り返す=画面を描く担当が落ちて再起動し続けている
「Steamwebhelperが応答していません」。p956とまったく同じ壁です。Wineが同じ7.7なので、結果も同じでした。Warframeはストアに辿り着けないので、起動すらできていません。
そしてこの画面、日本語が全部 □ になっています。新しいプレフィックスにはフォントの設定が無いためで、p956で一度解決した問題がそのまま再発しました(macOSの Arial Unicode.ttf をコピーして代替フォントに登録すれば直ります)。
公式のGPTK 4も試したが、載せ替えでは動かなかった
ここまでは、サインイン不要のGcenx版(GPTK 3.0-3)での話です。その後、公式の GPTK 4.0 beta 2 を用意できましたので、冒頭の「+66%」を手元で確かめに行きました。
結論から書くと、動かせませんでした。ただ、失敗の理由がはっきり分かったので、そちらを書きます。
公式dmgの中身
まず hdiutil verify で整合性を確認し(checksum VALID)、出所も download.developer.apple.com であることを確かめました。中核は「Evaluation environment for Windows games 4.0 beta 2」という26MBの入れ物で、そこに新しいD3DMetalが入っています。
| ファイル | 3.0(Gcenx版) | 4.0 beta 2(公式) |
|---|---|---|
| D3DMetal 本体 | 5,263,744 B | 7,578,032 B |
libd3dshared.dylib | 95,952 B | 241,888 B |
そしてここで、前のほうで書いた「32bitはD3DMetalを通らない」という話に裏づけが付きました。公式の配布物に入っているモジュールは、こうなっていました。
redist/lib/wine/
├── x86_64-unix/ d3d10 d3d11 d3d12 dxgi nvapi64 nvngx-on-metalfx
└── x86_64-windows/ d3d10 d3d11 d3d12 dxgi nvapi64 nvngx-on-metalfx
↑ 64bit だけ。i386(32bit)のフォルダが存在しない
Apple自身の配布物にも、32bit用は1つも入っていません。推測ではなく、これが仕様でした。
①GPTK同梱のWine 7.7に載せると、初期化できない
Appleの Read Me には「Gcenx版のライブラリを置き換えれば最新のD3DMetalが使える」と書かれています。素直に従ったところ、こうなりました。
No implementation for gdi32.dll.D3DKMTEnumAdapters2 imported from "dxgi.dll"
Initialization of L"dxgi.dll" failed
D3D11Wrapper::init(): can't load "dxgi.dll" library
→ Requested video app failed to initialize, "opengl" is used instead
Wine 7.7 の gdi32.dll に D3DKMTEnumAdapters2 が存在しません(Wine 11.14 にはあります)。Wineは代わりのダミーを差して読み込みまでは通すのですが、初期化の中で実際に呼んでいるようで、そこで失敗します。
②新しいWine 11.14に載せると、今度は落ちる
ならば新しいWineに載せればよいはずです。Wine 11.14(190MB)を用意して同じライブラリを重ねると、d3d11.dll が 405,504B → 139,264B に置き換わり——つまりwined3d実装からD3DMetalのシムに入れ替わり——読み込みも通りました。ところが。
Loading "dxgi.dll"...
wine: Unhandled page fault on read access to 0000000000000000
at address 00007FF81702119F
同じアドレスで、何度やっても落ちます。Read Me にあるMetalFXの準備(nvngx.dll と nvapi64.dll をプレフィックスに配置)や、D3DM_ENABLE_METALFX=1・D3DM_SUPPORT_DXR=1 を足しても変わりませんでした。
古いWineでは初期化できず、新しすぎるWineでは落ちる。Read Me にも「専用にビルドしたWineと組み合わせる必要がある」と明記されていて、その手順はAppleのGitHubリポジトリにあります。ただしそちらはmacOS 27を要求と書かれており、手元は26.5.2でした。
これはGcenx版がいまだ3.0止まりである理由の説明にもなっています。「Wineごと作り直さないと新しいD3DMetalは載らない」からです。
ついでに、Read Me で見つけた環境変数がいくつか実用的だったので残しておきます。
| 環境変数 | 効果 |
|---|---|
D3DM_ENABLE_METALFX | DLSSの呼び出しをMetalFXに変換する。macOS 26では既定でオフ |
D3DM_MTL4 | Metal 4のバックエンドを使う。macOS 27以降で既定オン=26ではMetal 3のまま |
D3DM_SUPPORT_DXR | DirectXレイトレーシングを有効にする(M3以降は既定オン) |
D3DM_MAX_FPS | フレームレートに上限をかける |
D3DM_MTL4 の説明が示しているとおり、GPTK 4の売りであるMetal 4のバックエンドは、macOS 27でなければ既定で有効になりません。「+66%」がどの組み合わせの数字なのかは、引用するときに気をつけたほうがよさそうです。
というわけで3→4の手元での照合はできませんでした。この記事の実測値は、すべてGPTK 3.0-3のものです。
「開発者向け」とはどういう意味だったのか
ここまでを並べると、GPTKの性格がはっきりしてきます。
| できたこと | できなかったこと |
|---|---|
| 64bitのDirectX 11アプリを47〜48fpsで動かす | 32bitアプリをD3DMetalで動かす(wined3dに落ちる) |
| HUDで版・API・翻訳の状態を自己申告させる | OpenGLで起動する |
| 導入は数分(240MB・サインイン不要) | Steamを開く(CEFが落ち続ける) |
| DLSSの呼び出しをMetalFXへ回す仕込みがある | 日本語をそのまま表示する(豆腐になる) |
並べてみると、できなかったことは全部「遊ぶための周辺」です。ストアを開く、日本語を読む、古い実行ファイルを面倒見る。逆にできたことは全部「自分のゲームの中身を評価する」ための機能でした。
GPTKの説明には「評価環境(evaluation environment)」と書かれています。開発者が自分でビルドした64bitの実行ファイルを持ってきて、Metalに載せたらどれくらい出るかを測る道具。そう考えると、Wineが7.7で止まっていることも、CEFが動かないことも、欠陥ではなく射程の外だと分かります。
純正だからこそ目的が絞られているのだと思います。遊ぶ側の面倒(ストア・日本語・古いアプリ)を引き受けてくれるのは、むしろ有料のCrossOverのような製品のほうです。今回は方針として買っていないので比較はしていませんが、値段の差はそこに付いているのだろうと納得しました。
もう一つ、忘れてはいけない期限があります。GPTKのWineはIntel向けの実行ファイルで、Rosetta 2 の上で動いています。そのRosetta 2はmacOS 27までは完全にサポートされ、次のmacOS 28(2027年秋)で終了予定です。この方式そのものに時計が付いている、という点はp956から変わっていません。
ただ、ここには少し希望のある注記が付いています。AppleはmacOS 28以降も「Intelのフレームワークに依存する、更新の止まった古いゲームを動かすための一部機能は残す」と言っています。つまりゲームだけは例外扱いにする含みがあります。
とはいえ「一部機能」がどこまでを指すのかは分かりません。GPTKのようにWineを丸ごとIntelバイナリで動かす使い方まで含まれるのかは、現時点では読み切れないところです😅
遊べるかどうかを決めているのは、D3DMetalではなくWineだった
ここまで書いてきて、いちばん大事な整理が残っていました。今回つまずいたものを「どの層の担当か」で仕分けると、景色が変わります。
並べてみると、はっきりしています。今回「遊べなかった」理由は、ひとつもD3DMetalのせいではありませんでした。全部Wineの側の話です。
| つまずいたもの | 担当 | GPTK 4で直るか |
|---|---|---|
| Steamが起動しない | Wine(CEFが動かない) | 直らない |
| 32bitがD3DMetalを通らない | 設計(公式配布物にも32bitは無い) | 直らない |
| 日本語が豆腐 | Wine(プレフィックスのフォント) | 直らない |
| OpenGLが起動しない | Wine+割り切り | 直らない |
| 描画が遅い/速い | D3DMetal | ここだけ直る |
+66%というのは動きだしたあとの速さの話です。ストアが開かない・日本語が読めない・古い実行ファイルが面倒を見てもらえない、という入口の問題は、D3DMetalを新しくしても1つも解決しません。
逆に言えば、「遊べる」側に効くのはWineが新しくなることです。p956では Wine 11.13 で64bitのSteamが動いた実績があります。つまり新しいWine + 新しいD3DMetal が組んだ瞬間が本命で、今回はそれを手作業で作ろうとして落ちた、という話でもあります。
そう考えると、GPTKの「バージョンが上がる」ことよりも、Gcenxのような配布側が「新しいWineに新しいD3DMetalを載せた組み合わせ」を出してくれるかどうかのほうが、遊ぶ立場としては重要だと分かります。Appleが Read Me で「まずは既製の環境を使え」と書いているのも、結局そういうことなのだと思います。
eightは最初、この記事を「GPTKの性能を測る話」だと思って始めました。ところが測り終えてみると、性能を決めているのはD3DMetalで、体験を決めているのはWineという、層の役割分担の話になっていました😅
まとめ
- 導入は簡単でした。Gcenx版なら240MBを展開するだけ、サインインも不要。ただし版は公式より1世代古い(3.0-3 対 4)
- ★「3.0」はD3DMetalの版で、Wineは7.7のまま。ここが後の結果ほぼ全部を説明します
- ★32bitのDirectXアプリはD3DMetalを一切通りません。64bit側の
d3d11.dllは106KBの薄い板、32bit側は455KBでwined3d付き。「動いた」と「D3DMetalで動いた」は別です - 64bitのDX11なら47〜48fpsで安定。命令・シェーダ・CPU命令の三重翻訳を挟んでこれなら速いほうだと思います
- ★Metal Performance HUDが版とAPIを自己申告してくれます。推測せずに証拠を残せるので、この手の検証では必ず立てるべき環境変数でした
- OpenGLは起動しません。DirectX専用と割り切った作りです
- ★Steamは今回も動きませんでした。CEFが10秒おきに落ち続ける。Wineが同じ7.7なのでp956の結論がそのまま当てはまりました
- 日本語は豆腐になります。新しいプレフィックスを作るたびに再発します
- ★公式のGPTK 4は、ライブラリだけ差し替えても動きませんでした。古いWine(7.7)では
D3DKMTEnumAdapters2が無くて初期化できず、新しいWine(11.14)では同じアドレスで落ちる。専用にビルドしたWineと組でしか動かないので、3→4の照合は諦めました - Metal 4のバックエンドはmacOS 27から。26では既定でMetal 3のままなので、「+66%」を引用するときは組み合わせに注意が必要です
- ★★遊べるかどうかを決めているのはD3DMetalではなくWineでした。今回つまずいた4つ(Steam・32bit・日本語・OpenGL)はひとつもD3DMetalの担当ではなく、GPTK 4を持ってきても直りません。D3DMetalは「速さ」を、Wineは「そこまで辿り着けるか」を決めています
やってみていちばん危なかったのは、Unigine Heavenが「動いてしまった」ことです。画面は出ていて、fpsも表示されていて、何も疑う理由がありませんでした。ログを見に行ったのは半ば偶然です。
測る前に「何を測っているのか」を確かめる——精度の回でも前回でも同じところで転んでいるので、そろそろ習慣にしたいところです😅
それでは、今回はここまで。最後までありがとうございました😊
【実測環境】Apple M4 / macOS 26.5.2 (25F84) / RAM 32GB。Game Porting Toolkit は Gcenx 配布の 3.0-3(game-porting-toolkit-3.0-3.tar.xz / 240MB / 2026-03-03)を使用し、同梱の Wine は wine-7.7 (Game Porting Toolkit 1.1)、D3DMetal は 3.0。公式の GPTK 4.0 beta 2(Game_Porting_Toolkit_4.0_beta_2.dmg / 104MB・hdiutil verifyでchecksum有効・出所 download.developer.apple.com)も入手して試しましたが、★Wine 7.7 では dxgi.dll の初期化に失敗(gdi32.dll.D3DKMTEnumAdapters2 未実装)、Gcenx の wine-devel 11.14(190MB)に載せ替えると読み込みは通るもののヌル参照で再現性のあるクラッシュとなり、D3DMetal 4.0b2 での実測は取れていません。したがって本文の実測値はすべて GPTK 3.0-3 のもので、「GTA V が 106→176fps(+66%)」は Apple 公表値の引用です(M4 Pro・設定同一とされています)。なお Apple のリポジトリは GPTK 4 について macOS 27 を要求と記載しており、手元は 26.5.2 です。ベンチマークは Unigine の無料版(Heaven 4.0 / Valley 1.0 / Superposition 1.1)。計測は Superposition 1.1 を -video_app direct3d11 -video_width 1280 -video_height 720 -video_fullscreen 0、shaders/textures quality 0、ウィンドウ表示で実行し、Metal Performance HUD(MTL_HUD_ENABLED=1)の値を採用しています(Unigine自身の瞬間fps表示とは別物です)。Steam は SteamSetup.exe を新規プレフィックスへ導入し -no-cef-sandbox で起動。★既存の Whisky ボトル4個には触れていません(作業後に更新日時が変わっていないことを確認済み)。CrossOver・Parallels は方針により購入・検証せず、比較対象としての紹介のみです。数値は2026年7月時点の実測で、版・設定により変わります。