MacでWindowsのゲームを動かす話を、このブログでは何回か書いてきました。Whisky亡きあと、Macで無料でどこまで遊べるのか、Apple純正のGame Porting Toolkitを使い倒す、Whiskyの代わりに何を使うか、仮想マシンでWindowsゲームは動くのか。そして2026年版・MacでWindowsゲームを無料で遊ぶで、手段の選び方を一度まとめました。
ただ、実際にやってみると分かるのですが、失敗の仕方には型があります。真っ黒、真っ白、文字が □ になる、起動した瞬間に消える。そのたびに毎回ゼロから悩むのは、正直かなりつらいです😅
そこで今回は、これまでの回で踏んだ失敗を「症状から引ける形」に組み替えました。新しい検証というより、手順書です。芯にあるのはひとつだけで、症状は「どの層で止まったか」の合図だという見方です。層が分かれば、見る場所も、直せるかどうかも決まります。
クラッシュレポートの読み方だけは、記事のためにわざと落とすプログラムを書いて実演しました。読み方を言葉で説明されるより、実物を1枚見るほうが早いからです。
【前置き】「動かない」は5つの関門のどこかで止まっている
Macでゲームを起動したとき、実際には多くの関門が順番に通過されています。ダウンロードしたファイルが信用されるか、実行が許可されるか、CPUがそのまま実行できるか、絵を描く仕組みに繋がるか。そして最後に、運営側のルールに触れていないか。
大事なのは、どの関門で止まったかによって、出てくる症状が違うことです。逆に言えば、症状を見れば止まった場所がかなり絞れます。
この記事の使い方
上から順に読む必要はありません。早見表(4章)で自分の症状を探し、その章だけ読めば足ります。章タイトルに【互換レイヤー】と付いている症状は、Whisky・Wine・Game Porting Toolkitのように「Windowsのふり」をさせて動かしているときにだけ出るものです。Mac版のゲームでは起きません。
用語集
この記事に出てくる言葉を先に片付けておきます。
| 用語 | 平たく言うと | なぜそれが効くのか |
|---|---|---|
| 互換レイヤー | Windows用のソフトに対して「ここはWindowsですよ」と振る舞って動かす仕組み。Wine、Whisky、Game Porting Toolkit(GPTK)など | Windows本体は無い。読み替えられない機能に当たると、そこで止まる |
| Rosetta 2 | Intel(x86_64)向けのアプリを、Apple SiliconのMacで動かすための翻訳の仕組み | 動くが遅くなる。★ネイティブ版があるのに翻訳側で動いていることがある |
| arm64 / arm64e | どちらもApple Silicon向けのネイティブ。e はポインタ認証という保護が付いた版 | ★arm64eを「ネイティブではない」と数えると集計が壊れる(あとで実話が出てきます) |
| 隔離属性 (quarantine) | インターネットから落としたファイルに、macOSが付ける「よそから来た」という印 | この印が付いていると、初回起動で確認を求められる。ここで止まる症状がある |
| Gatekeeper | 署名や公証(Appleによる確認)を見て、起動してよいかを判定する仕組み | 「開発元を検証できません」の出どころ |
| クラッシュレポート | アプリが落ちたときにmacOSが自動で書き残す記録。.ips という拡張子 | ★落ちた理由はほぼここに書いてある。この記事の主役 |
| CEF (Chromium Embedded Framework) | アプリの中に埋め込まれた小さなブラウザ。SteamやゲームランチャーのUIはこれで作られていることが多い | ★互換レイヤー上でいちばん動かない部品。真っ白の正体 |
| D3DMetal | WindowsのDirectXの命令を、AppleのMetalへ読み替える部品(GPTKの中核) | ここに繋がっていれば速い。繋がらないと別の経路に落ちる |
| wined3d | DirectXをOpenGLで実装した、Wine側の受け皿 | ★ここに落ちるとMacでは絵が壊れる。真っ黒の主犯のひとつ |
| アンチチート | 不正行為を検出するためにゲームに組み込まれる仕組み。EAC、BattlEyeなど | ★仮想化や互換レイヤーを「不正」と判定することがある。いちばん怖い関門 |
【全体像】ゲームが遊べるまでに通る5つの関門
まず全体像です。ゲームが実際に遊べるまでに、次の5つを順番に通ります。
この図の右のほうほど、自分では直せない領域になります。①②はほぼ手元の操作で解決できますが、④は「そもそも実装されていない」ことが原因になりやすく、⑤に至っては踏んでしまってからでは手遅れです。
【使い方】症状から引く早見表
自分の症状を探して、該当する章へ飛んでください。
| 症状 | 止まっている関門 | まず見る場所 | 直せるか |
|---|---|---|---|
| 起動した瞬間に消える/「予期しない理由で終了しました」 | ②実行 | クラッシュレポート | 理由による |
| 「開発元を検証できません」 「壊れているため開けません」 | ①入手 | 隔離属性と署名 | ◎ 直せる |
| 遊べるが妙に重い/ファンが回り続ける | ③CPU | Rosettaで動いていないか | ○ 直ることがある |
| 画面が真っ黒/音だけ出る | ④描画 | どの描画経路に落ちたか | △ 難しい |
| ランチャーの枠は出るが中身が真っ白 | ④描画 | ブラウザ製UI(CEF) | × 打つ手なし |
| 文字が全部 □ になる | ④描画 | フォント | ◎ コピー1回で直る |
| 普通に遊べていたのに、突然ログインできなくなった | ⑤ルール | アンチチート | × 手遅れ |
【症状A】起動直後に終了する ── まずクラッシュレポートを開く
いちばん多くて、いちばん情報が取りやすいのがこれです。アイコンが跳ねて、消える。あるいは「〜は予期しない理由で終了しました」というダイアログが出る。
このとき、macOSは落ちた理由を必ずファイルに書き残しています。場所はここです。
~/Library/Logs/DiagnosticReports/
拡張子は .ips。GUIで見るなら コンソール.app を開いて、左のサイドバーの「クラッシュレポート」を選びます。ファイル名は アプリ名-年月日-時刻.ips なので、落ちた直後のものを開けば当たりです。
中身はJSONです。1行目がヘッダ、2行目以降が本体という、少し変わった形をしています。全部読む必要はありません。見るのは4か所だけです。
| 見る場所 | 何が分かるか |
|---|---|
exception の type と signal | ★落ち方の種類。ここでだいたい決まる |
termination の indicator | 「Segmentation fault: 11」のような、人間向けの一言 |
asi | ライブラリが残した最後のメッセージ(あることが多い) |
faultingThread のスレッドの先頭フレーム | ★どこで落ちたか。自分のアプリ名が出ていれば、原因はそのアプリの中 |
【承前・実演】わざと落として、レポートの読み方を確かめる
説明だけだと分かりにくいので、確実に落ちるプログラムを書いて、実際のレポートを並べます。用意したのはこれだけです。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
if (argc > 1 && argv[1][0] == 'a') { abort(); } // 異常終了
int *p = NULL; *p = 1; // 無いアドレスに書き込む
return 0;
}
2つの落ち方を用意したのには理由があります。この2つは、レポートの見た目がはっきり違うからです。
① 無いアドレスを触って落ちた場合
exception:
type : EXC_BAD_ACCESS
signal : SIGSEGV
subtype : KERN_INVALID_ADDRESS at 0x0000000000000000
termination:
indicator: Segmentation fault: 11
faultingThread のフレーム:
crashdemo main
dyld start
EXC_BAD_ACCESS は「触ってはいけない場所を触った」という意味です。at 0x0000000000000000、つまりアドレス0を触っています。プログラムを書く側から見れば典型的な不具合ですが、遊ぶ側から見ると「そのアプリ自身の中身の問題」という切り分けになります。設定を変えても直りません。
② プログラム自身が「もう無理だ」と判断して終わった場合
exception:
type : EXC_CRASH
signal : SIGABRT
termination:
indicator: Abort trap: 6
asi:
libsystem_c.dylib : abort() called
faultingThread のフレーム:
libsystem_kernel.dylib __pthread_kill
libsystem_pthread.dylib pthread_kill
libsystem_c.dylib abort
crashdemo main
こちらは EXC_CRASH / SIGABRT。プログラム自身が異常を検知して、自分から終了したときの形です。①との違いは大きくて、②は「何かが足りない・条件が合わない」と気づいて止まったケースが多いです。ファイルが見つからない、必要な機能が無い、設定が壊れている。つまり②のほうが、手元で直せる見込みがあります。
おまけ:同じレポートでRosettaかどうかも分かる
クラッシュレポートには translated と cpuType という項目もあります。今回の実演ではどちらも translated: false / cpuType: ARM-64 でした。落ちた原因を調べに行ったのに、ついでに「翻訳されて動いていたのか」まで分かるわけです(症状Cで使います)。
もうひとつ、覚えておくと得な形があります。クラッシュレポートが1件も残っていないのに落ちている場合です。これは「アプリが落ちた」のではなく、OSに殺された可能性が高い。次の章がそれです。
【症状B】「壊れているため開けません」── 署名と隔離属性
ダウンロードしてきたアプリが開けない。この症状は、原因が2つに分かれます。「よそから来た印」が付いているだけなのか、署名そのものが通らないのか。前者は簡単に直り、後者は基本的に直りません。
「よそから来た印」を確認する
インターネットから落としたファイルには、macOSが隔離属性という印を付けます。実際に手元のファイルで見てみます。
$ xattr -p com.apple.quarantine ~/Downloads/Game_Porting_Toolkit_4.0_beta_2.dmg
0281;6a6b266f;Chrome;6C318D72-81CD-43D3-8F40-AAF4F932A339
セミコロン区切りで、フラグ・日時・どのアプリが落としてきたか(ここでは Chrome)・識別子が入っています。この印が付いていると、初回起動時に確認を求められます。
印を外すなら次のコマンドですが、これは「このファイルは信用する」という宣言です。配布元がはっきりしているとき以外は使わないでください。
xattr -d com.apple.quarantine /Applications/○○.app
Gatekeeperの判定を直接聞く
そもそも起動が許可される状態なのかは、spctl で確認できます。手元の2つを見てみます。
$ spctl -a -vv /Applications/Whisky.app
/Applications/Whisky.app: accepted
source=Notarized Developer ID
origin=Developer ID Application: Isaac Marovitz (92S3SG4PTH)
$ spctl -a -vv /Applications/Steam.app
/Applications/Steam.app: accepted
source=Notarized Developer ID
origin=Developer ID Application: Valve Corporation (MXGJJ98X76)
どちらも accepted、つまり通ります。origin に開発元の名前が出ているのが大事な点で、これが期待した会社の名前でなければ、そのファイルは疑ってよいということでもあります。
比較のために、自分で作った署名なしの .app を同じように聞いてみると、こうなります。
$ spctl -a -vv Demo.app
Demo.app: rejected
★ファイルを1バイト書き換えると、どうなるか
ここが今回いちばん実演したかった部分です。ゲームのフォルダの中身を差し替えたり、パッチを当てたりすると起動しなくなることがあります。その正体を見ます。
先ほどのプログラムをコピーして、真ん中の1バイトだけ反転させました。すると署名の検証が通らなくなります。
$ codesign -v tampered
tampered: invalid signature (code or signature have been modified)
In architecture: arm64
さらに、署名を完全に取り除いた場合はもっとはっきりします。
$ codesign --remove-signature unsigned
$ ./unsigned
Killed: 9 ← 終了コード 137
Killed: 9。これは実行される前にOSに止められた合図で、クラッシュレポートも残りません(落ちたのではなく、起動させてもらえていないため)。
Apple Siliconでは「署名なし」で実行できない
Intel Macの時代は署名が無くても動きましたが、Apple Siliconでは実行ファイルに必ず署名が要ります(自分で付ける簡易な署名でも可)。
だからゲームのファイルを1つ差し替えただけで、起動しなくなることがあります。これは壊れたのではなく、「中身が変わったので信用できない」と判断されている状態です。元のファイルに戻すのが正解で、こじ開けようとしても意味がありません。
【症状C】遊べるけれど妙に重い ── Rosettaで動いていないか
起動はする。遊べる。でも思ったより重い、ファンが回り続ける。この場合、Intel向けのまま翻訳されて動いている可能性があります。
手順①:そのアプリが何を持っているかを見る
$ lipo -archs /Applications/Steam.app/Contents/MacOS/steam_osx
x86_64 arm64
$ lipo -archs /Applications/Whisky.app/Contents/MacOS/Whisky
arm64
$ lipo -archs /System/Applications/Chess.app/Contents/MacOS/Chess
x86_64 arm64e
読み方はこうです。
| 出力 | 意味 |
|---|---|
x86_64 arm64 | 両方入っている(ユニバーサル)。ネイティブで動けるはず |
arm64 だけ | Apple Silicon専用。翻訳は起きない |
x86_64 arm64e | ★これもユニバーサル。arm64e はれっきとしたネイティブ |
x86_64 だけ | Intel専用。★Rosettaでしか動かない |
★ここで一度やらかしました
p971で手元のアプリを全部数えたとき、arm64e を「arm64ではない」と判定してしまい、Safari・メール・計算機まで「Intel専用」に分類されました。87本中48本=55%がIntel専用という、明らかにおかしい結果です。判定を直したら実際はIntel専用は2本(2.3%)でした。macOSのシステムアプリはほとんどが arm64e なので、ここを間違えると集計が丸ごと壊れます。
手順②:実際に「今どちらで動いているか」を見る
持っているものと、実際に選ばれたものは別です。動いているプロセスに直接聞きます。
$ vmmap <プロセスID> | grep "Code Type"
Code Type: ARM64 ← ネイティブ
X86-64 (translated) ← Rosettaで翻訳中
アクティビティモニタの「種類」列でも同じことが分かります(Apple/Intel と表示されます)。ターミナル自身が翻訳されているかは、次の一行で分かります。
$ sysctl -n sysctl.proc_translated
0 ← 0=ネイティブ、1=Rosetta
★ネイティブ版があるのに、翻訳側で動いていることがある
p971で実際に踏んだ話です。ユニバーサルバイナリを配っているゲームなのに、Steamから起動するとRosettaで動いていました。
| 起動方法 | 動いていたもの | タイトル画面で40秒放置したときのCPU時間(3回平均) |
|---|---|---|
| Steamから起動 | X86-64 (translated) | 8.78秒 |
| .appを直接起動 | ARM64 | 6.08秒 |
| 差 | ★1.44倍 | |
同じ絵を出すのに、CPUの仕事が約1.44倍かかっていたことになります。対処は単純で、steamapps/common/ の中の .app を直接起動するだけです。ただしプレイ時間の記録やオーバーレイが効かなくなる可能性があるので、そこは好みで判断してください。
【症状D・互換レイヤー】画面が真っ黒/音だけ出る
ここから先は、互換レイヤー(Whisky・Wine・GPTK)で遊ぶときの症状です。
音は鳴っているのに絵が出ない——この状態は、実はかなり情報量があります。音が出ているということは、プロセスは生きていて、ゲーム自体は進行している。つまり①②③は通過していて、④の描画だけが失敗していると断定できます。
まず「どの経路で描こうとしているか」を確かめる
p967で分かったことですが、32bitと64bitでは、通る経路がまったく別です。
| 経路 | DirectXの受け皿 | 最終的にどこへ |
|---|---|---|
| 64bit | 106,496バイトの薄い部品 | → D3DMetal → Metal(速い) |
| 32bit | 454,656バイト(wined3d.dll 同梱) | → OpenGL(Macでは壊れやすい) |
ログを見れば、どちらに落ちたかが一発で分かります。wined3d.dll が読み込まれていたら、D3DMetalは通っていません。
Loaded L"C:\windows\system32\wined3d.dll": builtin
wined3d_guess_card_vendor Received unrecognized GL_VENDOR "Apple".
Returning HW_VENDOR_NVIDIA.
err:d3d:wined3d_check_gl_call GL_INVALID_FRAMEBUFFER_OPERATION (0x506)
from glClear
※長い行はここで折り返しています
3行目が実際のエラーです。画面を消す処理の時点で失敗しているので、その後どれだけ描いても出てきません。これが真っ黒の中身です。2行目も味わい深くて、GPUの製造元が「Apple」だと認識できず、NVIDIAだと思い込んでいます😳
逆に、Metalに繋がっている証拠の取り方
環境変数を1つ足すと、画面の隅にMetalの状況が出ます。
MTL_HUD_ENABLED=1 で起動すると、こう表示される:
M4 / Rosetta x86_64 / 1280x720 / Metal: 1.66GB D3D11 Composited
FPS 48.27
GPU 20.73ms
Game Porting Toolkit 3.0
この表示自体が「Game Porting Toolkit 3.0」「D3D11」と自己申告してくれるので、証拠として使いやすいです。
「動いた」と「意図した経路で動いた」は別
p967では、32bitのベンチマークが動いてしまったために、危うくD3DMetalを通っていない数字を載せるところでした。絵が出たかどうかではなく、ログで経路を確かめる。切り分けでも計測でも、ここは同じです。
【症状E・互換レイヤー】ランチャーが真っ白
ウィンドウは出る。枠も、閉じるボタンも、ドロップダウンも描かれている。なのに中身だけが真っ白。これはかなり特徴的な症状で、原因はほぼ1つに絞れます。CEF、つまりアプリに埋め込まれたブラウザです。
p970で撮ったものです。Wineが自前で描いている部品(枠・ドロップダウン・ダイアログ)は正しく出ているのに、CEFが描くはずの領域だけが白い。層がきれいに分かれているのが見て取れます。
Steamの場合は、白ではなくエラーとして出ます。
「Steamwebhelperが応答していません」。ログには10秒おきに同じ行が並びます。
[ERROR:check.cc(376)] Check failed: false.
↑ 約10秒おきに繰り返す=内部で落ちては再起動している
効かなかった対処(全部書いておきます)
p956とp970で試して、ひとつも効かなかったものです。同じ道を辿らずに済むように残しておきます。
| 試したこと | 結果 |
|---|---|
GPUを使わせない設定(-cef-disable-gpu) | ❌ 変わらず |
プロセスを分けない(-cef-single-process) | ❌ 変わらず |
GPU処理を同じプロセスで(-cef-in-process-gpu) | ❌ 変わらず |
| ランチャー側のGPU設定をオフ(レジストリ) | ❌ 設定は反映されるが、落ち方は同じ |
| キャッシュ削除/仮想デスクトップ | ❌ 変わらず |
| DXMT(Metal向けの描画部品)を導入 | ❌ 変わらず=描画部品の問題ではない |
★Wineのバージョンで結果が逆転する
そして、この症状でいちばん覚えておく価値があるのはこれです。p970で、同じゲームの同じランチャーを、Wineのバージョンだけ変えて起動しました。
| Wine | 結果 |
|---|---|
| 7.7(GPTK同梱) | ❌ 即クラッシュ(スタックオーバーフロー) |
| 11.13 | ✅ 落ちない。通信も成功。ただし中身は白いまま |
| 11.14 | ❌ 一般保護違反。毎秒クラッシュを繰り返す |
★11.13と11.14は10日違いのリリースです。それで結果が逆転します。新しいほうが良いとは限らないので、うまく動いている組み合わせを見つけたら、そのバージョンを控えておくのが唯一の防衛策です。
直せるか、という問いへの答えは残念ながら「今のところ打つ手なし」です。ここは互換レイヤー側が対応するのを待つしかありません。ランチャーを経由しない起動方法があるなら、そちらのほうが現実的です。
【症状F・互換レイヤー】文字が □ になる
逆に、いちばん簡単に直るのがこれです。日本語がすべて □(豆腐と呼ばれます)になる症状。
原因は単純で、Windowsのふりをしている環境の中に、日本語の字が入ったフォントが1つも無いだけです。文字を出す仕組みは動いているので、フォントを置けば直ります。
macOSに標準で入っている Arial Unicode.ttf(23.3MB)を、環境の Fonts フォルダにコピーし、代替フォントの設定を入れる。追加のダウンロードは要りません。
つまずきポイント2つ
① ヒラギノでは直りません。.ttc という複数の書体をまとめた形式は、この用途では読まれませんでした。単体の .ttf を使うのが確実です。
② 環境を作り直すたびに再発します。フォントは環境ごとに持つものなので、新しく作ったら毎回入れることになります。
ちなみにこの症状、画像を作るときにも普通に踏みます。この記事のヒーロー画像を作ったとき、等幅フォント(Menlo)で日本語を書こうとして最初は全部 □ になりました。原因も対処も、まったく同じです😅
【症状G・全環境】動く。ただしアカウントが消えることがある
最後は、症状というより警告です。そしてこの記事でいちばん伝えたい部分でもあります。
p982で仮想マシンの検証をしていたとき、ゲームのアカウントが停止されました。しかも解除は2035年という扱いです。異議申し立てをしていますが、結果はまだ出ていません。
★アンチチート入りのゲームを、仮想マシンや互換レイヤーで起動しない
不正行為をしたわけではありません。「仮想化された環境で動いている」こと自体が検出対象になり得ます。
そして怖いのは、この症状には前触れが無いことです。普通に起動し、普通に遊べて、あとからアカウントが止まる。気づいたときには手遅れです。
事前に確かめる2つの軸
この失敗から学んだのは、規約を2つの軸で読む必要があるということです。
| 軸 | 見るところ | 見落とすとどうなるか |
|---|---|---|
| ① 収益化してよいか | 広告のあるサイトで扱ってよいか | 記事に書けなくなる |
| ② 仮想化環境で動かしてよいか | アンチチートの有無と、その扱い | ★アカウントが飛ぶ |
今回は①だけを確認して、②を確認していませんでした。2つは別の話です。
タイトルごとの状況を調べる方法
Heroic Games Launcher には、アンチチートの対応状況をまとめた表(1,166本分)が同梱されています。中身の内訳はこうでした。
| 状態 | 本数 | 割合 |
|---|---|---|
| Broken(動かない) | 643 | 55.1% |
| Unknown(不明) | 267 | 22.9% |
| Denied(開発元が明確に不許可) | 256 | 22.0% |
★出てくる状態はこの3つだけです。つまりこれは「動くタイトルの一覧」ではなく、問題があるタイトルの警告リストです。ここに名前があったら、素直に諦めるのが安全です。Unknown も安全という意味ではありません——今回止まったタイトルは Unknown でした。
【ここから整理】直せるもの/打つ手がないもの
ここまでの症状を、手間と見込みで並べ直します。
この並びを見ると、手数が少ない症状ほど、原因が単純で層が浅いことが分かります。逆に下の2つは、どちらも「自分の設定の問題ではない」という共通点があります。設定をいじり続けても報われないので、そこを見極める意味でも、症状から層を当てる作業には価値があります。
まとめ
- 症状は「どの層で止まったか」の合図。5つの関門(入手・実行・CPU・描画・運営のルール)のどこかで止まっている
- 音が出ているかを最初に見る。音が出ていれば手前3つは通過していて、描画だけの問題だと分かる
- 落ちた理由は
~/Library/Logs/DiagnosticReports/に残っている。見るのは4か所だけ。★EXC_BAD_ACCESSはアプリ自身の不具合、SIGABRTは「何かが足りない」の合図で、後者のほうが直せる見込みがある - ★クラッシュレポートが1件も無いのに落ちる場合は、OSに止められている。Apple Siliconでは署名の無い実行ファイルは
Killed: 9で殺され、レポートも残らない - ★
arm64eもネイティブ。ここを間違えると集計が丸ごと壊れる(55%が誤判定になった実績あり) - ★ネイティブ版があるのに翻訳側で動くことがある。起動方法を変えるだけでCPU時間が1.44倍違った
- ★「動いた」と「意図した経路で動いた」は別。ログに
wined3d.dllが出ていたら、その数字はD3DMetalのものではない - ★Wineは10日違いのバージョンで結果が逆転する。動く組み合わせを見つけたらバージョンを控えておく
- ★いちばん怖いのは、症状が出ない症状。アンチチート入りのゲームを仮想マシンや互換レイヤーで起動すると、普通に遊べたあとでアカウントが止まる。規約は「収益化の可否」と「仮想化の可否」の2軸で読む
切り分けというのは、結局のところ「自分で直せる範囲かどうかを早めに知るための作業」だと思っています。直せないものに時間を溶かさずに済むだけでも、だいぶ気が楽になります😊
実測した環境
Mac 完結。Apple M4 / メモリ32GB / macOS 26.5.2。計測日は 2026-08-12 です。
この記事の数字は、すべてこの環境で実際に測ったものです。⚠機材や版が変われば結果も変わります。
それでは、今回はここまで。最後までありがとうございました😊