我正在使用SwapChainPanel
來呈現控件。渲染方法附加到CompositionTarget.Rendering
事件。SwapChainPanel性能問題
此外,調用RenderTarget.CreateCompatibleTarget
來創建屏幕外目標。 compatibleTarget.Bitmap
屬性被調用來創建一個緩存位圖,可以在屏幕上blitted。
在每個幀期間:
BeginDrawing()
被稱爲上的屏幕目標。如果場景已被程序邏輯無效,它將重新繪製到屏幕外目標。
使用背景顏色清除屏幕上的目標。沒有這個,連續的幀就會以某種方式混合到一起。
- 屏外位圖(上面緩存)被繪製到使用
onscreenTarget.DrawBitmap(cachedBitmap)
屏幕目標,不透明度設置爲1。 onScreenTarget.Flush()
被稱爲沖洗內容。EndDrawing()
在屏幕上的目標上被調用。
我發現這給出了非常低的幀速率。
比較與WindowRenderTarget
爲了比較,我使用WindowRenderTarget
測試完全相同的場景代碼在WinForms應用程序。 (SharpDX使它成爲可能,因爲它可以在UWP和臺式機上運行)。這樣可以實現更高的幀速率和零穩態CPU消耗。
問題:
- 爲什麼
SwapChainPanel
產生這樣的低幀率相比WindowRenderTarget
? - 即使在不透明度爲1時,爲什麼在步驟4中繪製位圖之前每幀都需要清除屏幕上的目標?
- 如果沒有任何變化,我可以避免步驟1-6嗎?這消耗了大約7%的CPU。
3.如果「如果沒有改變」,我的意思是下一幀繪製與前一幀相同。合成器仍然每秒回撥60次以畫出幀。我怎麼能告訴它使用以前繪製的框架?如果我什麼都不做,閃爍似乎會導致。 – bright
通常何時調用render()是由後端directX函數控制的。通常會在應用程序恢復時或CompositionScaleChanged或SizeChanged或設備丟失時重新呈現。您可以參考示例代碼來找出推薦的重新渲染使用模型。 –