これは、SDLとはまったく関係ありません。 SDLはPeekMessageのような関数のラッパーであり、SDLはこれらの基本的なプラットフォーム固有の関数よりも解像度の高いイベントを返すことができません。実際のハードウェアポーリングレートはOSによって管理され、10ms未満、時には1ms未満となることがあります。
SDL_PollEvent
は実際にハードウェアをポーリングしないので、この名前はやや誤解を招く可能性があります。代わりに、ハードウェアポーリングはオペレーティングシステムの機能の通常の部分としてバックグラウンドで継続的に発生します。 SDL_PumpEvents
は、イベントをOSイベントキューからSDLイベントキューに移動します。 SDL_PollEvent
は、イベントをSDLイベントキューから自分のアプリケーションに移動します。実際のハードウェアをポーリングするのではなく、SDL_PollEvent
をOSキューをポーリングすると考えてください。
ここでの問題は誤解のようです。 SDL_KEYDOWN
イベントは、キーがであることを意味するものではなく、キーがになったか、または「繰り返している」ことを意味します。リピート率はOSのコントロールパネルで設定できます。だから私は、キーを押した場合は、それを保持し、それを解放し、私はこのような一連のイベントを取得します:
SDL_KEYDOWN pressed the key
SDL_KEYDOWN repeat #1, after the repeat delay
SDL_KEYDOWN repeat #2, quickly afterwards
SDL_KEYDOWN repeat #3, quickly
... ...
SDL_KEYUP released the key
あなたはこのような何かをしたいでしょう:
switch (event.type) {
case SDL_KEYDOWN:
key_pressed = true;
break;
case SDL_KEYUP:
key_pressed = false;
break;
}
それともできます代わりにSDL_GetKeyboardStateを使用してください。
実際にポーリングが行われていますか?ほとんどのOSでちょっと奇妙だと思われます... –
@MartinJames私はあなたの言いたいことが分かりません。 「50ms」はOSが入力をポーリングする頻度です。 「50ms」はかなり大きいようだ。 60fpsでは、3つのフレームごとに新しい入力が得られます。 –