【发布时间】:2017-06-11 05:19:09
【问题描述】:
我在 Win32 OpenGL 应用程序中的主消息循环如下所示:
// Inside wWinMain
bool bQuit = false;
while( bQuit == false )
{
DWORD dwReturn = ::MsgWaitForMultipleObjects( 0, NULL, FALSE, 12, QS_ALLINPUT );
if( dwReturn == WAIT_OBJECT_0 )
{
MSG msg;
BOOL bReturn = ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE );
if( bReturn != FALSE )
{
if( msg.message == WM_QUIT )
bQuit = true;
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
}
if( dwReturn == WAIT_OBJECT_0 || dwReturn == WAIT_TIMEOUT )
{
RenderFrame();
::SwapBuffers( hDc );
}
}
它几乎可以正常工作,我只有一个问题:如果我按 Alt+F4 关闭窗口,释放键后它不会立即退出,但是,如果我将鼠标悬停在窗口上,它会立即退出.
A) 为什么会这样?我应该如何修改我的循环?
B) 我发现的原始代码没有使用MsgWaitForMultipleObjects,而是连续调用了RenderFrame。我认为这种方式在重绘屏幕上浪费了太多的 CPU 时间。我对吗?平时的做法是什么,你是不是把多余的产能都花在了画画上?
【问题讨论】:
-
请出示真实代码。你的
while( bQuit )循环永远不会运行。 -
看起来我们没有足够的代码。而且这段代码不是真实的。循环永远不会执行。
-
@IInspectable -
if( msg.message == WM_QUIT ) bQuit = true;怎么样?这个和中断循环 -
B) 您想要绘制的频率取决于您绘制的内容。如果您绘制动画,则至少需要 30fps 才能使其流畅。如果您编写游戏,那么输入-显示延迟可能是一个重点,您会希望尽可能频繁地更新视图(或至少以显示器的刷新率,但 vsync 的用途是)。跨度>
-
看起来像调用
PeekMessage只有一次 但不在循环中while(PeekMessage)MsgWaitForMultipleObjects代码的非常常见的错误 - 我已经不是第一次看到这个错误了
标签: c++ winapi opengl waitformultipleobjects