2011-06-23 74 views
0

我希望能夠加載/下載一堆資源並通知用戶當前正在加載的文件,但是我不能在每個文件開始加載後畫一個框架,因爲v-sync會一直等到它可以在它繼續之前繪製一個框架(將瓶頸頸縮到小於60 /秒)。如何在等待垂直同步時執行操作?

有沒有辦法來檢查設備是否準備好繪製或沒有hacky「有1/60秒通過?),所以我可以執行操作,直到它準備好了?我不介意如果通知會跳過已準備好繪製之前完成的文件,但我希望最大化負載的速度,同時仍能夠通知用戶。

另外,我想避免即使暫時禁用v-sync因爲我不想導致圖形卡在300FPS速率下如果電腦真的很快加載速度太慢

回答

1

你不指定你使用的是哪個版本的Direct3D,使用D3D9你可以將D3DPRESENT_DONOTWAIT傳遞給你的Present()打個電話如果硬件正在處理或等待垂直同步間隔,它將返回D3DERR_WASSTILLDRAWING。這意味着如果你啓用了vsync,那麼在你的主循環中,只要你加載了一個文件,就可以用DONOTWAIT標誌調用Present,如果它返回WASSTILLDRAWING,就加載另一個文件。

請注意,您需要獲取交換鏈並調用交換鏈上的Present(),而不是直接在設備上調用Present()以便能夠傳遞此標誌以呈現,或者您可以將其設置在D3DPRESENT_PARAMETERS結構創建設備或創建IDirect3DDevice9Ex而不是IDirect3DDevice9設備,並調用PresentEx()而不是Present()。

但這並不能解決文件加載時間超過一幀的問題 - 但是如果您的文件需要很長時間才能處理,則幀速率會下降。在我看來,解決這個問題的一個更好的辦法是將盡可能多的IO移動到另一個線程中(在D3D9中,您仍然需要在主線程上創建D3D資源),只需傳遞當前文件的名稱正在處理到您的主要/渲染線程以顯示每次您展示一個框架。