循环中的SDL_GL_SwapBuffers()=冻结?

时间:2011-02-26 17:02:13

标签: c++ opengl buffer sdl freeze

我阅读了一些关于OpenGL的教程,现在我正在尝试将它与SDL一起使用。问题是,当我在while循环中使用SDL_GL_SwapBuffers()时,窗口就会冻结。这是一些代码:

#include "SDL.h"
#include "system.h"
#include "SDL_opengl.h"
System Sys(800, 600, 32);
SDL_Event kpress;
int main( int argc, char* args[] )
{
    Sys.init();
    bool quit = false;
    while (!quit)
    {
         while (SDL_PollEvent(&kpress)) if(kpress.type == SDL_QUIT) quit = true;
         glClear(GL_COLOR_BUFFER_BIT);
         SDL_GL_SwapBuffers();
    }
    SDL_Quit();
    return 0;
}

------------------------------These are in system.h, class System----------------
    bool System::init()
    {
        if (SDL_Init(SDL_INIT_EVERYTHING) < 0) 
        {
            errorCode = 1;
            return false;
        }
        if (SDL_SetVideoMode(screen_h, screen_w, bpp, SDL_OPENGL) == 0)
        {
            errorCode = 2;
            return false;
        }
        SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
        if (!init_GL())
        {
            errorCode = 3;
            return false;
        }
        SDL_WM_SetCaption("Engine", 0);
        return true;
    }
    bool System::init_GL()
    {
        glClearColor(1, 0, 0, 0);
        glClear(GL_COLOR_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, screen_h, screen_w, 0, -1, 1);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        if (glGetError() != GL_NO_ERROR) return false;
        return true;
    }

如果我绘制一些形状或使用计时器来限制FPS - 没有任何变化。 你有什么想法吗?

4 个答案:

答案 0 :(得分:3)

我的第一个建议:摆脱那个虚假的系统类:到目前为止,它所做的所有任务都是纯粹的顺序/程序性的,应该反映在程序大纲中。人们倾向于把所有东西都放到课堂上,因为他们被教导从对象模型的角度看待一切。但是这个System类必须遵循单例模式,在我看来,这是一种反模式。

您放在init_GL中的所有内容都属于渲染循环。创建渲染上下文后,OpenGL初始化结束。 OpenGL状态未初始化它按设置。 OpenGL 对象已初始化,但也可根据需要进行初始化。

你也没有正确使用glGetError。需要在循环中调用它,直到不再报告错误为止。因此,如果报告GL错误,则挽救也毫无意义。应将OpenGL错误视为诊断错误。

在调用SDL_GL_SetAttribute之前必须设置

SDL_SetVideoMode,这样你可能不会进行双重缓冲。

答案 1 :(得分:0)

嘿,你没有调用初始化OpenGL的函数:init_GL()

答案 2 :(得分:0)

你没有检查system :: init的结果 - 它可能在该函数中的某个地方失败而没有正确设置你的初始状态

答案 3 :(得分:0)

SDL #defines main()SDL_main(),允许它在程序启动前进行一些额外的初始化。您似乎绕过了静态初始化的类。

尝试在System中构建main()对象。