繁体   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