SwapChainPanel性能问题

时间:2015-10-17 08:05:31

标签: c# performance uwp direct2d sharpdx

我使用SwapChainPanel渲染控件。 render方法附加到CompositionTarget.Rendering事件。

此外,调用RenderTarget.CreateCompatibleTarget来创建屏幕外目标。调用compatibleTarget.Bitmap属性来创建可以在屏幕上显示的缓存位图。

在每个框架中:

  1. BeginDrawing()在屏幕目标上调用。
  2. 如果场景已被程序逻辑无效,则会重新绘制到屏幕外目标。

  3. 使用背景颜色清除屏幕上的目标。如果没有这个,连续的框架会以某种方式相互融合。

  4. 使用onscreenTarget.DrawBitmap(cachedBitmap)将屏幕外位图(上方缓存)绘制到屏幕目标上,并将不透明度设置为1.
  5. 调用
  6. onScreenTarget.Flush()来刷新内容。
  7. EndDrawing()在屏幕目标上调用。
  8. 我发现这会产生非常低的帧速率。

    与WindowRenderTarget比较

    为了进行比较,我使用WindowRenderTarget在WinForms应用程序中测试了完全相同的场景代码。 (SharpDX使其成为可能,因为它适用于UWP和桌面。)这提供了更高的帧速率和零稳态CPU消耗。

    问题:

    1. 为什么SwapChainPanelWindowRenderTarget相比产生如此低的帧速率?
    2. 为什么有必要在步骤4中绘制位图之前清除每帧的屏幕目标,即使不透明度为1?
    3. 如果没有任何改变,我可以避免步骤1-6吗?这消耗了大约7%的CPU。

1 个答案:

答案 0 :(得分:0)

  1. 我认为SwapChainPanel&和SwapChainPanel之间的性能差异太大了。 WindowRenderTarget,因为它们几乎都直接基于DirectX组件。您可以比较他们的设置以调查性能差异:SwapChainPanel与D2D设备有关吗? devicecontext,swapchain description和WindowRenderTarget的renderTargetProperty配置之间的任何差异;位图处理方法之间有什么区别吗?

  2. 为您正在绘制的图像设置了不透明度。但是,对于整个渲染视图,clear()if。

  3. 当你的意思是"如果没有改变",我认为你的意思是你没有什么可画的。那当然你什么都不能做。否则,从1到6的步骤是必要的。

  4. 此外,您可以找到一个很好的SwapChainPanel示例here。此示例中的某些设置用于提高性能。