[英]How to keep the CPU usage down while running an SDL program?
我已經用SDL完成了一個非常基本的窗口,並希望它保持運行直到我按下窗口上的X.
#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;
}
我嘗試在while子句的末尾添加SDL_Delay()
並且它運行得很好。
但是,80毫秒似乎是我用來保持程序平穩運行的最高值,即使這樣,CPU使用率也只有15-20%。
這是最好的方法嗎?我必須忍受這樣一個事實:它已經在這一點上占用了這么多CPU嗎?
我肯定會試驗完全阻塞函數(例如SDL_WaitEvent
)。 我在Qt中有一個OpenGL應用程序,我注意到CPU使用率在0%和1%之間徘徊。 在“使用”期間(移動相機和/或引起動畫)它可能達到4%。
我正在開發自己的窗口工具包。 我注意到當我使用阻塞事件循環時,我可以實現類似的CPU使用率。 這將使您可能依賴的任何計時器復雜化,但使用這種新方法實現計時器並不是非常困難。
我知道這是一個較舊的帖子,但我自己剛剛在啟動一個小型演示項目時遇到了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;
}
我剛剛想出如何將游戲中的CPU使用率從50%降低到<10%。 你的程序要簡單得多,只需使用SDL_Delay()
即可。
我所做的是:在加載圖像時使用SDL_DisplayFormat()
,因此blitting會更快。 這使其CPU使用率降至約30%。
所以我發現blitting游戲背景(大單件.png文件)正在吃掉我的CPU。 我在互聯網上尋找解決方案,但我找到的只是相同的答案 - 只需使用SDL_Delay()
。 最后,我發現問題很簡單 - SDL_DisplayFormat()
將我的24位圖像轉換為32位。 所以我將顯示器BPP設置為24,這使CPU使用率達到~20%。 將它降低到16位解決了我的問題,現在CPU使用率低於10%。
當然這意味着顏色細節的損失,但由於我的游戲是一個簡單的2D游戲,沒有太詳細的圖形,這是可以的。
為了真正理解這一點,您需要了解線程。 在線程應用程序中,程序運行直到等待某事,然后它告訴操作系統可以運行其他東西。 實質上,您使用SDL_Delay
命令執行此SDL_Delay
。 如果沒有任何延遲,我懷疑你的程序將以接近100%的容量運行。
延遲語句中應該放入的時間僅在其他命令花費大量時間時才有意義。 一般來說,我會將延遲設置為測試輪詢命令所需的時間,但不超過10毫秒。 將會發生的事情是操作系統將至少等待那段時間,允許其他應用程序在后台運行。
至於你可以做些什么來改善這一點,好吧,看起來你可以做的事情並不多。 但是,請注意,如果有另一個進程正在運行占用大量CPU功率,則程序的份額會減少。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.