Android/OUYA および PC 用の Java でマルチプラットフォーム (ただし OpenGL を優先) ゲーム エンジンを作成中ですが、ゲームパッドの状態をすばやく確認するときに、PC プラットフォーム アダプターで問題が発生します。
私は現在 LWJGL/JInput を使用して PC アダプターを書き込んでおり、ゲームパッドの状態を 1 秒あたり約 30 回よりも速くポーリングすると (ポーリングを実行して状態を更新するのに約 33ms かかります)、ゲームパッドから取得した値は false です。スティックが右半分にある可能性があるという意味では False ですが、getAxisValue は 1f のうち 0.5f に近い値ではなく 0 を返します。その上、より頻繁に実行するように求められた場合、そうでなければ問題ない 33ms よりも長くかかるようです。何を与える?
簡単に言えば、典型的な update 呼び出しで何が起こるかというと、エンジンはアクティブなプレイヤーのコントローラーをスキャンして、ゲームで実際に使用される特定のボタンの状態をスキャンし、すべて事前に設定および登録します。現時点では、私のテスト アプリでは、2 つのボタンと軸で構成されています。つまり、3 つの入力の現在の状態をチェックするだけで、それ以上はありません。インターフェイスのいくつかのレイヤーを通過してスイッチブロックに渡された後、最終的にこれが呼び出されます。
return controller.isButtonPressed(map.A);
また
return controller.getAxisValue(map.LS_H);
map には、指定されたコントローラーの特定のインデックス値に名前をリンクする最終的な int が含まれます。
私自身のテストでわかったこと:
- これはハードウェアの問題ではありません。1 秒あたりの更新が 30 ~ 35 未満の場合でもかなり正確なままです。
- グラフィックス スレッドの 60 fps レートに合わせて 1 秒あたり約 60 更新まで速度を上げると、入力スレッドのみで大きな遅延が発生します。グラフィックス スレッドは影響を受けていないため、一般的なパフォーマンスの問題でもないと思います。
- isButtonPressed または getAxisValue を任意のプリセット値に変更すると、更新の遅れの問題が解決されるため、断続的な停止の原因となっているのは私のコードではなく、間違いなく isButtonPressed と getAxisValue です。
ゲームパッド チェックの速度を改善する方法、または LWJGL/JInput を介した不要な入力ルーチンを無効にする、私が見逃した設定のどこかを改善する方法はありますか?
60 fps の一致は、パフォーマンスの点で要求するには多すぎますか?