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