2010-05-03 59 views
5

我只是通過了DirectX文檔閱讀和遇到IDirect3DDevice9::BeginScene東西在頁面有趣:DirectX:遊戲循環順序,先繪製然後處理輸入?

要啓用 CPU和圖形加速器之間的最大並行性, 是有利的調用 的IDirect3DDevice9 :: EndScene至目前爲止 在呼叫前儘可能。

我已經習慣於編寫我的遊戲循環來處理輸入等,然後繪製。我有沒有倒退?也許遊戲循環應該更多這樣的:(半僞代碼,很明顯)

while(running) { 
    d3ddev->Clear(...); 
    d3ddev->BeginScene(); 
    // draw things 
    d3ddev->EndScene(); 

    // handle input 
    // do any other processing 
    // play sounds, etc. 

    d3ddev->Present(NULL, NULL, NULL, NULL); 
} 

根據文檔的那句話,這個循環將「啓用最大並行」。

這是常見的嗎?訂購遊戲循環有什麼不利之處嗎?在第一次迭代之後,我發現它沒有真正的問題...而且我知道知道實際速度增加的最好方法是實際測試它的基準,但其他人已經嘗試過這一點,並且可以證明任何實際速度增加?

+1

我沒有經驗的DirectX(XNA開發),但我知道,這可能會導致輕微的「laggy」的感覺以遊戲爲你的遊戲走上前去,與新供給的輸入更新之前的事情被吸引。 – RCIX 2010-05-03 05:06:45

+0

@RCIX查看我的回答 – 2010-05-03 05:20:40

回答

2

因爲我一直覺得這是「尷尬」來抽取前-SIM,我傾向於推平,直到更新後也有「禮物」通話後。例如。

while True: 
    Simulate() 
    FlipBuffers() 
    Render() 

雖然在第一幀你翻轉什麼(你需要設置的東西,使得第一翻轉確實翻轉到已知狀態),這總是讓我覺得更好一點不是將首先渲染(),即使操作的順序在你進行之後也是一樣的。

2

簡短的回答是肯定的,這是它是如何常見的做。在對戰神III遊戲循環在PS3上下面的介紹請看:

http://www.tilander.org/aurora/comp/gdc2009_Tilander_Filippov_SPU.pdf

如果你正在運行在30幀雙緩衝的比賽中,輸入滯後將1/30 〜= 0.033秒,這是小到被人檢測到的方式(作爲比較,任何在100米以下的0.1秒內的反應時間被認爲是錯誤的開始)。

+0

3毫秒對於人類來說絕對不是低於可檢測的,當彈奏高於4-5毫秒的midi鋼琴時是明顯的,並且任何高於10毫秒的東西如果不是無法播放,則非常煩人。雖然可能是演奏樂器\電子遊戲的區別。 – 2010-05-10 09:51:01

2

其值得注意的是,幾乎所有的PC硬件BeginScene和EndScene什麼也不做。實際上,驅動程序會緩衝所有的繪圖命令,然後當您調用存在時甚至可能不會開始繪製。它們通常緩衝幾幀的繪製命令以平滑幀頻。駕駛員通常會根據目前的通話進行操作。

這會導致輸入滯後時的幀速率不是特別高。

,如果你做了你立刻呈現本之前,你會發現你上面給出的循環沒有區別我打賭。當然在硬件的一些奇怪位上,這可能會導致問題,因此,一般來說,如上所述,您最好循環使用。