zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    Vue
    多线程
    多进程进阶
    CentOS7中安装MySQL
    socket
    回顾
    Hibernate学习一:Hebinate入门以及一些小问题
    struts2学习二:Tomcat的部署目录和访问路径问题
    struts2学习一:hello struts2及struts2环境配置中遇到的问题
    Scanner几个问题与正则简介
  • 原文地址:https://www.cnblogs.com/8u7tgyjire7890/p/13374720.html
Copyright © 2011-2022 走看看