2014-01-16 49 views
0

如果應用程序正在繪製到緩衝區(d3d曲面)中間並且DWM需要緩衝區來重新繪製屏幕,​​反之亦然,會發生什麼情況?DWM和Direct3D窗口之間的同步

有沒有可用的同步機制?

回答

0

交換鏈總是有兩個或多個緩衝區,並且在任何特定時間,DWM都擁有其中一個緩衝區。如果在發生虛擬空白時應用程序編輯的新幀不是Present(),則DWM會使用它現有的緩衝區重繪最後一幀。同步可以通過飽和當前隊列(3次左右的呼叫後,下一次會阻塞直到v空白)或手動呼叫WaitForVBlank來實現。在Windows 8.1中,使用IDXGISwapChain2::GetFrameLatencyWaitableObject的機制更加健壯。無法強制DWM等待應用程序,因爲這會掛起整個OS UI。

+1

在發佈問題後,我做了更多的搜索,並找到[this](http://blogs.msdn.com/b/greg_schechter/archive/2006/03/10/549310.aspx)和[this]( http://stackoverflow.com/questions/1840516/is-double-buffering-required-with-desktop-composition-enabled)後。他們說這個窗口可以在DWM更新的過程中渲染,所以「結構撕裂」可能發生。這只是關係到一些舊版本的Windows? – alice

+0

@alice它看起來像這些鏈接都承認「結構撕裂」作爲呈現中的呈現,例如, 'DrawTriangle();當下(); DrawRect();'顯然,如果意圖是同時出現三角形和矩形,這個調用模式不會產生正確的效果。但這只是糟糕的應用程序邏輯。 – MooseBoys