メイン ループの作成
DXUT を初期化し、ウィンドウを作成し、デバイスを作成したら、次の手順は、メイン ループ関数 (レンダリング ループまたはメッセージ ループとも呼ばれる) の実装です。メイン ループは、シーンを更新してレンダリングし、デバイス イベントとウィンドウ メッセージに応答します。
- メイン ループのストック
- カスタム メイン ループ
メイン ループのストック
DXUT で提供されるメイン ループの使用は非常に簡単です。これを行うには DXUTMainLoop を呼び出します。
DXUTMainLoop();
この関数が呼び出された場合は、アプリケーションを閉じるまでは値を返しません。アプリケーションは、デバイス イベントを処理しメッセージに応答するために、DXUT でコールバックを登録します。
カスタム メイン ループ
一部の高度なアプリケーションには、カスタム メイン ループの方が適した設計である場合があります。カスタム メイン ループを DXUT で使用することができます。次に、これを行う方法の例を示します。
INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, INT )
{
DXUTSetCallbackD3D9DeviceAcceptable( IsDeviceAcceptable );
DXUTSetCallbackD3D9DeviceCreated( OnCreateDevice );
DXUTSetCallbackD3D9DeviceReset( OnResetDevice );
DXUTSetCallbackD3D9FrameRender( OnFrameRender );
DXUTSetCallbackD3D9DeviceLost( OnLostDevice );
DXUTSetCallbackD3D9DeviceDestroyed( OnDestroyDevice );
DXUTSetCallbackMsgProc( MsgProc );
DXUTSetCallbackKeyboard( KeyboardProc );
DXUTSetCallbackFrameMove( OnFrameMove );
DXUTSetCallbackDeviceChanging( ModifyDeviceSettings );
DXUTInit( true, true );
DXUTCreateWindow( L"Example" );
DXUTCreateDevice( true, 640, 480 );
// Custom main loop
HWND hWnd = DXUTGetHWND();
BOOL bGotMsg;
MSG msg;
msg.message = WM_NULL;
PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE );
while( WM_QUIT != msg.message )
{
// Use PeekMessage() so we can use idle time to render the scene
bGotMsg = ( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) != 0 );
if( bGotMsg )
{
// Translate and dispatch the message
if( 0 == TranslateAccelerator( hWnd, NULL, &msg ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
else
{
// Render a frame during idle time (no messages are waiting)
DXUTRender3DEnvironment();
}
}
return DXUTGetExitCode();
}
この例では、DXUTRender3DEnvironment を呼び出して、DXUT でシーンを更新してレンダリングし、デバイス イベントを処理します。この機能をアプリケーションですべて模倣することは可能ですが、それはお勧めできません。
次の手順
次の手順は、イベントの処理です。