Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SwapChainPanel性能问题_C#_Performance_Uwp_Direct2d_Sharpdx - Fatal编程技术网

C# SwapChainPanel性能问题

C# SwapChainPanel性能问题,c#,performance,uwp,direct2d,sharpdx,C#,Performance,Uwp,Direct2d,Sharpdx,我正在使用SwapChainPanel渲染控件。render方法附加到CompositionTarget.Rendering事件 另外,调用RenderTarget.CreateCompatibleTarget来创建屏幕外目标。调用compatibleTarget.Bitmap属性来创建一个缓存的位图,该位图可以在屏幕上显示 在每个帧期间: 在屏幕目标上调用BeginDrawing() 如果场景已被程序逻辑失效,则会重新绘制到屏幕外目标 使用背景色清除屏幕上的目标。没有这一点,连续帧以某种方式相

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

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

在每个帧期间:

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

  • 使用背景色清除屏幕上的目标。没有这一点,连续帧以某种方式相互混合

  • 屏幕外位图(缓存在上面)使用屏幕上的目标。DrawBitmap(cachedBitmap)绘制到屏幕上的目标上,不透明度设置为1
  • 调用onScreenTarget.Flush()刷新内容
  • 在屏幕目标上调用
    EndDrawing()
  • 我发现这提供了一个非常低的帧速率

    与WindowRenderTarget的比较

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

    问题:

  • 为什么
    SwapChainPanel
    WindowRenderTarget
    相比产生如此低的帧速率
  • 为什么在第4步绘制位图之前,即使不透明度为1,也必须清除每一帧的屏幕目标
  • 如果没有任何变化,我可以避免步骤1-6吗?这将消耗大约7%的CPU
  • 我认为SwapChainPanel和WindowRenderTarget之间的性能差异不太大,因为它们几乎都直接基于DirectX组件。您可以比较它们的设置以调查性能差异:SwapChainPanel是否与D2D设备相关?devicecontext、swapchain描述和WindowRenderTarget的renderTargetProperty的配置之间的任何差异;位图处理方法之间有什么区别吗

  • 将为正在绘制的图像设置不透明度。但是,对于整个渲染视图,clear()if将显示

  • 当你的意思是“如果没有改变”,我想你的意思是你没有什么可画的。那你当然什么也做不了。否则,需要执行从1到6的步骤

  • 此外,您可以找到一个很好的文档化SwapChainPanel示例。本例中的某些设置用于提高性能

    三,。“如果没有改变”,我的意思是,下一个要绘制的帧与上一个帧相同。合成器仍然每秒回调60次以绘制帧。如何告诉它使用先前绘制的框架?如果我什么也不做,就会出现闪烁。通常,何时调用render()由后端directX函数控制。通常,当应用程序恢复、合成比例更改、大小更改或设备丢失时,会调用它来重新渲染。您可以参考示例代码,找到重新渲染的推荐使用模型。