青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

DXUT框架剖析(6)

在窗口和設備創建好之后,應用程序需要使用消息循環處理窗口消息、更新和渲染場景、處理設備事件。應用程序可以實現自己的消息循環,也可以使用DXUT消息循環,注冊相應的回調函數,可以讓DXUT處理設備、幀消息事件。

 

進入消息循環

為使用DXUT框架的消息循環,可以調用DXUTMainLoop()函數:

Starts the main execution loop of DXUT.

 HRESULT DXUTMainLoop( 
HACCEL hAccel
) ;

Parameters

hAccel
[in] Handle to an accelerator table to use in translating keyboard messages from the Windows message queue, or NULL if not using an accelerator table. The default value is NULL.

Return Values

If the function succeeds, the return value is S_OK. If the function fails, the return value can be one of the error codes in DXUTERR.

Remarks

This function starts the message loop that will run for the lifetime of the application. During execution, DXUTMainLoop calls the registered callback functions to ask the application to update and render the frame, as well as handle any device or input events.

 

Custom Main Loop

For some advanced applications a custom main loop may be a better design. It is possible to use DXUT with a custom main loop. An example of how to do this is shown below.

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

This example calls DXUTRender3DEnvironment to have DXUT update and render the scene and handle device events. While it is possible for the application to completely replicate this functionality, it is not recommended.

DXUTRender3DEnvironment

Renders the 3D environment.

 VOID DXUTRender3DEnvironment() ;

Parameters

None.

Return Values

No return value.

Remarks

This method does not normally need to be called. It is useful only when the application does not use DXUTMainLoop but still wants DXUT to assist with rendering.

This method checks whether the device is lost. If so, the method attempts to reset the device and then calls the LPDXUTCALLBACKFRAMEMOVE and LPDXUTCALLBACKD3D10FRAMERENDER callback functions.

If the application window is minimized or the application is paused, CPU time is yielded to other processes.

 

處理事件

框架使用回調函數機制來使應用程序對事件做出反應。應用程序只需對框架注冊和設置相應的函數指針,則當事件發生時,框架就會調用相應的函數。框架不需要注冊所有的回調函數,所以應用程序只須對所需要的回調函數進行注冊即可。通過為回調函數設置參數pUserContext,回調函數可以從應用程序接受內容,比如將該參數設置為一個指向類對象的指針。

DXUT框架可以處理以下事件類型:

(1)設備事件

當應用程序使用Direct3D設備渲染圖形時,該設備有可能處于丟失狀態。這種情況的發生有多種原因,例如按下Alt + Tab鍵離開一個全屏模式的應用程序,或者按下Ctrl + Alt + Del鍵,或者啟動了另一個全屏3D應用程序。發生這種情況時,當調用一些函數(如Present)時,Direct3D API通過返回D3DERR_DEVICELOST通知應用程序設備丟失。

當設備丟失時,應用程序負責釋放所有不能在設備丟失時存在的Direct3D資源對象,如在D3DPOOL_DEFAULT內存池中創建的對象。如果沒有釋放這些對象,那么該設備從丟失狀態返回時就不能被重新設置。當設備丟失時,應用程序必須等待。當設備返回時,應用程序必須調用函數 IDirect3DDevice9::Reset(),并重新創建所有不能在Reset()函數中存在的對象。

通過DXUT框架,這個過程可以通過在應用程序中使用回調函數來簡化,這些回調函數處理各種設備事件:設備改變、創建、重新設置、丟失或銷毀。當設備丟失時,框架會有提示;當它從丟失狀態返回時,框架會適當調用相應的回調函數,重新設置該設備,即框架使用應用程序的回調函數在適當的時間釋放和重新創建設備對象。應用程序需要做的是注冊并實現相關回調函數,各回調函數的類型、注冊、調用時機等細節見下表:

注冊函數 應用程序回調函數 框架調用時機 創建資源 釋放資源
DXUTSetCallback-
DeviceChanging
LPDXUTCALLBACK-
MODIFYDEVICESETTINGS
在創建Direct3D設備之前調用,應用程序可以返回FALSE,拒絕改變該設備。 x x
DXUTSetCallback-
D3D9DeviceCreated
LPDXUTCALLBACK-
D3D9DEVICECREATED
當應用程序初始化和重新創建設備時,在Direct3D設備創建之后立即調用。 創建D3DPOOL_MANAGED資源,因為這些資源無論什么時候被銷毀都需要重新加載,但這些資源被重新設置時不需要重新加載。在這里創建的資源需要在LPDXUTCALLBACK-DEVICEDESTROYED中釋放。 x
DXUTSetCallback-
D3D9DeviceReset
LPDXUTCALLBACK-
D3D9DEVICERESET
當Direct3D設備丟失又被重新設置后立即調用。 創建D3DPOOL_DEFAULT資源,因為這些資源無論什么時候丟失或重新設置時都需要重新加載,在這里創建的資源需要在LPDXUTCALLBACK-DEVICELOST中釋放。 x
DXUTSetCallback-
D3D9DeviceLost
LPDXUTCALLBACK-
D3D9DEVICELOST
當Direct3D設備變為丟失狀態且在Reset調用之前,立即調用。 x 釋放在回調函數LPDXUTCALLBACK-D3D9DEVICERESET中創建的資源,這些資源通常包括所有的D3DPOOL_DEFAULT資源。
DXUTSetCallback-
D3D9DeviceDestroyed
LPDXUTCALLBACK-
D3D9DEVICEDESTROYED
當應用程序終止或重新創建設備時,Direct3D設備被銷毀后,立即調用。 x 釋放在回調函數LPDXUTCALLBACK-
D3D9DEVICECREATED中創建的資源,這些資源通常包括所有的D3DPOOL_MANAGED資源。

當設備在窗口和全屏模式間切換時常常需要重新設置,但有時它必須通過Direct3D重新創建。

調用這些回調函數是可選的,但如果應用程序沒有使用函數DXUTSetCallbackD3D9DeviceDestroyed()和 DXUTSetCallbackD3D9DeviceCreated()注冊銷毀回調函數和創建回調函數,則改變設備或在硬件抽象層設備和參考設備間切換都不能進行。

類似地,如果沒有用函數DXUTSetCallbackD3D9DeviceLost()和 DXUTSetCallbackD3D9DeviceReset()注冊丟失回調函數和重置回調函數,則當設備丟失或重置設備時,框架無法通知應用程序。這樣一來,所有不在D3DPOOL_MANAGED內存中的設備對象都不能重新設置。


 

posted on 2008-05-15 16:58 lovedday 閱讀(1217) 評論(0)  編輯 收藏 引用

公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品伦一区| 欧美日韩国产精品| 国产在线精品一区二区中文| 久久爱91午夜羞羞| 性欧美暴力猛交69hd| 国产一区91精品张津瑜| 蜜桃av综合| 欧美另类一区| 午夜精品一区二区三区四区 | 麻豆成人在线| 久久综合给合| 亚洲视频在线播放| 亚洲欧美日韩精品久久奇米色影视| 国产欧美一区二区精品忘忧草| 久久中文字幕一区| 欧美极品欧美精品欧美视频| 亚洲欧美综合v| 一本一本久久a久久精品综合麻豆| 亚洲字幕一区二区| 欧美福利在线| 欧美视频在线免费| 久久久久久免费| 欧美国产一区在线| 欧美在线你懂的| 欧美精品一区二区久久婷婷| 午夜精品一区二区三区在线播放 | 久久九九全国免费精品观看| 亚洲最黄网站| 久久精品国产999大香线蕉| 亚洲人午夜精品免费| 亚洲免费综合| 一区二区三区四区在线| 久久国产免费看| 亚洲一区成人| 欧美大片在线观看一区二区| 久久成人国产精品| 欧美日韩中文在线观看| 亚洲福利视频三区| 国产精品自拍小视频| 最新国产成人在线观看| 伊大人香蕉综合8在线视| 亚洲一区二区三区四区五区午夜| 亚洲日本aⅴ片在线观看香蕉| 午夜免费日韩视频| 亚洲欧美国产精品专区久久| 欧美成人国产va精品日本一级| 久久久精品国产免费观看同学| 国产精品初高中精品久久| 亚洲国产欧美一区二区三区同亚洲 | 欧美成人一二三| 蜜臀99久久精品久久久久久软件 | 国产精品夜夜夜一区二区三区尤| 亚洲国产成人在线视频| 永久555www成人免费| 午夜国产欧美理论在线播放| 亚洲影视在线| 欧美视频不卡| 亚洲午夜精品网| 亚洲一区成人| 国产精品毛片一区二区三区| 一二三区精品福利视频| 中文久久乱码一区二区| 欧美日韩国产综合新一区| 最新国产乱人伦偷精品免费网站| 91久久国产综合久久蜜月精品 | 一区二区三区欧美成人| 亚洲一区视频| 国产美女精品视频免费观看| 亚洲欧美一区二区精品久久久| 午夜激情一区| 国产欧美日韩| 久久久国产精品一区二区三区| 久久婷婷激情| 亚洲激情在线视频| 欧美成人在线影院| 日韩一级不卡| 性伦欧美刺激片在线观看| 国产日韩专区在线| 久久蜜桃香蕉精品一区二区三区| 男人的天堂亚洲| 亚洲免费观看在线视频| 欧美日韩一区自拍| 欧美一区二区三区免费看| 久热综合在线亚洲精品| 亚洲日本成人在线观看| 欧美午夜a级限制福利片| 日韩亚洲欧美一区二区三区| 亚洲欧美日本在线| 国产综合香蕉五月婷在线| 美国十次成人| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 国产精品亚洲片夜色在线| 午夜精品视频在线观看| 欧美成人福利视频| 亚洲永久免费av| 黄色一区二区在线| 欧美日韩一区二区三区四区五区| 亚洲欧美另类久久久精品2019| 久久综合中文字幕| av成人手机在线| 国模精品一区二区三区色天香| 欧美精品videossex性护士| 亚洲男人影院| 91久久在线播放| 久久免费黄色| 亚洲一区二区三区777| 红桃视频国产一区| 国产精品久久久久久户外露出| 久久久免费精品| 亚洲一区二区三区中文字幕| 欧美激情按摩在线| 久久久久免费观看| 亚洲一区二区三区午夜| 亚洲国产日韩综合一区| 国产色视频一区| 欧美日韩理论| 欧美激情综合网| 久久综合99re88久久爱| 午夜视频在线观看一区| 99国产精品久久久久久久久久| 免费成人av| 久久狠狠婷婷| 亚洲欧美在线网| 中文欧美字幕免费| 亚洲国产精品小视频| 美女网站在线免费欧美精品| 久久不射电影网| 亚洲在线日韩| 一本色道久久综合亚洲精品不卡| 韩国av一区| 国产无遮挡一区二区三区毛片日本| 欧美日韩一区二区在线观看视频| 嫩草国产精品入口| 欧美成人亚洲成人日韩成人| 久久一区二区精品| 久久久五月婷婷| 久久久久久亚洲精品中文字幕| 欧美一区二区视频网站| 午夜精品99久久免费| 亚洲字幕一区二区| 小处雏高清一区二区三区 | 西瓜成人精品人成网站| 亚洲欧美日韩在线不卡| 亚洲欧美自拍偷拍| 欧美在线播放视频| 久久精品夜色噜噜亚洲aⅴ| 久久精品亚洲国产奇米99| 久久久久国产成人精品亚洲午夜| 欧美在线观看视频一区二区| 欧美一区在线看| 久久九九久精品国产免费直播| 久久免费少妇高潮久久精品99| 久久久久久久综合色一本| 久久青草久久| 欧美喷潮久久久xxxxx| 欧美日韩中文另类| 国产午夜精品理论片a级探花| 国产原创一区二区| 亚洲国产综合在线| 中文日韩电影网站| 久久精品国产久精国产思思| 久久蜜桃精品| 亚洲国产高潮在线观看| 日韩视频免费观看| 欧美一区二区啪啪| 麻豆精品视频在线观看| 欧美日韩国产色站一区二区三区| 国产精品成人一区| 精品粉嫩aⅴ一区二区三区四区| 亚洲精品国产精品乱码不99| 亚洲视频福利| 老司机一区二区三区| 亚洲国产精品久久久| 亚洲一本大道在线| 久久一区二区精品| 国产精品区二区三区日本| 伊大人香蕉综合8在线视| 亚洲特黄一级片| 久久亚洲不卡| 99亚洲一区二区| 久久青青草原一区二区| 国产精品久久久久久久久久尿| 国产综合久久久久久鬼色| 99精品热视频只有精品10| 欧美一区1区三区3区公司| 亚洲黄色成人久久久| 欧美一二三区在线观看| 欧美人体xx| 亚洲国产成人porn| 欧美一区二区在线免费观看| 欧美国产极速在线| 香港久久久电影| 欧美日韩另类丝袜其他| 在线看无码的免费网站| 久久xxxx| 亚洲视屏一区| 欧美日韩国产首页| 亚洲国产乱码最新视频| 久久久久久91香蕉国产| 亚洲欧美大片|