SDL_Renderer 使用 100% CPU 和 RAM 什么都不做

SDL_Renderer using 100% CPU and a gig of RAM to do nothing

我正在用 SDL2 制作游戏,不久游戏就占用了太多 RAM 甚至无法关闭。我剥离了代码,发现即使是这个毫无意义的文件程序也使用了我 100% 的 CPU 和一大块 RAM。

#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。

使用断言会占用大量内存,也许你应该考虑不使用这些。尝试一个简单的 if 来测试你的初始化。

编辑:看来 RAM 问题并非由此而来。抱歉回答不好

正如 Ivan 已经提到的,您应该尝试限制程序的 FPS。 一种方法是使用 SDL_GetTicks 测量持续时间,然后在速度足够快时使用 SDL_Delay。这样,现代计算机大部分时间都会休眠,而较差的计算机仍会获得良好的帧率:

while(running) {
  auto time = SDL_GetTicks();
  // Rendering and event handling
  if ((SDL_GetTicks() - time) < 10) {
    SDL_Delay(10);
  }
}

您应该稍微玩弄一下数字(示例中的 10 和 10),以了解您的程序需要多少 FPS。