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的宽度来进行举例,可能在 ...
随机推荐
- 超详细!使用 LVS 实现负载均衡原理及安装配置详解---转
负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...
- STL——容器(List)list 的大小操作
ist.size(); //返回容器中元素的个数 1 #include <iostream> 2 #include <list> 3 4 using namespace std ...
- 安卓和ios的app证书过期的相关问题汇总
一,ios的APP的发布流程请见:ios的APP的发布流程 http://www.jianshu.com/p/b1b77d804254 这篇文章写得很好很全面 二,app证书过期了怎么办: IOS的情 ...
- 网络编程-python实现-UDP(1.1.2)
@ 目录 1.UDP是什么 2.代码实现 1.UDP是什么 Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol).UDP ...
- 第九章 Nacos Config--服务配置
今天咱们接着 上一篇 第八章 SMS–短信服务 继续写 SpringCloud Alibaba全家桶 -> 第九章 Nacos Config–服务配置,废话不多说,开干 9.1 服务配置中心介绍 ...
- matlab练习程序(正态分布贝叶斯分类)
clear all;close all;clc; randn('seed',0);mu1=[0 0];S1=[0.3 0;0 0.35];cls1_data=mvnrnd(mu1,S1,1000);p ...
- Java基础进阶:APi使用,Math,Arrarys,Objects工具类,自动拆装箱,字符串与基本数据类型互转,递归算法源码,冒泡排序源码实现,快排实现源码,附重难点,代码实现源码,课堂笔记,课后扩展及答案
要点摘要 Math: 类中么有构造方法,内部方法是静态的,可以直接类名.方式调用 常用: Math.abs(int a):返回参数绝对值 Math.ceil(double a):返回大于或等于参数的最 ...
- Core3.0读取appsetting.json中的配置参数
前言 方法很多,下面的例子也是从百度上搜索到的,原文链接已经找不到了. 方法1 1.添加NovelSetting节点,写入相关的配置信息 2.创建类,字段与上面的配置一致 3.StartUp.cs中获 ...
- 5.自定义view-评分控件RatingBar
1.效果 2.实现原理 1.根据分数分别画选中的星星.正常的星星 2.onTouchEvent 中获取点击.滑动的位置,修改分数,在通过invalidate() 去重新绘制 核心代码: @Overri ...
- ElasticSearch设置用户名密码访问
版本号:7.3.1 1.需要在配置文件中开启x-pack验证, 修改config目录下面的elasticsearch.yml文件,在里面添加如下内容,并重启. xpack.security.enabl ...