2017-09-12 80 views
0

我最近開始在C++中學習DirectX編程,並且遇到了一個小問題。在DirectX中放置幀之間的延遲

問題是,我的練習要求我將DirectX應用程序中的顏色從一個更改爲另一個。我有一個函數,這是否:

void render_frame(void) 
{ 
    // start the random generator 
    srand(time(NULL)); 

    // clear the window to random color 
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(rand() % 255, rand() % 255, rand() % 255), 1.0f, 0); 

    // begin/end/display scene 
    d3ddev->BeginScene(); 
    d3ddev->EndScene(); 
    d3ddev->Present(NULL, NULL, NULL, NULL); 
} 

它的工作原理,但它是依賴於時間()延遲,我不知道是否有在Direct3D圖書館更好的對應。例如,如果我能在鏈與特定的顏色和延遲調用此函數爲了這樣的:

void render_frame_red(void); 
delay(1000); 
void render_frame_blue(void); 
delay(1000); 

我知道函數睡眠()存在於標準庫,但它確實凍結我的應用程序窗口(我可以」在延遲期間與它進行交互)。也許我可以將時間設置爲不同的tickrate,以便隨時更新我想要的時間?

我知道這是一件小事,我可能會稍後在我的3D編程之旅中想出它,但如果我更瞭解DirectX中的工作方式,它不會受到傷害。

+0

只能在程序中調用一次srand()。 –

+0

是的,那是我的不好。我通常在我的main()函數(在這種情況下是WinMain())開始時調用它。 – RPAnimation

+0

@NeilButterworth其實一次在線程中。甚至可以使用':: std :: random_device'。至於問題,DirectX根本不處理時間。現在,所有相關功能都存在於DXGI中(請參閱[IDXGISwapChain](https://msdn.microsoft.com/en-us/library/windows/desktop/bb174569(v = vs.85).aspx))和系統定時器。 – VTT

回答

0

Direct3D的一般模型是「儘可能快地渲染幀」,然後在程序中進行基於時間的操作來處理動畫。傳統的GDI風格的繪圖只能繪製「按需」,您可以使用Direct3D進行繪製,但會讓事情變得更加困難。

換句話說,使用時鐘而不是幀數來控制動畫和效果。有關Direct3D渲染的定時器解決方案,請參閱this blog post

BTW,不投資你的時間在學習傳統的Direct3D 9很大程度上依賴於支持從已過時的DirectX SDK代碼,並要求傳統DirectSetup部署古助手庫D3DX9(見MSDN)。使用DirectX 11.請參閱DirectX Tool Kit

+0

這兩者之間的主要區別是什麼?我知道DirectX SDK不再被更新,但不是基於相同根的那些? (語法,與GPU溝通,技術等)當代開發人員是否使用DirectX Tool Kit來製作遊戲?我知道我沒有根據地提出問題,但我需要確保在從已棄用的SDK中放棄我的學習之前。 – RPAnimation

+0

@RPAnimation'DirectX SDK'經常更新,但它成爲'Windows SDK'的一部分。單獨的'DirectX SDK'是一個棄用的舊版SDK。 'DirectX Tool Kit'是一組支持庫以簡化開發(並且它也經常更新)。 – VTT

+0

關於我的博客上關於不同主題的DirectX SDK狀態,有幾十篇文章。從上面的MSDN鏈接開始,查看[博客](https://blogs.msdn.microsoft.com/chuckw/tag/dxsdk/)。大多數遊戲開發者使用現有的遊戲引擎(使用DirectX 11/12),或者他們已經熟悉DirectX以編寫自己的引擎。我指出_DirectX Tool Kit_是一種基於受支持的開源庫來學習C++中的DirectX 11的可訪問方法,可以避免使用已棄用的DirectX SDK。網上大多數其他教程在這方面已經過時了。 –