wpf 中 Ellipse 对象对动画性能的影响

vs2019 .NetFramework 4.8 win10-64 1909  

接手一个wpf项目,某窗口中包含大量的 Shape 对象(线,矩形,圆形等).

这些内容要匀速的向左平移,类似于游戏"太鼓达人".

方案是使用 CompositionTarget.Rendering 在每帧中设置内容的 TranslateTransform.X

问题是匀速平移时画面经常卡顿,同时cpu和gpu的占用都不高.

最后发现卡顿是一些设置了 Stroke 的 Ellipse 对象造成的.把这些 Ellipse 的 Stroke 设为 null 后,画面明显流畅了.

 

后续实验(全部在1920*1080分辨率下最大化窗口完成):

1把这些 Ellipse 替换为 Rectangle ,Stroke 仍然保留, 画面依然流畅.

结论:

相比于其它 Shape,  Ellipse 的 Stroke 非常容易造成画面卡顿.

 

2使用 DrawingVisual 的方案,替换直接在窗口放置 Shape 

  在wpf的文档里面说 DrawingVisual  相比 Shape 是更轻量级的可视对象,当需要较高的图形性能要求时,应该使用 DrawingVisual,那么效果如何呢?

  我实验了两种方式分别创建了1000列*30行个 Ellipse 和 Rectangle 对象,进行上述的平移动画,

  发现不管是帧率还是cpu和gpu的占用基本无差别.

  这里猜想一下原因:文档中说 DrawingVisual 之所以更轻量,是因为其不提供布局功能,而布局功能应该是由 CPU 完成. WPF发布于2006年,也许对于当时的cpu而言,布局会显著影响性能,但对现在的cpu而言,根本不算什么.这也与前面即使画面卡顿,cpu和gpu占用都不高的情况相符.

结论:

  时至今日,根本不需要为了节省一点难以检测的布局性能去使用 DrawingVisual .

  wpf的UI性能问题估计还是在DWM上

  参考资料 ,其中解释了为什么UWP程序的UI性能显著高于WPF:

  https://lindexi.gitee.io/post/UWP-%E5%92%8C-WPF-%E5%AF%B9%E6%AF%94.html

 

 

 

 

 

posted @ 2020-07-24 22:46  xiejiang  阅读(678)  评论(0编辑  收藏  举报