這與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。
有實際投票?在大多數操作系統似乎有點奇怪... –
@MartinJames我不知道你想說什麼。你是說'50ms'是我的操作系統輪詢輸入的頻率? '50ms'雖然看起來相當大。在60fps時,我只會每3幀獲得一次新的輸入。 –