2016-05-16 49 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

有實際投票?在大多數操作系統似乎有點奇怪... –

+0

@MartinJames我不知道你想說什麼。你是說'50ms'是我的操作系統輪詢輸入的頻率? '50ms'雖然看起來相當大。在60fps時,我只會每3幀獲得一次新的輸入。 –

回答

5

這與SDL完全沒有任何關係。 SDL是圍繞像PeekMessage這樣的函數的封裝,並且SDL無法以比這些底層平臺特定的功能更高的分辨率返回事件。實際的硬件輪詢速率將由操作系統管理,通常低於10ms,有時低至1ms。

名字可能有點誤導,因爲SDL_PollEvent實際上並不民調硬件。相反,硬件輪詢會在後臺作爲您操作系統功能的正常組成部分持續發生。 SDL_PumpEvents將事件從OS事件隊列移至SDL事件隊列。 SDL_PollEvent將事件從SDL事件隊列移至您自己的應用程序。所以想想SDL_PollEvent輪詢OS隊列,而不是輪詢你的實際硬件。

它看起來像這裏的問題是一種誤解。該SDL_KEYDOWN事件並不意味着關鍵下來,這意味着關鍵成爲關閉或「重複」。重複速率可配置您的操作系統的控制面板。所以,如果我按一個鍵,按住它,然後鬆開,我會得到這樣的一系列事件:

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