我正在使用D3DImage來顯示一個接一個呈現給同一個Direct3D表面的幀序列。我的當前邏輯是這樣的:如何檢測WPF控件何時被重繪?
- 顯示上次渲染的幀(ieD3DImage.Lock()/ AddDirtyRect()/解鎖())
- 開始呈現下一個幀
- 等待下一幀做好準備和是時候來顯示它
- 顯示上次渲染的幀
- ...
這種方法的問題是,當我們完成了對D3D呼喚解鎖()圖像中,圖像實際上並未被複制,只是計劃在下一個WPF呈現中複製。因此,在WPF有機會顯示它之前,我們可能會在Direct3D表面上渲染一個新框架。最終結果是我們在顯示器上看到錯過的幀。
現在,我使用一個單獨的Direct3D紋理渲染和「顯示質感」只是顯示之前,即給予更好的結果,但會帶來巨大的開銷執行復制的實驗。最好能夠知道D3DImage何時刷新並開始渲染下一幀。這是可能的,如果是這樣的話?或者你有更好的主意嗎?
謝謝。
是否'CompositionTarget.Rendering'幫幫我? – 2013-05-10 14:19:17
我的理解是,這個事件在渲染之前被調用,而不是在之後。如果我們必須等待下一個渲染事件才能知道前一個渲染已完成,那麼開始渲染幀已經太晚了。理想情況下,我們希望在重繪D3DImage或其包含的UIElement後立即調用WPF的渲染線程。 – Asik 2013-05-10 14:22:44
你可以做你所有的渲染工作的時間提前(急切地),但是使用'CompositionTarget.Rendering'作爲觸發調用'解鎖()'(如果你的渲染就緒)您'D3DImage',並安排另一渲染?這意味着您只能在WPF的幀速率下渲染和顯示圖像*最多*(但可能小於)。 – 2013-05-10 15:04:23