【问题标题】:closing an SDL-window without quitting SDL关闭 SDL 窗口而不退出 SDL
【发布时间】:2012-08-21 07:36:49
【问题描述】:

我正在使用 SDL1.2 在我的 openGL 框架中处理窗口管理。

是否可以在程序运行时销毁窗口(表面)而不调用SDL_Quit()

背景:我的框架实际上只是多媒体环境中的一个 gfx 组件(可能是许多此类 gfx 组件)。我无法对其他组件的用途做出任何假设(例如,它们是否使用 SDL)。恐怕调用SDL_Quit() 会对其他组件产生副作用。

目前我正在做类似的事情:

SDL_Surface m_surface=0;

bool create_window() {
   int videoFlags = SDL_OPENGL;
   if(m_surface) {
       pritnf("window already made\n");
       return false;
   }
   if(SDL_Init(SDL_INIT_VIDEO) < 0 ) {
       pritnf("unable to initialize SDLn");
       return false;
   }
   m_surface = SDL_SetVideoMode(WIDTH, HEIGHT, BPP, videoFlags);

   return(m_surface!=0);
}

bool destroy_window() {
   if(m_surface) {
      SDL_Quit();
   }
   m_surface=0;
}

create_window()destroy_window() 都应该在应用程序的生命周期中被多次调用。 但是,多次调用SDL_Init()SDL_Quit() 感觉很奇怪。

顺便说一句,我现在正在使用 linux,但我的目标是跨平台(至少 linux、osx、w32)

【问题讨论】:

    标签: window sdl


    【解决方案1】:

    我认为这在 SDL 1.2 中是不可能的,屏幕表面有一个特殊的状态,只有SDL_Quit() 可以删除它。您可以尝试使用SDL_QuitSubSystem() 仅关闭视频部分,然后使用SDL_InitSubSystem() 来恢复它,但我不确定它是否会起作用(我现在无法测试)。

    另一方面,使用带有SDL_CreateWindow()SDL_DestroyWindow() 的SDL 2.0 看起来很容易。

    无论哪种方式,您都需要将初始化 (SDL_Init()) 与窗口创建分开,将清理 (SDL_Quit()) 与窗口销毁分开。

    【讨论】:

    • 感谢子系统初始化/退出的确认和提示。
    • 我很高兴从我的窗口创建/销毁代码中删除SDL_Init()/SDL_Quit();它只是在那里,因为这是我现在可以使它工作的唯一方法;希望子系统能让这一切变得更容易。
    • 至于 SDL2,我现在想坚持使用 debian 附带的 SDL 版本(不幸的是 1.2;非官方提供(旧)SDL1.3 包“实验”存储库,其中 afaiu 相当于 SDL2)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 2016-03-29
    相关资源
    最近更新 更多