2016-05-16 11 views
0

SDL2は約50msで入力をポーリングするように見えます。例えばSDL2のみが50msごとに入力をポーリングするようです。

私はこのようなイベントをポーリングしている場合は、入力ベクトルは、いくつかのフレームのために、実際に空であることを私のメインループ

SDL_Event event; 
while(SDL_PollEvent(&event)){ 
    if(event.type == SDL_KEYDOWN || event.type == SDL_KEYUP){ 
     inputs.push_back(...); 
    } 
} 

です。私がメインループにSDL_Delay(50)を使用するときだけ、空の入力ベクトルを避けることができます。

SDL2に入力を50msより速く更新させることはできますか?

+0

実際にポーリングが行われていますか?ほとんどのOSでちょっと奇妙だと思われます... –

+0

@MartinJames私はあなたの言いたいことが分かりません。 「50ms」はOSが入力をポーリングする頻度です。 「50ms」はかなり大きいようだ。 60fpsでは、3つのフレームごとに新しい入力が得られます。 –

答えて

5

これは、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を使用してください。

関連する問題