SwapChainPanel性能问题

本文关键字:问题 性能 SwapChainPanel | 更新日期: 2023-09-27 18:18:10

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

同时,调用RenderTarget.CreateCompatibleTarget来创建一个屏幕外目标。compatibleTarget.Bitmap属性被调用来创建一个缓存的位图,可以在屏幕上进行位化。

每帧中:

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

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

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

我发现这给出了一个非常低的帧速率。

与windowswrdertarget的比较

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

问题:

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

SwapChainPanel性能问题

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

  2. 设置你正在绘制的图像的不透明度。但是,对于整个渲染视图,可以使用clear()。

  3. 当你说"如果没有什么改变",我想你的意思是你没有什么可画的。那你当然就无能为力了。

此外,您可以在这里找到一个很好的SwapChainPanel文档示例。本例中的一些设置是为了提高性能。