- 高ポーリングレート(記事では2 kHz以上と定義)のマウスはWindowsで大量の入力イベントを発生させ、従来の処理でフレームレート低下や極端な場合は単桁FPSに陥る問題があった。
- Godot側の対応はマウス移動イベントを別扱いにし、DisplayServerWindowsで生入力をバッファ読み取りする実装に変更したことと、WM_MOUSEMOVE系をフレームあたり最大1回に制限する方法を組み合わせたもの。
- 記事はベンチマーク結果を示し、修正により高ポーリング環境での平均フレームレートと1% lowが大幅に改善したと報告している。
DisplayServerでの生入力バッファ化とメッセージ制御
生のマウス入力をDisplayServerWindows側でバッファ読み取りする処理を追加し、PeekMessageW()呼び出しの使い方を変えてWM_INPUTの即時配信を防ぐようにした。加えてWM_MOUSEMOVE系イベントはフレームあたり最大1回だけディスパッチするよう制限している。
- DisplayServerWindows::process_raw_input()でのバッファ読取を導入
- PeekMessageW()の呼び出しでWM_INPUTの即時配信を抑え、次のバッファ読取までキューに残す挙動に変更
- WM_MOUSEMOVE/WM_NCMOUSEMOVEをフレームごとに最大1回だけディスパッチする制御を追加
変更前:従来はWindowsの生入力(WM_INPUT)とレガシー入力(WM_MOUSEMOVEなど)が通常のメッセージ流れで即時処理され、ポーリングが高いマウスでは大量の入力メッセージがレンダリング処理に干渉してフレームレート低下を招いていた。
今回:マウス移動を別経路でバッファしてまとめて処理し、レガシー系移動イベントはフレームあたり上限でしか送られなくなるため、頻繁なマウス更新が直接レンダリングやゲームループを圧迫しにくくなる。
実務上の差:入力イベントの即時処理からバッファ化・遅延ディスパッチへと切り替わり、マウス移動だけが独立して制御されることでメッセージキュー渋滞が緩和される。結果として高ポーリング環境でのフレーム安定性が改善される。
入力負荷が高い環境での描画安定化
高リフレッシュレートディスプレイや高ポーリングマウスを使うテスト環境や開発機で、これまで発生していたマウス操作時のフレーム低下や大きなフレーム時間スパイクが軽減されるため、入力関連のデバッグやパフォーマンス評価がより再現性の高い条件で行えるようになる。特に非キャプチャ(カーソル表示)モードの挙動確認に関係する。
主な対象:GodotでWindows向けにインタラクティブな入力挙動を検証・開発する制作者、ハイリフレッシュ環境での動作検証を行う開発チーム
パフォーマンス検証・入力処理の見直しに組み込む場面
Windowsビルドで高ポーリングマウスを想定する場合、今回の修正を含むGodotバージョンを使用すればマウス移動が引き起こすフレーム低下が抑えられる。プロジェクト側ではInputEventMouseMotionを呼ぶコードパスの負荷を留意し、入力蓄積設定(デフォルト)や無効化時の呼び出し頻度を考慮する必要がある。
対処範囲と追加の注意点
今回の対応はWindowsのマウス入力処理に関するもので、ゲームパッドやその他入力デバイスの処理体系は別扱いのままである。プロジェクト側の_input()/_unhandled_input()内の処理最適化は依然として必要で、入力蓄積の設定によって呼び出し頻度が変わる点は注意が必要。
Godot Engine News:Fixing high polling rate mice on Windows in Godot
元情報公開日:2026年8月24日