C++ SDL_渲染器使用100%CPU和gig RAM,什么都不做
我正在用SDL2做一个游戏,很快在游戏中占用了太多的内存,以至于无法完成。我精简了代码,发现即使是这个毫无意义的一个文件程序也使用了我100%的CPU和一兆内存C++ SDL_渲染器使用100%CPU和gig RAM,什么都不做,c++,memory,sdl,sdl-2,render-to-texture,C++,Memory,Sdl,Sdl 2,Render To Texture,我正在用SDL2做一个游戏,很快在游戏中占用了太多的内存,以至于无法完成。我精简了代码,发现即使是这个毫无意义的一个文件程序也使用了我100%的CPU和一兆内存 #include "SDL.h" #include "SDL_image.h" #include <cassert> const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; SDL_Renderer* gRenderer; SDL_Window* gWin
#include "SDL.h"
#include "SDL_image.h"
#include <cassert>
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
SDL_Renderer* gRenderer;
SDL_Window* gWindow;
void init();
void close();
int main()
{
init();
SDL_Event e;
bool quit;
while( !quit )
{
while( SDL_PollEvent( &e ) != 0 )
{
if( e.type == SDL_QUIT )
quit = true;
}
}
close();
}
void init()
{
assert( SDL_Init( SDL_INIT_EVERYTHING ) >= 0 );
gWindow = SDL_CreateWindow( "Space", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH,
SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
assert( gWindow );
gRenderer = SDL_CreateRenderer( gWindow, -1, SDL_RENDERER_ACCELERATED );
assert( gRenderer );
int imgFlags = IMG_INIT_PNG;
assert( IMG_Init( imgFlags ) & imgFlags );
SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
}
void close()
{
SDL_DestroyRenderer( gRenderer );
SDL_DestroyWindow( gWindow );
IMG_Quit();
SDL_Quit();
}
您正在以尽可能快的速度运行程序,因此它正在使用它所能获得的所有资源
尝试限制FPS。
使用断言可以使用大量RAM,也许你应该考虑不使用这些。尝试一个简单的if来测试您的初始化
编辑:看来RAM问题并不是由此产生的。很抱歉回答不好正如Ivan已经提到的,您应该尝试限制程序的FPS。 一种方法是使用SDL_GetTicks来测量持续时间,如果足够快,则使用SDL_延迟。这样一来,现代计算机将大部分时间处于睡眠状态,而不好的计算机仍能获得良好的帧速率:
while(running) {
auto time = SDL_GetTicks();
// Rendering and event handling
if ((SDL_GetTicks() - time) < 10) {
SDL_Delay(10);
}
}
您应该稍微使用示例中的数字10和10,以查看您的程序需要多少FPS。这是推荐的使用SDL的方法。您不希望发生的具体情况是什么?不要只列出你观察到的一切:说出你期望发生的事情,然后问为什么它没有按你期望的方式发生。上面的问题毫无疑问,好吧,这个程序除了启动SDL和循环外,实际上什么都不做,但是它占用了我100%的CPU和超过1GB的RAM。再加一点,程序就会完全停止。我在两台电脑上测试了它,一台装有i7处理器。这个简单的程序不应该有这种影响,我想知道为什么会有这种影响。注意:该程序还启动渲染器。如果呈现程序不工作,则不会出现此问题。相关:。一旦你开始做一些有意义的事情,比如渲染一个场景,你应该得到反映现实的数字。现在你只需要一个hello,world设置,它不够重,无法显示真实的数字。这听起来很可疑。你有参考资料吗?我没有参考资料,但我用assert检查初始化我的SDL2训练,运行它需要很多ram~380mo。。。我已经用简单的if==NULL条件替换了assert,我知道这不是完全的错误检查,但它适用于大多数主要问题,我的prog现在只使用7.8mo。。。如果有人能解释为什么…我已经尝试重新使用assert,我的程序不会再正常工作了。。。我无法解释为什么。。。很抱歉回答不好。我想是这样的。是的,测试了一下,它每秒运行超过410000帧。我把它硬限制在60帧,它解决了这个问题。谢谢你和用户3684240的帮助。我听说星际争霸2在菜单上也有同样的错误。但与SDL无关。