2011-11-29 27 views
0

我想我的程序中有一个错误。我使用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; 
    } 
} 
+0

'sdl_surface_'是一个指针吗? –

+0

是的,它是'SDL_Surface *'。 –

+0

现在,你明确'malloc'这个结构?如果你这样做,那么你必须在你的dtor中调用'SDL_FreeSurface',否则你有内存泄漏。 –

回答

0

进程终止时它使用的自动释放的所有资源。这包括OpenGL。可能发生的情况是,您并未终止您的流程,而只是通过点击关闭按钮来隐藏窗口。

+0

这确实很奇怪,因为我用'ps'进行了检查,并且过程明显终止。我将更新问题以显示用于终止应用程序的事件处理代码。 –

+0

如果我没有弄错,点击关闭按钮应该触发'SDL_QUIT'事件(更新:它,我检查了) –