我想我的程序中有一個錯誤。我使用SDL和OpenGL來渲染動畫。該計劃還測量平均FPS。最後,當我運行該程序時,它將以大約550 FPS的速度運行。但是,如果我啓動該程序的第二個實例,則FPS的下降速度爲大約一半(220 FPS)。奇怪的是,如果我關閉第一個實例,第二個將仍然只能運行在220 FPS。這導致我相信我的清理代碼在某種程度上是有缺陷的。我的清理代碼有問題嗎? (OpenGL + SDL)
有時候,即使我運行一個實例,它也只能運行在220 FPS,可能是由於以前的實例無法正常清理。我的方法有什麼問題嗎?
我用一個screen
類具有下列職權範圍*:
namespace gfx
{
screen::screen(const settings& vs) : dbl_buf_(false), sdl_surface_(0)
{
if (SDL_Init(SDL_INIT_VIDEO) < 0)
throw util::exception(::std::string("Unable to initialize SDL video: ") + SDL_GetError());
if (!set(vs))
{
SDL_Quit();
throw util::exception("Unable to setup initial video mode.");
}
glewInit();
}
screen::~screen()
{
SDL_Quit();
}
bool screen::set(const settings& vs)
{
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
Uint32 flags = SDL_HWSURFACE | SDL_OPENGL;
if (vs.full_screen) flags |= SDL_FULLSCREEN;
sdl_surface_ = SDL_SetVideoMode(vs.size_x, vs.size_y, vs.bpp, flags);
if (!sdl_surface_) return false;
settings_ = vs;
int db_flag = 0;
SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &db_flag);
dbl_buf_ = (db_flag == 1);
return true;
}
// ...
}
另外:
int main()
{
try
{
gfx::settings vs = {800, 600, 32, false};
gfx::screen scr(vs);
// main app loop, render animation using OpenGL calls
// loop runs while running_ variable is true (see below)
}
// catch, etc.
return 0;
}
如果這有什麼差別,我使用Linux和ATI顯卡。
更新:事件處理代碼:
SDL_Event event;
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_KEYDOWN:
if (event.key.keysym.sym == SDLK_ESCAPE)
running_ = false;
break;
case SDL_QUIT:
running_ = false;
break;
default:
world_.process_event(event);
break;
}
}
'sdl_surface_'是一個指針嗎? –
是的,它是'SDL_Surface *'。 –
現在,你明確'malloc'這個結構?如果你這樣做,那麼你必須在你的dtor中調用'SDL_FreeSurface',否則你有內存泄漏。 –