簡體   English   中英

我的清理代碼有問題嗎? (OpenGL + SDL)

[英]Is there something wrong with my cleanup code? (OpenGL + SDL)

我認為我的程序中有錯誤。 我使用SDL和OpenGL渲染動畫。 該程序還可以測量平均FPS。 最好,當我運行該程序時,它將以約550 FPS的速度運行。

但是,如果我啟動該程序的第二個實例,則兩者的FPS都會下降一半左右(220 FPS)。 奇怪的是,如果我關閉第一個實例,第二個實例仍將僅以220 FPS運行。 這使我相信我的清理代碼有缺陷。

有時,即使我運行一個實例,它也只能以220 FPS的速度運行,這可能是由於先前的實例無法正確清理造成的。 我下面的方法有什么問題嗎?

我使用的screen類具有以下* tor:

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

當進程終止時,它使用的所有資源都會自動釋放。 包括OpenGL。 可能發生的情況是,您不會終止過程,而只是通過單擊關閉按鈕來隱藏窗口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM