Marathon Input Issues Fix: Overlay 競合に負けない PC ゲームのアーキテクチャ設計
対戦型マルチプレイヤーの開発者なら誰でも、Discord の overlay のせいで完璧に設計された netcode が台無しになる絶望感を知っています。サーバーインフラを 30ms 以下のレイテンシに最適化するために数ヶ月を費やしても、バックグラウンドのストリーミングアプリがゲームの input thread を圧迫しているせいで、プレイヤーの弾が当たらないという事態が起こるのです。
このシナリオは、Bungie の新作『Marathon』の Server Slam で実際に発生しています。PC プレイヤーからは深刻な mouse lag や入力落ちが報告されており、Bungie はサードパーティ製ユーティリティや overlay が原因であると公式に認めました。
現在、コミュニティでは多くのプレイヤーが marathon input issues fix を探しています。プレイヤー側の回避策は、ウィンドウキャプチャではなく画面全体をキャプチャし、overlay を無効にすることです。
しかし開発者にとっての課題は、なぜ overlay が入力をハイジャックするのか、そしてそれを防ぐために PC クライアントをどう設計すべきかという点にあります。
本記事では、Windows の入力処理メカニズムを分析し、OBS 等が frame pacing に問題を起こす理由と、input thread をデカップリングする方法を解説します。
根本原因:Overlay が Render Pipeline を乗っ取る仕組み
OBS や Discord は、ゲームプロセスに DLL をインジェクトし、DirectX の Present 関数や Vulkan の vkQueuePresentKHR をフックします。
Swap Chain のボトルネック
フックされた swap chain により、エンジンはフレームバッファのコピーが終わるまで待機を強いられます。16.6ms (60 FPS) で済むはずのフレームが 24ms かかるようになり、メインスレッドで行われる WM_MOUSEMOVE のポーリングも連鎖的に遅延します。
解決策:Raw Input API の採用
標準の Windows メッセージポンプに頼るのは、競技性の高いシューターでは致命的です。Raw Input API (WM_INPUT) を実装し、レンダリングループから完全に切り離された高優先度の専用スレッドでポーリングを行うべきです。
C++ (Win32) での Raw Input 実装
void InitializeRawInput(HWND hwnd) {
RAWINPUTDEVICE Rid[1];
Rid[0].usUsagePage = 0x01;
Rid[0].usUsage = 0x02;
Rid[0].dwFlags = 0;
Rid[0].hwndTarget = hwnd;
RegisterRawInputDevices(Rid, 1, sizeof(Rid[0]));
}
Unreal Engine:スムージングの無効化
Unreal Engine では、PlayerController で mouse smoothing を無効化し、フレームレート変動時の違和感を排除してください。
クライアントラグとサーバーロールバック
入力遅延はマルチプレイヤーにおいて深刻です。クライアントのループが停滞すると、サーバーへのパケット送信が遅れ、reconciliation によって rubberbanding が発生します。これは How To Fix Player Location Desync In Uefn And Unreal Engine Multiplayer で語られている現象に似ています。
horizOn を利用すれば、こうした同期問題に強い最適化済みのゲームサーバーを構築できます。
PC 入力における 5 つのベストプラクティス
- 入力とレンダリングの分離: 1000Hz で動作する独立スレッドで Raw Input を取得する。
- DXGI Flip Model の強制:
DXGI_SWAP_EFFECT_FLIP_DISCARDを使用して DWM をバイパスする。 - ハードウェアカーソルの使用: UI テクスチャではなく OS レベルのカーソルを使用する。
- フック注入の警告: overlay DLL を検知した際にプレイヤーに通知する。
- Fixed Timestep Simulation: 物理と入力を固定時間ステップで処理する。
結論
開発者は Raw Input の実装とスレッドの分離を徹底すべきです。バックエンドの同期に関しては horizOn に任せ、クライアントの操作感の磨き上げに集中しましょう。