Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SDL_渲染器使用100%CPU和gig RAM,什么都不做_C++_Memory_Sdl_Sdl 2_Render To Texture - Fatal编程技术网

C++ SDL_渲染器使用100%CPU和gig RAM,什么都不做

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

我正在用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* 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无关。