我需要在SDL_DestroyWindow前打电话给SDL_GL_DeleteContext吗?

Do I need to call SDL_GL_DeleteContext before SDL_DestroyWindow?

本文关键字:SDL GL DeleteContext 打电话 DestroyWindow      更新时间:2023-10-16

在 SDL 中,如果我无论如何都要销毁一个窗口,我是否需要事先删除 OpenGL 上下文还是自动删除它?我不想发生内存泄漏。

另外我什么时候需要打电话给SDL_GL_MakeCurrent?仅当我有多个窗口且每个窗口GLcontext时才需要这样做吗?

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

好吧,我打电话

SDL_GL_DeleteContext
SDL_DestroyWindow
SDL_QuitSubSystem

按此顺序。我曾经非常仔细地阅读了文档,我模糊地记得在文档中的某个地方提到了这一点。尽管我必须警告我阅读了SDL2的那个。但是,这在 SDL1 中应该是相同的。

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

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

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——但请记住,一个上下文一次只能在一个线程中处于活动状态,下次使用时你必须在主线程中调用该函数。