【问题标题】:SwapChainPanel performance issuesSwapChainPanel 性能问题
【发布时间】:2015-10-17 08:05:31
【问题描述】:

我正在使用SwapChainPanel 来呈现控件。渲染方法附加到CompositionTarget.Rendering 事件。

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

在每一帧中:

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

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

  4. 屏幕外位图(上面缓存)使用onscreenTarget.DrawBitmap(cachedBitmap) 绘制到屏幕目标上,不透明度设置为1。
  5. 调用onScreenTarget.Flush() 刷新内容。
  6. 在屏幕上的目标上调用EndDrawing()

我发现这会产生非常低的帧速率。

与 WindowRenderTarget 的比较

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

问题:

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

【问题讨论】:

    标签: c# performance uwp direct2d sharpdx


    【解决方案1】:
    1. 我认为 SwapChainPanel 和 WindowRenderTarget 之间应该没有太大的性能差异,因为它们几乎都是直接基于 DirectX 组件。您可以比较它们的设置以调查性能差异:SwapChainPanel 是否与 D2D 设备相关? devicecontext、swapchain 描述和 WindowRenderTarget 的 renderTargetProperty 配置之间的任何差异;位图处理方法之间有什么区别吗?

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

    3. 当您的意思是“如果没有任何变化”时,我想您的意思是您没有什么可画的。那你当然什么也做不了。否则,需要从 1 到 6 的步骤。

    此外,您还可以找到一个记录良好的 SwapChainPanel 示例 here。此示例中的一些设置用于提高性能。

    【讨论】:

    • 3. “如果没有任何改变”是指要绘制的下一帧与前一帧相同。合成器仍然每秒调用 60 次来绘制帧。我如何告诉它使用先前绘制的框架?如果我什么都不做,似乎会导致闪烁。
    • 通常何时调用 render() 由后端 directX 函数控制。通常,当应用程序恢复、CompositionScaleChanged、SizeChanged 或设备丢失时,它会被调用以重新渲染。您可以参考示例代码找到重新渲染的推荐使用模型。
    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 2022-01-04
    • 2010-09-05
    • 2012-09-25
    • 2015-05-28
    • 2015-06-20
    • 2018-09-27
    相关资源
    最近更新 更多