我已经使用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-clause的末尾添加SDL_Delay()
并且效果很好。
然而,80毫秒似乎是我可以用来保持程序平稳运行的最高值,即使CPU使用率约为15-20%。
这是最好的方法吗?我必须忍受这样一个事实:它已经在这一点上占用了这么多CPU吗?
答案 0 :(得分:8)
我肯定会尝试使用完全阻止功能(例如SDL_WaitEvent
)。我在Qt中有一个OpenGL应用程序,我注意到CPU使用率在0%和1%之间徘徊。在“使用”期间(移动相机和/或引起动画)它可能达到4%。
我正在开发自己的窗口工具包。我注意到当我使用阻塞事件循环时,我可以实现类似的CPU使用率。这会使您可能依赖的任何计时器复杂化,但使用这种新方法实现计时器并不是非常困难。
答案 1 :(得分:7)
我刚刚想出如何将游戏中的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游戏,并没有太详细的图形,所以没关系。
答案 2 :(得分:7)
我知道这是一篇较旧的帖子,但我自己刚刚在启动一个小型演示项目时遇到了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;
}
答案 3 :(得分:3)
为了真正理解这一点,您需要了解线程。在线程应用程序中,程序运行直到等待某事,然后它告诉操作系统可以运行其他东西。实质上,您使用SDL_Delay
命令执行此操作。如果没有任何延迟,我怀疑你的程序将以接近100%的容量运行。
只有在其他命令花费大量时间的情况下,您应该在延迟语句中放入的时间才有意义。一般来说,我会将延迟设置为测试轮询命令所需的时间,但不超过10毫秒。将会发生的事情是操作系统将至少等待那段时间,允许其他应用程序在后台运行。
至于你可以做些什么来改善这一点,好吧,看起来你可以做的事情并不多。但是,请注意,如果有另一个进程正在运行占用大量CPU功率,则程序的份额会减少。