给 WPF 的 Pen 的 DashStyle 属性设置 0 0 的虚线,在绘制几何图形时,绘制的几何图形的尺寸将关联渲染线程所使用的 CPU 资源。大约在周长大于 500 时,将可以从任务管理器上看到高 CPU 占用

感谢 Ryzen 大佬找到此问题,我只是帮他报告给 WPF 官方和记录的工具人

在 WPF 里面,可以使用 DashStyle 属性实现虚线的功能,通过放入 double 数组,即可实现间隔镂空功能,然而如果给定的是 0 0 的数组,那就意味着差不多是在绘制零宽度再空出零宽度。根据不靠谱的高数可以了解到,这是一个震荡收敛,要么整个线条绘制的是实线,要么就是空白

这也就存在一个问题,这几乎是求一个线段里有多少个无穷小的点组成的问题。好在计算机是有精度限制的,但即使有精度限制,所需要计算量也是非常大的,这也就让渲染线程炸掉了

如下面的逗比代码,我在定义的 Foo 类的 OnRender 方法里面,加上如下代码

    class Foo : FrameworkElement
{
public Foo()
{
Width = 500;
Height = 100;
} protected override void OnRender(DrawingContext drawingContext)
{
var pen = new Pen()
{
Brush = Brushes.Black,
DashStyle = new DashStyle(new double[] { 0, 0 }, 0),
Thickness = 10,
}; var geometry = new LineGeometry(new Point(0, 0), new Point(500, 0)); drawingContext.DrawGeometry(Brushes.Beige, pen, geometry); base.OnRender(drawingContext);
}
}

将以上的 Foo 类加入到界面里面,界面的 XAML 代码里放如一个 Grid 方便后台代码编写:

    <Grid x:Name="Grid">

    </Grid>

在后台代码,为了让大家更好看到效果,决定在鼠标移动的时候,不断设置 Foo 刷新:

    public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent(); Foo = new Foo();
Grid.Children.Add(Foo); MouseMove += MainWindow_MouseMove;
} private Foo Foo { get; } private void MainWindow_MouseMove(object sender, MouseEventArgs e)
{
Foo.InvalidateVisual();
}
}

尝试执行代码,然后在 MainWindow 里移动鼠标,同时打开任务管理器,可以看到任务管理器的 CPU 有大量占用

此问题已报告给 WPF 官方,请看 WPF set 0,0 dashes to Pen DashStyle will cause high CPU usage · Issue #5874 · dotnet/wpf

不过我预计这个问题也许会分给我去解决

本文所有代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 5137479a45ce3f52ff1cf5c5d6ed0c20dfbeaeb3

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git

获取代码之后,进入 KolefijurfeLonaynallcay 文件夹

WPF 给 Pen 的 DashStyle 设置 0 0 的虚线数组将会让渲染线程消耗大量 CPU 资源的更多相关文章

  1. WPF 自定义 MessageBox (相对完善版 v1.0.0.6)

    基于WPF的自定义 MessageBox. 众所周知WPF界面美观.大多数WPF元素都可以简单的修改其样式,从而达到程序的风格统一.可是当你不得不弹出一个消息框通知用户消息时(虽然很不建议在程序中频繁 ...

  2. js中setTimeout()时间参数设置为0的探讨

    起因源于一道前端笔试题: var fuc = [1,2,3]; for(var i in fuc){ setTimeout(function(){console.log(fuc[i])},0); co ...

  3. 给div设置background-color: rgba(0, 0, 0, 0.2)属性,并加了css3动画--opacity动画淡出动画,之后div子元素的字体会抖一下

    问题:给div设置background-color: rgba(0, 0, 0, 0.2)属性,并加了css3动画--opacity动画淡出动画,之后div子元素的字体会抖一下: 解决:animati ...

  4. Access数据库中Sum函数返回空值(Null)时如何设置为0

    在完成一个Access表中数据统计时,需要统计指定字段的和,使用到了Sum函数,但统计时发现,指定条件查询统计时有可能返回空值(Null),导致对应字段显示为空白,正常应显示为0.基本思路是在获取记录 ...

  5. CentOS下源码安装vsftpd-3.0.0,并设置指定用户访问指定目录(附带完整配置文件)

    1.卸载系统已经存在的ftp服务器 因为是源码安装,所以不能通过rpm -qa的方式查看是否已经安装ftp服务器,可以通过find / | grep vsftp*方式查看系统中存在哪些与vsftpd相 ...

  6. vue2.5.2版本 :MAC设置应用在127.0.0.1:80端口访问; 并将127.0.0.1指向www.yours.com ;问题“ Invalid Host header”

    0.设置自己的host文件,将127.0.0.1指向自己想要访问的域名 127.0.0.1 www.yours.com 1.MAC设置应用在127.0.0.1:80端口访问: config/index ...

  7. 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式。 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Compl

    因标题框有限,题目未显示完整,以下再放一份: 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Compl ...

  8. NPOI2.2.0.0实例详解(八)—设置EXCEL单元格【数字格式】

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. vue2项目 :在hosts里面配置了装逼的模式。设置应用在127.0.0.1:80端口访问; 并将127.0.0.1指向www.yours.com ;问题“ Invalid Host header”

    转自博客:https://www.cnblogs.com/cynthia-wuqian/p/8575401.html 1.MAC设置应用在127.0.0.1:80端口访问: config/index. ...

  10. 虚拟机vmware10.0.0里设置Suse Linux Enterprise 11系统静态IP上网

    http://blog.csdn.net/usbdrivers/article/details/50035615 首次在虚拟机里安装Suse Linux Enterprise 11,采用NET方式能够 ...

随机推荐

  1. Linux基础操作一

    开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 开启虚拟机→Username:root→Password:"(注册时所创建的密码,比如"123 ...

  2. 一键生成项目 SpringBoot+MyBatis代码生成器 支持Oracle MySQL PostgreSQL

    下载地址 https://github.com/lxw112190/lxw_Helper 如果觉得github下载慢的,可以加我QQ(819069052)我发给你,或者加QQ交流群:758616458 ...

  3. 温馨提示:不注意这几点,PDT(产品开发团队)就得散!

    在IPD(集成产品开发)体系中,PDT(Product Development Team,产品开发团队)发挥着至关重要的作用.PDT是一个跨部门.跨职能的协作团队,其成员来自不同的专业领域,包括研发. ...

  4. arch 安装xfce

    参照 https://www.cnblogs.com/3V4NZ/p/15330275.html 1.安装linux显示服务器 pacman -S xorg Xorg是一个开源的X Window系统的 ...

  5. 程序员必备上传服务器Xftp及连接服务器工具Xshell

    1.下面截图为破解工具,点击执行就可以用了 压缩包放云盘了,私信我即可 (不知道咋上传,有点尴尬Q.Q)

  6. 【直播回顾】OpenHarmony知识赋能五期第三课——多媒体整体介绍

    5月5日晚上19点,知识赋能第五期第三节课<OpenHarmony标准系统多媒体子系统整体介绍>,在OpenHarmony开发者成长计划社群内成功举行. 本期课程,由深开鸿资深技术专家郭岳 ...

  7. 提升面试成功率:深入理解 C++ 11 新特性

    C++11是C++语言的一个重大更新,引入了许多新特性,包括自动类型推导.lambda表达式.右值引用.智能指针等等.这些新特性使得C++更加现代化.高效.易用.也是面试容很容易被问到一个问题,下面我 ...

  8. HarmonyOS账号服务,畅行鸿蒙生态所有应用与服务

    账号对于用户来说并不陌生,在购买新设备或者使用新应用的时候,用户常常会被引导注册或者登录账号,账号就是用户在这些设备或应用内的通行证.根据华为上半年的一项统计,整体上中国网民人均下载App量在68个, ...

  9. 无监督多视角行人检测 Unsupervised Multi-view Pedestrian Detection

    无监督多视角行人检测 Unsupervised Multi-view Pedestrian Detection 论文url:https://arxiv.org/abs/2305.12457 论文简述 ...

  10. nginx重新整理——————nginx 模块[十]

    前言 简单介绍一下nginx的模块. 正文 https://nginx.org/en/docs/ 这里面可以看到官方模块. 比如打开这个模块: https://nginx.org/en/docs/ht ...