내 프로그램에 버그가 있다고 생각합니다. 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;
}
}
'sdl_surface_'는 (는) 포인터입니까? –
예,'SDL_Surface *'입니다. –
자,이 구조체를 명시 적으로'malloc'합니까? 만약 그렇다면 dtor에서'SDL_FreeSurface'를 호출해야합니다. 그렇지 않으면 메모리 누수가 있습니다. –