2009-04-01 7 views
2

OpenGLを使用してWindows用の3Dアプリケーションを作成しています。今のところ、約50000ポリゴンの1つのモデルで簡単なテストシーンをレンダリングし、60FPSで滑らかにレンダリングします。3Dアプリケーションのマウス入力にムラがあります

ただし、マウスがアプリケーションウィンドウ上を移動すると、フレームレートは非常に不均一になります。それはランダムに400FPSから20FPSまで変動する。これには何らかの理由がありますか?これは、アプリケーションが強制的に処理するマウスイベントによって引き起こされますか?それらを無効にしてマウスの状態をポーリングすることはできますか?

マイアプリループは、多かれ少なかれのようなものは非常に簡単です:

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

答えて

0

スレッドの問題のような音れます。 OpenGLのメインループを扱うのに、glutのようなライブラリを使うのはどうでしょうか?

+0

私はできません、それは純粋なWinAPIを使用している必要があります。 – GhassanPL

1

マウス移動メッセージに加えて、ウィンドウ上を移動するとWM_SETCURSORメッセージが生成されます。これらのメッセージとWM_MOUSEMOVEメッセージを破棄して、アプリのスピードアップを試してみてください。破棄するには、DefWindowProcを呼び出す代わりに1を返します。

マウスのメッセージをオフにする方法はありませんが、スローすることはすばやく行う必要があります。 GetCursorPosを使用すると、マウス座標をポーリングできます。

+0

それは事です、私はWM_CLOSE以外のメッセージは扱っていません。 WM_MOUSEMOVEで0または1を返しても何も変わりません。 – GhassanPL

+0

あなたはそれらを扱っていないかもしれませんが、DefWindowProcはです。 –

0

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

一般的に私はウィンドウをポーリングすることは全くありませんが、アプリケーション自体は必要に応じてポーリングを行います。

+0

Nah、私はWM_PAINTメッセージを処理しません。 – GhassanPL

+0

誰もがDefWindowProcがそれらを処理していると言っているようです。 – thing2k

関連する問題