10

我已经使用 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;
}

我尝试SDL_Delay()在 while 子句的末尾添加,效果很好。

然而,80 毫秒似乎是我可以用来保持程序平稳运行的最高值,即使如此,CPU 使用率也约为 15-20%。

这是做到这一点的最好方法吗?我是否必须忍受它已经在这一点上吃掉这么多 CPU 的事实?

4

4 回答 4

16

我知道这是一篇较旧的帖子,但我自己在启动一个小演示项目时遇到了 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;
}
于 2015-05-06T22:13:11.907 回答
12

我肯定会尝试完全阻塞的功能(例如SDL_WaitEvent)。我在 Qt 中有一个 OpenGL 应用程序,我注意到 CPU 使用率徘徊在 0% 和 1% 之间。在“使用”期间(移动相机和/或产生动画),它可能会飙升至 4%。

我正在开发自己的窗口工具包。我注意到当我使用阻塞事件循环时,我可以达到类似的 CPU 使用率。这将使您可能依赖的任何计时器变得复杂,但使用这种新方法实现计时器并不是非常困难。

于 2012-10-07T17:09:51.730 回答
7

我刚刚想出了如何将游戏中的 CPU 使用率从 50% 降低到 < 10%。您的程序要简单得多,简单地使用SDL_Delay()就足够了。

我所做的是:SDL_DisplayFormat()在加载图像时使用,因此 blitting 会更快。这使其 CPU 使用率下降到大约 30%。

所以我发现对游戏背景(大的一体式 .png 文件)进行 blitting 占用了我的 CPU 资源。我在互联网上搜索了一个解决方案,但我发现的都是相同的答案 - 只需使用SDL_Delay(). 最后,我发现问题非常简单——SDL_DisplayFormat()将我的 24 位图像转换为 32 位。所以我将我的显示 BPP 设置为 24,这使 CPU 使用率达到了 ~20%。将它降低到 16 位解决了我的问题,现在 CPU 使用率低于 10%。

当然,这意味着色彩细节的损失,但由于我的游戏是一个简单的 2D 游戏,没有太详细的图形,这没关系。

于 2012-12-01T12:57:03.720 回答
3

为了真正理解这一点,您需要了解线程。在线程应用程序中,程序一直运行到它正在等待某个东西,然后它告诉操作系统其他东西可以运行。本质上,您正在使用SDL_Delay命令执行此操作。如果完全没有延迟,我怀疑您的程序将以接近 100% 的容量运行。

仅当其他命令花费大量时间时,您应该在延迟语句中放置的时间量才重要。一般来说,我会将延迟设置为与测试 poll 命令所需的时间类似,但不超过 10 毫秒。将会发生的情况是操作系统将至少等待该时间长度,从而允许其他应用程序在后台运行。

至于您可以做些什么来改善这一点,好吧,看起来您可以做的并不多。但是,请注意,如果有另一个进程正在运行,占用大量 CPU 资源,您的程序的份额将会减少。

于 2012-10-07T15:36:16.877 回答