我需要在SDL_DestroyWindow之前调用SDL_GL_DeleteContext吗?

时间:2019-07-15 08:04:40

标签: c++ opengl sdl

在SDL中,如果仍然销毁了一个窗口,我是否需要事先删除OpenGL上下文,或者它会自动删除它?我不要内存泄漏。

我还什么时候需要致电delay(DELAY_SERVO); servo_init(); ?仅当我有多个每个SDL_GL_MakeCurrent的窗口时才需要吗?

在文档中找不到任何内容。

2 个答案:

答案 0 :(得分:2)

好吧

SDL_GL_DeleteContext
SDL_DestroyWindow
SDL_QuitSubSystem

按该顺序。我曾经非常仔细地阅读过文档,但我隐约记得在文档中某处提到了该文档。尽管我必须警告我阅读了SDL2的内容。但是,在SDL1中应该是相同的。

由于所有SDL内部都很容易忘记,所以我写了一个不错的C ++包装器:

https://github.com/Superlokkus/CG1/blob/master/src/sdl2_opengl_helper.cpp#L68

答案 1 :(得分:2)

SDL不会自动删除上下文,您应该手动删除它。

通常,我的调用堆栈如下:

SDL_GL_DeleteContext(m_context);
SDL_DestroyWindow(m_window);
SDL_Quit();

跟踪指针也不是什么大问题,因为您可以将窗口系统包装在一个简单的类/结构中,然后像这样传递它:

class Window
{
public:
     SDL_Window* window;
     SDL_GLContext context;
};

对于第二个问题,您创建的每个上下文都与您在创建上下文时指定的相应SDL窗口相关联。选择/使另一个上下文成为当前上下文并在该上下文上渲染将在与该上下文相关的窗口上绘制。

使窗口能够使用后,您需要调用SDL_GL_MakeCurrent。当创建多个窗口时,将所需的上下文设置为当前,该窗口将被渲染到该上下文。如果要访问另一个线程中的OpenGL资源,也应该使用MakeCurrent-但请记住,上下文一次只能在一个线程中处于活动状态,并且必须在调用时在主线程中调用该函数。下次使用。