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

Do I need to call SDL_GL_DeleteContext before SDL_DestroyWindow?

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

还有我什么时候需要打电话给SDL_GL_MakeCurrent?只有当我有多个 windows 每个 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();

跟踪指针也不是什么大问题,因为您可以将 window 系统包装在一个简单的 class/struct 中,然后将其传递,如下所示:

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

关于您的第二个问题,您创建的每个上下文都绑定到您在使上下文成为当前上下文时指定的相应 SDL window。 Selecting/Making 另一个当前上下文并在该上下文上呈现将利用 window 和您设为当前的上下文。

您需要在创建 window 后调用 SDL_GL_MakeCurrent 才能使用它。当创建多个 windows 时,将您想要的上下文设置为当前上下文并将渲染到该上下文。如果你想在另一个线程中访问 OpenGL 资源,你也应该使用 MakeCurrent - 但请记住,上下文一次只能在一个线程中激活,并且你必须在下一个线程中调用主线程中的函数使用.