一开始我的代码建立了SDL环境,并更新OpenGL上下文,但没有执行任何SDL事件处理。这会导致窗口在打开的情况下对Windows来说似乎没有响应。窗口会闪烁一下。标题栏会附加“(未响应)”字样,在窗口内部单击后,窗口变为灰色,因为在Windows中默认情况下非响应窗口是这样处理的。但是在这种状态下(即使在窗口变灰之后),OpenGL显示仍然继续更新和动画,关键是,它甚至在拖动窗口时也可以这样做。显然,在这种情况下,应用程序没有正确地处理窗口事件,导致Windows认为它处于挂起状态。但有明显的证据表明OpenGL继续渲染。
现在,我只对代码进行了一个单一的修改,就是将这三行代码放置在循环中的适当位置(同时也进行了OpenGL绘制)。
现在的行为是,Windows不再认为它是“无响应”的,窗口也不会变灰。没有闪烁,一切似乎都很顺利。但一旦我点击并拖动标题栏以拖动窗口,渲染就被阻塞了。我没有进行调试以确保,但我怀疑SDL_PollEvent在整个窗口拖动期间都会被阻止。
有什么解决办法吗?这很有趣,因为未能处理事件的部分行为证明了理论上我想要的是可能的。
更新:我找到了这个线程:http://www.gamedev.net/topic/488074-win32-message-pump-and-opengl---rendering-pauses-while-draggingresizing/ 结论似乎是这取决于Microsoft为我们作出的某些选择……它基本上会陷入
SDL_Event event;
if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
break;
所有这个代码段所做的就是使用SDL刷新消息队列。现在的行为是,Windows不再认为它是“无响应”的,窗口也不会变灰。没有闪烁,一切似乎都很顺利。但一旦我点击并拖动标题栏以拖动窗口,渲染就被阻塞了。我没有进行调试以确保,但我怀疑SDL_PollEvent在整个窗口拖动期间都会被阻止。
有什么解决办法吗?这很有趣,因为未能处理事件的部分行为证明了理论上我想要的是可能的。
更新:我找到了这个线程:http://www.gamedev.net/topic/488074-win32-message-pump-and-opengl---rendering-pauses-while-draggingresizing/ 结论似乎是这取决于Microsoft为我们作出的某些选择……它基本上会陷入
DefWindowProc()
直到鼠标释放。通过黑客方式修复这个问题非常麻烦,我可能可以通过在另一个线程中进行渲染来解决问题。但我甚至不想考虑从多个线程中操纵OpenGL上下文,如果这可能是可行的话。