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
wpf 中 Ellipse 对象对动画性能的影响的更多相关文章
- WPF中的简单水动画
原文 https://stuff.seans.com/2008/08/21/simple-water-animation-in-wpf/ 很多年前(80年代中期),我在一家拥有Silicon Grap ...
- WPF中加载高分辨率图片性能优化
在最近的项目中,遇到一个关于WPF中同时加载多张图片时,内存占用非常高的问题. 问题背景: 在一个ListView中同时加载多张图片,注意:我们需要加载的图片分辨率非常高. 代码: XAML: < ...
- WPF教程九:理解WPF中的对象资源
在WPF中,所有继承自FrameworkElement的元素都包含一个Resources属性,这个属性就是我们这篇要讲的资源. 这一篇讲解的资源是不是上一篇的程序集资源(那个是在编译过程中打包到程序集 ...
- css属性的选择对动画性能的影响
现在手机的占比越来越高,各种酷炫页面层出不穷,这些特效都离不开css动画.说到css动画,主流的情况也就无非这两大类:位移和形变.而我们在写一个动画特效的过程中,如何去提升它的性能呢?当然首先我们需要 ...
- 程序中使用now()函数对性能的影响
这两天从某平台的慢查询日志中发现了一些很简单的,原本执行时间在0.01-0.03s的SQL,慢查询日志中记录的执行时间在2s左右. 排查后发现,表设计及索引建设均没有什么问题.但是SQL语句中使用了n ...
- 示例:WPF中自定义StoryBoarService在代码中封装StoryBoard、Animation用于简化动画编写
原文:示例:WPF中自定义StoryBoarService在代码中封装StoryBoard.Animation用于简化动画编写 一.目的:通过对StoryBoard和Animation的封装来简化动画 ...
- 《深入浅出WPF》笔记——绘画与动画
<深入浅出WPF>笔记——绘画与动画 本篇将记录一下如何在WPF中绘画和设计动画,这方面一直都不是VS的强项,然而它有一套利器Blend:这方面也不是我的优势,幸好我有博客园,能记录一 ...
- WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object)
原文 WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object) 众所周知的,WPF 中多数对象都继承自 Dispatch ...
- (原创)2. WPF中的依赖属性之二
1 依赖属性 1.1 依赖属性最终值的选用 WPF属性系统对依赖属性操作的基本步骤如下: 第一,确定Base Value,对同一个属性的赋值可能发生在很多地方.还用Button的宽度来进行举例,可能在 ...
随机推荐
- 题解-Railgun
题面 Railgun \(T\) 组测试数据,每次给定 \(n,k\),求(\(F(i)\) 为斐波那契数列第 \(i\) 项): \[\sum_{1\le x_i\le n(1\le i\le k) ...
- (window)Docker的镜像使用
镜像加速 镜像默认是通过 DockerHub 拉取的,国内可能有些困难,会报以下错误: net/http: TLS handshake timeout 所以,需要配置国内的加速服务地址: 官方地址:h ...
- 【转载】Django,学习笔记
[转自]https://www.cnblogs.com/jinbchen/p/11133225.html Django知识笔记 基本应用 创建项目: django-admin startproje ...
- learn Docker from scratch (1)
一.前言 Docker容器一个很有趣的东西,下面链接内容适合docker的入门非常棒! 链接如下: http://www.ruanyifeng.com/blog/2018/02/docker-tuto ...
- Eureka系列(七) 服务下线Server端具体实现
服务下线的大致流程图 下面这张图很简单地描述了Server端服务下线的大致流程: 服务下线Server端实现源码分析 Eureka服务实现是通过Server端InstanceResource ...
- MVC 微信网页授权 获取 OpenId
最近开发微信公众平台,做下记录,以前也开发过,这次开发又给忘了,搞了半天,还是做个笔记为好. 注意框架为MVC 开发微信公众平台.场景为,在模板页中获取用户openid,想要进行验证的页面,集成模板页 ...
- (六)、mv-一个具备更改文件名和移动文件的命令
一.mv的命令格式和作用 既可以在不同目录之间移动文件和目录,也可以在同一目录下对文件或者目录重命名,如果目标文件已经存在,则可覆盖他,若 目标文件或者目录不存在,则创建他:移动的dst必须为目录 命 ...
- (三)、vim的移动(旋转,跳跃)
一.以word为单位的移动 1.w 向后移动到后一个单词词头,取自"word" This is a line with example text ----->--->- ...
- JavaSwing 船只停靠管理可视化(四)
JavaSwing 船只停靠管理可视化(一) JavaSwing 船只停靠管理可视化(二) JavaSwing 船只停靠管理可视化(三) JavaSwing 船只停靠管理可视化(四) JavaSwin ...
- JavaDailyReports10_05
1 package varycode; 2 3 import java.util.ArrayList; 4 import java.util.Random; 5 6 public class Vary ...