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