2

OpenGL を使用して、Windows 用の 3D アプリケーションを作成しています。今のところ、約 50000 ポリゴンの 1 つのモデルで単純なテスト シーンをレンダリングし、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 メッセージを破棄して、アプリの速度が上がるかどうかを確認してみてください。破棄するには、DefWindowProc を呼び出す代わりに 1 を返します。

マウス メッセージをオフにする方法はありませんが、すぐに破棄できるはずです。GetCursorPosを使用して、マウス座標をポーリングできます。

于 2009-04-01T21:06:47.840 に答える
0

暗闇でのショットですが、WM_PAINT メッセージはアプリの再描画をトリガーしますか? その場所でレンダリングが行われている場合、マウスが InvalidateRects を生成し、ウィンドウを強制的に更新しているように聞こえます。

通常、私はウィンドウにマウスをまったくポーリングさせませんが、アプリ自体は必要に応じてポーリングします。

于 2009-04-03T23:15:40.393 に答える
0

スレッドの問題のように聞こえます。opengl のメイン ループを処理するためにglutのようなライブラリを使用するのはどうでしょうか。

于 2009-04-01T21:01:04.123 に答える