2014-02-20 34 views
0

這裏是SDL2代碼的一部分SDL_PollEvent深入

SDL主要功能

int main(int argc,char *argv[]) 
{ 
    ... 
    ... 
    bool quit=false; 
    SDL_Event e; 
    while(!quit) ///First while (say) 
    { 
      while(SDL_PollEvent(&e)) ///Second while (say) 
      { 
       if(e.type==SDL_QUIT) 
       { 
        quit=true; 
       } 
       handleEvent(e) ;///Function for executing certain event 
      } 

      ... 
      SDL_RenderPresent((SDL_Renderer)renderer); 
    } 

    } 

我的問題是,這是什麼SDL_PollEvent()實際上做的,假設一個事件發生並執行超出第二個while()並調用SDL_RenderPresent()或者它等待所有的事件進行輪詢,然後調用SDL_RenderPresent(),我完全困惑?

回答

2

上面是一個非常普遍的單個線程的事件循環:

基本上應用正在不斷外while循環中。爲了獲得最流暢的用戶體驗,我們嘗試將此循環保持在17ms以下(對於每秒60幀的速率)

每個「幀」都是通過響應隊列中等待的所有事件(內部while)開始的:

 while(SDL_PollEvent(&e)) ///Second while (say) 
     { 
      if(e.type==SDL_QUIT) 
      { 
       quit=true; 
      } 
      handleEvent(e) ;///Function for executing certain event 
     } 

事件是操作系統發出的事件通知。可能是該窗口正在關閉SDL_QUIT或鼠標已移動。 您必須對這些事件做出響應才能使應用程序響應。通常情況下,響應是更改應用程序的狀態。

例如,我們可能會看到一個鼠標左鍵情況下,我們可能會發現什麼是鼠標鍵「不滿」,表示它現在選擇。這通常只是找到對象並調用一個將改變其狀態的函數。所有這些變化都是布爾值,表示現在選中的對象。

也許移動鼠標需要改變下一幀的視角,所以我們將更新存儲我們正在查看的方向的矢量。所以我們更新內存中的向量。

在事件隊列爲空且應用程序沒有任何要處理的事件的情況下,您可能會有很長的延伸。並且可能會出現一些活動(例如,用戶移動鼠標),您將在其中獲得許多響應的事件。

SDL_PollEvent不會「等待」事件。如果隊列中有事件,您將獲得信息。如果沒有事件,它將返回false。
處理事件應該儘快完成(記住我們必須在17ms內完成)不用擔心在PC上相當長的時間。

一旦完成所有事件並退出內部循環,就可以開始更新世界和渲染了。 在這一點上,你通常會做像AI這樣的東西。調用物理引擎。例如,你可以迭代對象並根據它們的速度改變它們的位置。

下一步是實際進行繪圖。

 SDL_RenderClear(renderer); 
     ... 
     SDL_RenderPresent((SDL_Renderer)renderer); 

第一次通話將清除屏幕。然後,您將根據不同對象的狀態進行渲染。例如,也許因爲我們將對象狀態更改爲選中狀態,現在我們將圍繞它繪製一個發光的邊框。

您的最終調用對於SDL_RenderPresent(渲染)提出新的屏幕給用戶

如果使用垂直同步(很常見的),那麼這最後的通話將隱藏一個小的等待時間,以同步屏幕更新顯卡功能。這會產生更平滑的圖形。假設一個60Hz刷新率(每秒60幀),並假設你在16.6毫秒運行在你的框架呈現邏輯應用程序將等待的剩餘時間。現在

的應用程序已經準備好回到循環的開始,並檢查是否有SDL_PollEvent任何事件。由於整個循環通常只需要幾毫秒,因此應用程序總是會感覺到響應。

+0

這是否意味着此,假設我要執行這個第二內側10個事件,而循環,這些事件將被存儲在事件隊列和相應的框架製成,在裏面是空的SDL_PollEvent(11日事件)將返回FALSE和熄滅第二個while循環和所有十幀都在SDL_RenderPresent()上呈現在屏幕上,它是否像這樣工作? – user2971474

+0

我更新了答案,試圖解釋 – odedsh

+0

你不「執行」事件..你迴應他們。它們表明操作系統中發生了某些事情(窗口大小調整/鼠標移動)。 如果你不迴應他們的應用程序會顯得反應遲鈍。一旦你對所有人作出迴應,你就回到繪製下一個框架 – odedsh