为什么WPF / RotateTransform使用如此多的CPU?

时间:2009-07-17 09:58:13

标签: wpf performance hardware rendering

重现的步骤:

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

    1. 现在尝试放置1000个多边形并按PageUp / Down - CPU可以1-2帧/秒达到100%。
    2. 我检查了RenderCapability.Tier,它是2 - 意味着它应该通过硬件呈现所有内容。

      但它不起作用,为什么?

2 个答案:

答案 0 :(得分:2)

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

我尝试了你的例子,500个简单多边形没有任何问题。 (Core 2 Duo,8800 GTS)。你的例子以及其他时候你有相当复杂的内容不会经常变化,但你正在改变它可以从BitmapCache大大受益。

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

使用BitmapCache,您应该能够根据需要转换任意数量的元素,尽管只要需要重新渲染,您仍然会遇到性能损失。如果您使用的是复杂路径,也可以尝试使用freezing

答案 1 :(得分:1)

WPF仍然会对需要在屏幕上绘制的内容进行计算。您尚未指定这是布局还是渲染转换,因为这会产生性能差异。您需要小心将变换用作msdn points out

  

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