我正在使用OpenGL编写Windows的3D应用程序。 现在,它呈现一个简单的testing场景,一个约50000个多边形的模型,并在60FPS时呈现平稳。
但是,只要将鼠标移到应用程序窗口上,帧率就会非常不均匀。 它随机波动从400 FPS到20 FPS。 这有什么理由吗? 这是由应用程序被强制处理的鼠标事件引起的吗? 我可以禁用它们,只是轮询鼠标状态?
我的应用程序循环非常简单,或多或less像这样:
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if (msg.message==WM_QUIT) { quit(); } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { draw(); Sleep(1); }
而窗口程序基本上是
return DefWindowProc(hWnd,uMsg,wParam,lParam);
除了鼠标移动消息之外,移动窗口将生成WM_SETCURSOR消息。 您可能会尝试放弃这些和WM_MOUSEMOVE消息,以查看应用程序是否加速。 放弃,返回1而不是调用DefWindowProc。
没有办法关闭鼠标消息,但扔掉它们应该很快。 您可以使用GetCursorPos来轮询鼠标坐标。
听起来像一个线程问题。 那么用glut这样的库来处理opengl主循环呢?
在黑暗中的一点点,但将WM_PAINT消息触发你的应用程序重绘? 如果这是渲染正在发生的地方,那么听起来鼠标正在生成InvalidateRects并强制更新窗口。
通常我不会让Windows根据需要轮询鼠标,但应用程序本身也会轮询。