2011-11-29 52 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'事件(更新:它,我檢查了) –