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的宽度来进行举例,可能在 ...
随机推荐
- Java并发编程的艺术(八)——锁相关
锁的作用 控制多个线程访问共享资源. 线程协作 Lock接口 特点 与synchronized类似的同步功能,只是需要显式地获取和释放锁.缺少隐式获取锁的便捷性. 拥有锁获取与释放的可操作性.可中断的 ...
- mac中nvm的安装和使用
nvm 是 Mac 下的 node 管理工具,如果是管理 Windows 下的 node,可以使用 nvmw 或 nvm-windows . 一.若电脑中已安装node,需先卸载.参考学习的文档:ht ...
- Flask开发技巧之参数校验
Flask开发技巧之参数校验 目录 Flask开发技巧之参数校验 1.请求参数分类 2.解决方案使用到的库 3.针对url查询参数与一般json格式 4.针对复杂json格式数据 本人平时开发中使用的 ...
- Chrome DevTools — Network -- 转载
转载地址:https://segmentfault.com/a/1190000008407729 记录网络请求 默认情况下,只要DevTools在开启状态,DevTools会记录所有的网络请求,当然, ...
- Git:git常用命令
1.版本控制工具 一个可以管理和追踪软件代码的工具. 分类: 集中式版本控制工具:SVN 分布式版本控制工具:Git 2.Git 的概念: 工作区:就是 ...
- MySQL锁(一)全局锁:如何做全库的逻辑备份?
数据库锁设计的初衷是处理并发问题,这也是数据库与文件系统的最大区别. 根据加锁的范围,MySQL里大致可以分为三种锁:全局锁.表锁和行锁.接下来我们会分三讲来介绍这三种锁,今天要讲的是全局锁. 全局锁 ...
- idea导入配置SSM项目,并进行打包
idea确实是一个功能强大的开发工具,但是配置项目太复杂,每次都要花费很长的时间在配置上. 关于SSM项目导入,配置,打包,看这篇就够了,百试不爽.
- 拒绝造轮子!如何移植并使用Linux内核的通用链表(附完整代码实现)
在实际的工作中,我们可能会经常使用链表结构来存储数据,特别是嵌入式开发,经常会使用linux内核最经典的双向链表 list_head.本篇文章详细介绍了Linux内核的通用链表是如何实现的,对于经常使 ...
- burp中获取token进行暴力破解
选中线程设成1
- WEBSERVICE 分析器错误信息: 未能创建类型
问题描述 分析器错误 说明: 在分析向此请求提供服务所需资源时出错.请检查下列特定分析错误详细信息并适当地修改源文件. 分析器错误信息: 未能创建类型"Service1". 源错误 ...