【问题标题】:Why the WPF/RotateTransform uses so much CPU?为什么 WPF/RotateTransform 使用这么多 CPU?
【发布时间】:2009-07-17 09:58:13
【问题描述】:

重现步骤:

  1. 创建新的解决方案/添加新的 WPF 应用程序项目。
  2. 在主窗口中只放置一个画布。
  3. 创建一个 RotateTransform + PageUp/Down 事件以将角度增加 +-10。
  4. 在画布上放置 50 个多边形
  5. 按 PageUp/Down(并按住)

在我的电脑上,CPU 使用率为 80%。

  1. 现在尝试放置 1000 个多边形并按 PageUp/Down - CPU 可以以 1-2 帧/秒的速度达到 100%。

我检查了 RenderCapability.Tier,它是 2 - 这意味着它应该通过硬件渲染所有内容。

但它不起作用,为什么?

【问题讨论】:

    标签: wpf performance hardware rendering


    【解决方案1】:

    更多信息会很有用,例如您使用的多边形类型、您的显卡以及您使用的 WPF 版本。

    我尝试了您的示例,并且对 500 个简单多边形没有任何问题。 (核心 2 双核,8800 GTS)。您的示例和其他时候,当您的内容相当复杂且不经常更改但您正在对其进行转换时,可以从BitmapCache 中受益匪浅。

    <Canvas.CacheMode>
        <BitmapCache />
    </Canvas.CacheMode>
    

    使用 BitmapCache,您应该能够转换任意数量的元素,尽管在需要重新渲染时仍然会影响性能。如果你使用复杂的路径,你也可以试试freezing他们。

    【讨论】:

      【解决方案2】:

      WPF 仍会计算需要在屏幕上绘制的位置。您没有指定这是布局还是渲染转换,因为这会产生性能差异。你需要小心你如何使用你的转换为msdn points out

      如果在不需要布局系统完全通过的场景中调用LayoutTransform,可能会导致应用程序性能下降。当您将 LayoutTransform 应用于 Panel 的 Children 集合时,它会触发布局系统的新通道并强制重新测量和重新排列所有屏幕上的对象。如果您要更新完整的应用程序用户界面 (UI),那么此功能可能正是您所需要的。但是,如果您不需要完整的布局传递,请使用 RenderTransform 属性,该属性不会调用布局系统,因此对于这种情况通常是更好的选择。

      【讨论】:

      • 我承认我有点困惑。这就是我所做的: RotateTransform rotation = new RotateTransform(); TransformGroup tg = new TransformGroup();多边形.RenderTransform = tg; canvas.Children.Add(多边形);我猜你的答案是 RenderTransform。
      • (对不起,我忘了 tg.Children.Add(rotation);)
      猜你喜欢
      • 1970-01-01
      • 2021-08-02
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      相关资源
      最近更新 更多