2

我正在使用 OpenGL 为 Windows 编写一个 3D 应用程序。目前,它使用大约 50000 个多边形的模型渲染一个简单的测试场景,并以 60FPS 的速度平滑渲染。

但是,只要将鼠标移到应用程序窗口上,帧速率就会变得非常不均匀。它从 400 FPS 随机波动到 20 FPS。这有什么原因吗?这是由应用程序被迫处理的鼠标事件引起的吗?我可以禁用它们并只轮询鼠标状态吗?

我的应用程序循环非常简单,或多或少类似于:

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);
4

3 回答 3

1

除了鼠标移动消息之外,在窗口上移动还会生成 WM_SETCURSOR 消息。您可以尝试丢弃这些消息和 WM_MOUSEMOVE 消息以查看应用程序是否加速。要丢弃,请返回 1 而不是调用 DefWindowProc。

没有办法关闭鼠标消息,但扔掉它们应该很快。您可以使用GetCursorPos轮询鼠标坐标。

于 2009-04-01T21:06:47.840 回答
0

听起来像是线程问题。使用像glut这样的库来为你处理 opengl 主循环怎么样?

于 2009-04-01T21:01:04.123 回答
0

有点摸不着头脑,但是 WM_PAINT 消息会触发您的应用重绘吗?如果那是您进行渲染的地方,那么听起来鼠标正在生成 InvalidateRects 并强制窗口更新。

一般来说,我根本不让 Windows 轮询鼠标,但应用程序本身会根据需要进行轮询。

于 2009-04-03T23:15:40.393 回答