我需要在 SDL_DestroyWindow 之前调用 SDL_GL_DeleteContext 吗?
Posted
技术标签:
【中文标题】我需要在 SDL_DestroyWindow 之前调用 SDL_GL_DeleteContext 吗?【英文标题】:Do I need to call SDL_GL_DeleteContext before SDL_DestroyWindow? 【发布时间】:2019-07-15 08:04:40 【问题描述】:在 SDL 中,如果我无论如何都要销毁一个窗口,我需要事先删除 OpenGL 上下文还是自动删除它?我不想要内存泄漏。
我什么时候需要打电话给SDL_GL_MakeCurrent
?仅当我有多个带有 GLcontext
的窗口时才需要这样做吗?
在文档中找不到任何内容。
【问题讨论】:
调用它会失去什么?连贯和安全总比抱歉... @Quentin 是的,我认为你是对的。起初我以为它会增加一些代码膨胀,因为否则我不需要跟踪指向上下文的指针,但老实说还不错。 对于单个窗口,您不必使用SDL_GL_MakeCurrent
,因为SDL_GL_CreateContext
承诺使新创建的上下文成为当前的。不过也没什么大不了的。如果您有多个窗口或线程 - 那是另一回事。
【参考方案1】:
我打电话给
SDL_GL_DeleteContext
SDL_DestroyWindow
SDL_QuitSubSystem
按这个顺序。我曾经非常仔细地阅读过文档,我模糊地记得在文档的某个地方提到了这一点。虽然我必须警告我阅读了 SDL2 的那个。不过这在 SDL1 中应该是一样的。
因为 SDL 内部的所有内容都很容易忘记,所以我编写了一个不错的 C++ 包装器:
https://github.com/Superlokkus/CG1/blob/master/src/sdl2_opengl_helper.cpp#L68
【讨论】:
我也在使用 SDL2,但找不到。我读过这两个网站:wiki.libsdl.org/SDL_GL_CreateContext 和 wiki.libsdl.org/SDL_GL_DeleteContext。但既然它也没有说它会自动删除,我想我最好明确地这样做。 我也使用过它们,事实上,由于 CreateContext 甚至将 DestroyContext 称为“相关函数”,并且与 SDL_QUIT 相比,它明确提到了清理调用它可以节省你的时间,我几乎可以肯定你有销毁它,以避免资源泄漏。【参考方案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 - 但请记住,上下文一次只能在一个线程中处于活动状态,并且您必须在下一次调用主线程中的函数使用。
【讨论】:
现在用两个自定义删除器将指针打包在两个 std::unique_ptr 中,我在其中调用 SDL_DestroyWindow 和 SDL_GL_DeleteContext。我认为这会奏效,而且当然也不会太臃肿。 您关于关联到相应 SDL 窗口的上下文的评论实际上是错误的。 OpenGL 上下文和可绘制对象(windows、GDI/GLX PBuffers 等)之间没有no 连接。这是一个常见的误解(部分原因是一些不幸的 API 设计)。 SDL 是少数几个真正做到这一点的框架之一。 啊,重新阅读 SDL 文档后,窗口和上下文确实是独立的,我现在通常使用 GLFW,它的工作原理与我在 iirc 中描述的一样。感谢您纠正我 - 我有一段时间没有使用 SDL 哈哈以上是关于我需要在 SDL_DestroyWindow 之前调用 SDL_GL_DeleteContext 吗?的主要内容,如果未能解决你的问题,请参考以下文章