2011-11-29 1 views
0

내 프로그램에 버그가 있다고 생각합니다. SDL과 OpenGL을 사용하여 애니메이션을 렌더링합니다. 이 프로그램은 또한 평균 FPS를 측정합니다. 팁 적으로 프로그램을 실행하면 약 550FPS에서 실행됩니다.내 정리 코드에 문제가 있습니까? (OpenGL + SDL)

그러나 프로그램의 두 번째 인스턴스를 시작하면 FPS는 둘 다 약 절반 (220FPS)으로 떨어집니다. 이상한 점은 첫 번째 인스턴스를 닫으면 두 번째 인스턴스는 여전히 220FPS 만 실행된다는 것입니다. 이것은 내 정리 코드가 어떻게 든 결함이 있다고 믿게한다.

경우에 따라 단일 인스턴스를 실행하더라도 이전에 제대로 정리하지 못한 인스턴스로 인해 220fps로만 실행되는 경우가 있습니다. 내 접근 방식에 문제가 있습니까? 그것은 어떤 차이가있는 경우,

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; 
} 

나는 리눅스와 ATI 카드를 사용 또한

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; 
    } 

    // ... 
} 

:

나는 다음과 같은 *의 tors이있는 screen 클래스를 사용합니다.

업데이트 : 이벤트 처리 코드 :

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 이벤트가 발생합니다 (업데이트 : 확인 됨) –