なぜ一部のハイエンドマウスを使うと非常にパフォーマンスが悪化するゲームが存在するのか
PCでゲームをプレイするには、「マウス」「キーボード」「ゲームパッド」という3種類の入力デバイスを使うのが主流ですが、Windowsで特定のハイエンドマウスを使用すると、非常に人気を集めるタイトルを含め一部のゲームでパフォーマンスが悪化します。なぜ問題が発生するのかについて、英雄伝説シリーズのPC版への移植などで有名なPH3 GmbHのピーター・デュランテ・トーマン氏が分析を行いました。
Things you really should know about Windows Input, but would rather not - Raw Mouse edition | PH3 Blog
https://ph3at.github.io/posts/Windows-Input/
Windowsでユーザーからの入力を受け取る方法で最も伝統的なのは、アプリケーションのメッセージキューに送信されるWindowsメッセージを受信することです。多くのWindowsアプリケーションがWindowsメッセージを通じてキーボードやマウスからの入力を受け取っていますが、Windowsメッセージを通すとユーザーのマウス操作がWindowsによって加速されるなどの調整を受けてしまう上、1ピクセル未満の精度も提供されず、ゲームへの入力には適していません。
そのため、マウスで3Dカメラを動かすゲームなどマウス入力が非常に大切なゲームでは「Raw Input API」が使用されます。Raw Input APIを使うことでマウスからの「生」の入力を受け取る事ができます。
Raw Input APIで入力を受け取る方法は2つ存在しており、1つはデバイスからの標準読み取りを使用して個々のイベントのメッセージを処理する方法で、もう1つはバッファに存在する全ての入力イベントをバッファ読み取りで取得する方法です。当然、別々のイベントを個別に処理するよりもバッファからまとめて読み取る方がパフォーマンスが向上します。
しかし、バッファ読み取りであっても、ポーリングレート、つまりマウスからデータが送信される頻度が8kHzのマウスを激しく動かすと下図のように一部のゲームでフレームレートが355から133になるほどパフォーマンスが悪化してしまいます。これは何も設定しない場合、システムがRaw Inputメッセージだけでなくレガシーメッセージも出力しており、レガシーメッセージがメッセージキューを埋めてしまうからとのこと。
レガシーメッセージを無効にすることはできますが、レガシーメッセージは「ゲームウィンドウの移動」などシステム側の処理で多数使用されており、レガシーメッセージを無効にしてしまうとそうした通常システムで行われるはずの処理を実装する必要が出てきてしまいます。
トーマン氏は多数検討を重ねた結果、「レガシーメッセージを有効にしたまま、実際のゲームへの入力にはバッファ読み取りを使用する。その上でフレームごとに処理するメッセージキューイベントを一定数に制限する」ことでこの問題を解決しました。大量のメッセージが蓄積された場合などの動作に不安があったものの、実際にテストしてみると特に問題が発生しなかったため不満足ながら当面の解決策にするとのこと。
「適切に行う方法を知っている場合は連絡が欲しい」と述べられています。
09/18 21:00
GIGAZINE