簡體   English   中英

如何在運行SDL程序時降低CPU使用率?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM