我需要在SDL_DestroyWindow前打电话给SDL_GL_DeleteContext吗?
Do I need to call SDL_GL_DeleteContext before SDL_DestroyWindow?
在 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——但请记住,一个上下文一次只能在一个线程中处于活动状态,下次使用时你必须在主线程中调用该函数。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- SDL 窗口不会弹出
- SDL 操纵杆按钮按下/C++
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- SDL 映像:无法打开映像,仅显示错误消息
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- Visual Studio 19-17 库兼容性根据 GL 标志
- "Undefined symbols for architecture x86_64" 在 SDL 2 (macOS) 中
- 为什么 SDL 在 Mac 上比 Linux 慢得多?
- glDrawElements GL 错误类型 = 0x824c,严重性 = 0x9146,消息 = GL_INVALID
- 在 OSX 上打开 SDL 窗口时不要打开终端窗口
- SDL + OpenGL ES 2.0 使用着色器显示纹理
- SDL GPU 为什么将两个图像分成两个单独的循环更快?
- 将"Compass"与相机旋转隔离开GL
- 在 cmake 中找不到 SDL 库
- SDL/C++: 如何平滑但随机地移动矩形?
- 如何在 monodevelopment (C++) 中链接 SDL 和 GL
- 如何将SDL TTF表面转换为具有透明背景的GL纹理