2012-10-07 50 views
4

我已經使用SDL完成了一個非常基本的窗口,並希望保持它運行,直到我按下窗口上的X.如何在運行SDL程序時保持CPU使用率降低?

#include "SDL.h" 
const int SCREEN_WIDTH = 640; 
const int SCREEN_HEIGHT = 480; 

int main(int argc, char **argv) 
{ 
    SDL_Init(SDL_INIT_VIDEO); 
    SDL_Surface* screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 0, 
              SDL_HWSURFACE | SDL_DOUBLEBUF); 
    SDL_WM_SetCaption("SDL Test", 0); 
    SDL_Event event; 
    bool quit = false; 
    while (quit != false) 
    { 
     if (SDL_PollEvent(&event)) { 
      if (event.type == SDL_QUIT) { 
       quit = true; 
      } 
     } 
     SDL_Delay(80); 
    } 
    SDL_Quit(); 
    return 0; 
} 

我試圖在同時子句的末尾添加SDL_Delay()和它的工作非常好。

但是,80 ms似乎是我可以用來保持程序平穩運行的最高值,即使此時CPU使用率大約爲15-20%。

這是做到這一點的最佳方式,我必須忍受它已經在這一點上吃了這麼多的CPU的事實嗎?

回答

8

我肯定會嘗試完全阻止功能(如SDL_WaitEvent)。我在Qt中有一個OpenGL應用程序,並且我注意到CPU使用率在0%和1%之間徘徊。在「使用」(移動相機和/或製作動畫)期間,它可能高達4%。

我正在開發自己的窗口工具包。我注意到當我使用阻塞事件循環時,我可以達到類似的CPU使用率。這會使任何你可能依賴的定時器變得複雜,但用這種新方法實現定時器並不是很困難。

3

爲了真正理解這一點,您需要了解線程。在一個線程應用程序中,程序運行直到它等待某個東西,然後它告訴操作系統其他東西可以運行。實質上,您正在使用SDL_Delay命令執行此操作。如果沒有任何延遲,我懷疑你的程序將以接近100%的容量運行。

如果其他命令花費了大量時間,則應將延遲語句放入的時間量非常重要。通常,我會將延遲時間設置爲測試輪詢命令的時間,但不會超過10毫秒。會發生什麼是操作系統將至少等待這段時間,允許其他應用程序在後臺運行。

至於你可以做些什麼來改善這一點,好吧,看起來你沒有太多可以做的事情。但是,請注意,如果有另一個進程正在運行佔用大量CPU能力,那麼程序的份額將會減少。

+0

SDL中只使用一個線程是否正常?你有['SDL_PushEvent'](http://www.libsdl.org/cgi/docwiki.cgi/SDL_PushEvent)和['SDL_AddTimer'](http://www.libsdl.org/cgi/docwiki.cgi/SDL_AddTimer ),那麼爲什麼不去多線程? – dyp

+0

使用10 ms可使CPU使用率接近60%。我很好奇GTK如何管理它,因爲創建類似的虛擬窗口並不會影響CPU使用率。 – budwiser

+0

@DyP即使程序沒有線程化,操作系統也是如此。操作系統負責測量CPU使用率,因此報告的數據會高於其他數據。 – PearsonArtPhoto

7

我剛纔想出瞭如何在我的遊戲中將CPU使用率從50%降低到< 10%。 你的程序要簡單得多,只需使用SDL_Delay()就足夠了。

我做的是: 加載圖像時使用SDL_DisplayFormat(),所以blitting會更快。這使其CPU使用率降至約30%。

因此,我發現傳輸遊戲背景(大的單件.png文件)最大限度地利用了我的CPU。我在網上搜索了一個解決方案,但是我找到的所有答案都是相同的答案 - 只需使用SDL_Delay()即可。最後,我發現問題很簡單 - SDL_DisplayFormat()正在將我的24位圖像轉換爲32位。所以我將顯示器BPP設置爲24,這使得CPU使用率達到〜20%。把它降到16位解決了我的問題,現在CPU使用率還不到10%。

當然這意味着顏色細節的喪失,但是由於我的遊戲是一個簡單的2D遊戲,並沒有太詳細的圖形,所以這是可以的。

3

我知道這是一個較舊的帖子,但是我自己剛剛在SDL啓動一個小演示項目時遇到了這個問題。與用戶'thebuzzsaw'一樣,最好的解決方案是使用SDL_WaitEvent來減少事件循環的CPU使用率。

下面是你的例子中看起來如何爲將來尋找快速解決方案的任何人。希望能幫助到你!

#include "SDL.h" 
const int SCREEN_WIDTH = 640; 
const int SCREEN_HEIGHT = 480; 

int main(int argc, char **argv) 
{ 
    SDL_Init(SDL_INIT_VIDEO); 
    SDL_Surface* screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 0, 
              SDL_HWSURFACE | SDL_DOUBLEBUF); 
    SDL_WM_SetCaption("SDL Test", 0); 
    SDL_Event event; 
    bool quit = false; 
    while (quit != false) 
    { 
     if (SDL_WaitEvent(&event) != 0) { 
      switch (event.type) { 
      case SDL_QUIT: 
      quit = true; 
      break; 
      } 
     } 
    } 
    SDL_Quit(); 
    return 0; 
} 
相關問題