SwapChainPanel性能问题
本文关键字:问题 性能 SwapChainPanel | 更新日期: 2023-09-27 18:18:10
我使用SwapChainPanel
来呈现控件。渲染方法附加到CompositionTarget.Rendering
事件。
同时,调用RenderTarget.CreateCompatibleTarget
来创建一个屏幕外目标。compatibleTarget.Bitmap
属性被调用来创建一个缓存的位图,可以在屏幕上进行位化。
每帧中:
-
BeginDrawing()
在屏幕目标上被调用。 -
如果场景被程序逻辑无效,它将被重绘到屏幕外的目标。
-
使用背景色清除屏幕上的目标。如果没有这个,连续的帧会以某种方式相互混合。
- 屏幕外位图(缓存在上面)绘制到屏幕上的目标使用
onscreenTarget.DrawBitmap(cachedBitmap)
,不透明度设置为1。 - 调用
onScreenTarget.Flush()
来刷新内容。 -
EndDrawing()
在屏幕目标上被调用。
我发现这给出了一个非常低的帧速率。
与windowswrdertarget的比较
为了比较,我使用WindowRenderTarget
在WinForms应用程序中测试了完全相同的场景代码。(SharpDX使这成为可能,因为它可以在UWP和台式机上工作。)这提供了更高的帧速率,并且零稳态CPU消耗。
问题:
- 为什么
SwapChainPanel
产生的帧率比WindowRenderTarget
低? - 为什么有必要在第4步绘制位图之前清除每帧屏幕上的目标,即使不透明度为1?
- 如果没有任何改变,我可以避免步骤1-6吗?这大约消耗7%的CPU。
-
我不认为SwapChainPanel &windowdertarget,因为它们几乎都是直接基于DirectX组件。您可以比较它们的设置来调查性能差异:SwapChainPanel与D2D设备相关吗?devicecontext, swapchain description的配置和windowwrdertarget的renderTargetProperty之间的任何差异;位图处理方法之间有什么区别吗?
-
设置你正在绘制的图像的不透明度。但是,对于整个渲染视图,可以使用clear()。
-
当你说"如果没有什么改变",我想你的意思是你没有什么可画的。那你当然就无能为力了。
此外,您可以在这里找到一个很好的SwapChainPanel文档示例。本例中的一些设置是为了提高性能。