【问题标题】:Is there something wrong with my cleanup code? (OpenGL + SDL)我的清理代码有问题吗? (OpenGL + SDL)
【发布时间】:2011-11-29 19:40:27
【问题描述】:

我认为我的程序中有错误。我使用 SDL 和 OpenGL 来渲染动画。该程序还测量平均 FPS。通常,当我运行程序时,它会以大约 550 FPS 的速度运行。

但是,如果我启动该程序的第二个实例,则两者的 FPS 都会下降大约一半 (220 FPS)。奇怪的是,如果我关闭第一个实例,第二个实例仍将以 220 FPS 运行。这让我相信我的清理代码存在某种缺陷。

有时,即使我运行单个实例,它也只能以 220 FPS 运行,这可能是由于之前的实例未能正确清理。我下面的方法有问题吗?

我使用 screen 类,它具有以下 *tors:

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

【问题讨论】:

  • 现在,你明确malloc这个结构吗?如果你这样做了,那么你必须在你的 dtor 中调用SDL_FreeSurface,否则你有内存泄漏。
  • 我使用SDL_SetVideoMode来初始化它。根据 SDL 文档,这样初始化的表面会被 SDL_Quit 自动释放。
  • 好的,很好。只是想确保您没有泄漏。
  • 我在问题中添加了set 方法,以获取更多信息。
  • 不应该在codereview.stackexchange.com上吗?

标签: c++ opengl sdl raii


【解决方案1】:

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

【讨论】:

  • 这当然很奇怪,因为我检查了ps 并且该过程显然终止了。我将更新问题以显示用于终止应用程序的事件处理代码。
  • 如果我没记错的话,点击关闭按钮应该会触发SDL_QUIT事件(更新:确实如此,我检查过)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 2012-08-28
  • 2012-02-26
  • 1970-01-01
  • 2013-06-06
相关资源
最近更新 更多