2015-10-17 42 views
0

我正在使用SwapChainPanel來呈現控件。渲染方法附加到CompositionTarget.Rendering事件。SwapChainPanel性能問題

此外,調用RenderTarget.CreateCompatibleTarget來創建屏幕外目標。 compatibleTarget.Bitmap屬性被調用來創建一個緩存位圖,可以在屏幕上blitted。

在每個幀期間:

  1. BeginDrawing()被稱爲上的屏幕目標。
  2. 如果場景已被程序邏輯無效,它將重新繪製到屏幕外目標。

  3. 使用背景顏色清除屏幕上的目標。沒有這個,連續的幀就會以某種方式混合到一起。

  4. 屏外位圖(上面緩存)被繪製到使用onscreenTarget.DrawBitmap(cachedBitmap)屏幕目標,不透明度設置爲1。
  5. onScreenTarget.Flush()被稱爲沖洗內容。
  6. EndDrawing()在屏幕上的目標上被調用。

我發現這給出了非常低的幀速率。

比較與WindowRenderTarget

爲了比較,我使用WindowRenderTarget測試完全相同的場景代碼在WinForms應用程序。 (SharpDX使它成爲可能,因爲它可以在UWP和臺式機上運行)。這樣可以實現更高的幀速率和零穩態CPU消耗。

問題:

  1. 爲什麼SwapChainPanel產生這樣的低幀率相比WindowRenderTarget
  2. 即使在不透明度爲1時,爲什麼在步驟4中繪製位圖之前每幀都需要清除屏幕上的目標?
  3. 如果沒有任何變化,我可以避免步驟1-6嗎?這消耗了大約7%的CPU。

回答

0
  1. 我不認爲應該有SwapChainPanel & WindowRenderTarget之間太大的性能差異,因爲兩者幾乎直接基於DirectX組件。您可以比較它們的設置以調查性能差異:SwapChainPanel與D2D設備相關? devicecontext,swapchain描述和WindowRenderTarget的renderTargetProperty的配置之間的任何差異;位圖處理方法有沒有區別?

  2. 不透明度設置爲您正在繪製的圖像。但是,clear()if爲整個渲染視圖。

  3. 當你的意思是「如果沒有改變」,我認爲你的意思是你沒有任何繪畫。那麼當然你什麼都不能做。否則,從1到6的步驟是必需的。

此外,你可以找到一個良好的記錄SwapChainPanel示例here。本例中的一些設置用於提高性能。

+0

3.如果「如果沒有改變」,我的意思是下一幀繪製與前一幀相同。合成器仍然每秒回撥60次以畫出幀。我怎麼能告訴它使用以前繪製的框架?如果我什麼都不做,閃爍似乎會導致。 – bright

+0

通常何時調用render()是由後端directX函數控制的。通常會在應用程序恢復時或CompositionScaleChanged或SizeChanged或設備丟失時重新呈現。您可以參考示例代碼來找出推薦的重新渲染使用模型。 –