非常に速いジョイスティックボタンの押下を検出しますか?


7

通常、ゲームエンジンがボタンを検出する時間がないように、プレーヤーが1つのフレーム内でボタンを押して離すことは可能ですか?

プログラマは通常、この状況をどのように処理しますか?それを処理することさえ必要ですか?

テスト中、約14または15ミリ秒(1クリック/フレーム以上)以内にボタンを押して離すことができました。しかし、ジョイスティックを通常の状態で保持している間は、これを行うことができませんでした。また、プレスリリースサイクルは、フレームが開始するほぼ正確な時間に開始する必要があります。

具体的には、GLFWのジョイスティック入力機能についてお伺いします。

私は現在GLFWを使用してゲームを作成しています。キーボードとマウスにはコールバック関数があるのに、ジョイスティックにはないことに気付きました。また、ジョイスティックの「スティッキーキー」を有効にできないようです。(私はGLFWの使用を始めたばかりなので、間違っている場合は修正してください。どちらかを使用すると問題が解決します。)

私はGLFWについて質問していますが、ライブラリ/エンジン/言語に関連する回答は大歓迎です。

回答:


7

ニンテンドーとソニーのハードウェアでは、フレームを描画するよりも高いレートで入力をポーリングすることがありました。タイマー駆動のスレッドを使用して、たとえば、30Hzでレンダリングしているときでも、120HzのコントローラーI / Oを確認します。「タイマー駆動スレッド」とは、特定の関数をリアルタイムで呼び出させる割り込みを発生させるハードウェアタイマーがあったことを意味します。これらのシステムでは、コントローラーはメモリマップI / Oとして表示されたため、特定のメモリ位置からワードをロードするだけで、その瞬間のジョイスティックのX軸の位置がわかります。これをメインメモリのどこかに保存し、メインゲームループが実行されると、4または8の履歴、または一定の時間間隔での入力データのサンプル数を記録します。

これは、ボタンマッシュを検出するためではなく、重要な場所でゲームを戦うために鮮明なフレーム内タイミングを得るためです(アニメーションの重要なトリガーフレームの「前」に入力をキューに入れることが許可されていたため、アニメーションレートが好きなように安定しているので、ボタンを押すのがフレーム境界の前かボタンかを区別する必要がありました)。

GFWLでそれが可能かどうかはわかりません。DirectXの入力システムはレンダーサイクルにかなり緊密にバインドされており、USBゲームパッドのスイッチとユーザーの間には多くのオペレーティングシステムが存在します。


これは、これまでに見た中で最高のソリューションです。私の知る限り、少なくともWindowsでは、ジョイスティックの入力はレンダリングシステムに一切関連付けられていません。デフォルトでは、フレームごとに1回(バッファーをスワップするときに)入力をポーリングしていますが、これをスレッドに移動することは確かに可能です。
りんご

2

よろしいですか?あちこちで状態遷移がそれほど速く進んでいるのを見ることはできますが、ボタンが14ミリ秒ごとに表示されるのに1秒あたり70回の持続的な押し込みが必要であることをご存知でしょうか。申し訳ありませんが、物理的には可能ではありませんが、クレイジーなオールナックルボタンマッシュであちこちに誘導でき、ハードウェア自体にもバウンスがある可能性があります。プロのStarCraftプレーヤーのビデオを見たことがありますか。彼らは片手ですべての指とマウスを使い、クリックするとぼやけてしまいます。彼らが両手を使って毎秒5である毎 300のアクションを実行できるなら、それらの人は神です...

とはいえ、一般的に、多くのゲームでは、フレームごとにポーリングされた入力が表示されます。フレーム内でプレスリリースプレス全体が発生して失われる可能性は、インタラクティブフレームレートではかなり遠く、ゲーム開発者がこれについて心配することはありません。

一部のシステムでは、入力がバッファリングされる場合があります。システムは入力デバイスを非同期で監視し、最後のクエリ以降に発生したすべての状態変化をキューに入れます。通常、フレーム間でバッファーをいっぱいにして各フレームで処理するため、ポーリングよりも解像度が高くなる可能性があります。各フレームの状態。

一部のシステムはイベント駆動型であるため、入力状態が変化するたびに起動するコールバックを登録できますが、解像度はソフトウェアスタックの残りの部分に依存し、フレームごとのチェックよりもはるかに優れている場合とそうでない場合があります。たとえば、APIがフレームごとにハードウェアをポーリングし、それを最後のフレームと比較して、適切なコールバックを起動するだけの場合、それ以上のことはありません。

組み込みシステムと金属にプログラムされたいくつかの古いゲームシステムでは、ボタンの割り込みがあったはずです。割り込みは、何かが発生するたびに実行されるシステムに登録する小さなコードです。ボタン割り込みの場合、ハードウェアは、ボタンに接続されたワイヤーの電圧が低から高、または高から低に変化したときに、このコードのビットを実行するように物理的に設計されます。これは最も直接的で応答性の高いシステムですが、最近のほとんどのゲームでは、ユーザーとボタンの間に大量のハードウェアとソフトウェアがあります。


1
私はあなたの言っていることに同意しますが、この状況では、1秒あたりの平均プレス数は、シングルタップの持続時間ほど重要ではありません。たとえば、私のテストでは、平均タップ時間(ボタンが「ダウン」状態であった時間で測定)は約50ミリ秒でした。ただし、ボタンが「リリース」状態にある平均時間は約150ミリ秒だったので、1秒あたり20回ボタンを押していたという意味ではありません。これは、1秒あたり平均60タップを維持するよりも、1つのフレームでボタンを押して離す方がはるかに簡単であることを示しています。
りんご

なるほど、分かりました。これは、クラッシュワークスが格闘ゲームで議論した状況と同様に、イベントの高解像度のタイミングが重要であるという意味で理にかなっています。これがあなたの問題になる可能性があることは間違いなく理解しており、おそらく彼が提案したように非同期入力サンプリングを実行したいと考えています。
サブオプティマス

0

ゲームが60 fpsで実行されていると仮定すると、各フレームは約17ミリ秒です。その時間内に誰かが押したり離したりする可能性はほとんどありません。1秒あたり約60回のクリックを取得するのに十分な速さでクリックできる場合、フレームを打つのに十分な速さで押して離します。


これは本当ですが、それが発生する可能性のあるいくつかのエッジケースをまだ見ることができます。おそらく、ユーザーが誤ってボタンを押したときに、誤ってボタンを押したり、不正なツールを使用したりする可能性があるため、これについては心配しないでください。しかし、私はまだ問題の解決策を探しています。
りんご

プロのゲームはこれを処理するために特別なことは何もせず、人々が不平を言うのは聞こえません。人間はそれほど速くボタンを押すことはできません。
Sean Middleditch

2
@DBRalir入力をポーリングしている場合、これを検出する方法はありません。プログラムに関する限り、これは発生しなかったためです。この非常にまれなエッジケースよりも、注意すべき重要な点があります。
MichaelHouse

@ Byte56ええ、私はそれを無視しています。私は定期的に15ミリ秒未満のタップ時間を取得できますが、通常はポーリングルーチンと重複します。プログラムが完全にタップを逃すには、約7 ms続く必要がありますが、これは不可能のようです。ご回答有難うございます。
りんご

聞いてよかった。ゲームのペースが速いようです。それは楽しいでしょう。それで頑張ってください:)
MichaelHouse
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.