写点什么

WPF 中的一个 bug 造成 CPU 资源拉满

作者:喵叔
  • 2022 年 1 月 01 日
  • 本文字数:898 字

    阅读完需:约 3 分钟

在 WPF 里可以使用 DashStyle 属性实现虚线的功能,通过传入 double 数组即可实现这个功能,但是如果传入的数组是[0,0]就表示先绘制零宽度线条,再空出零宽度的间隔。这其实是一个震荡收敛,要么整条线绘制的是实线,要么就是什么也不绘制,成为空白。那么就存在一个问题,就是求一个线段有多少个无穷小的点组成的问题。计算机虽然有精度限制,但这个问题所需要计算量非常大,因此会造成渲染线程使得 CPU 直接拉满。例如下面这段代码:


    class Test : FrameworkElement    {        public Test()        {            Width = 1000;            Height = 1000;        }        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);        }    }
复制代码


将以上的 Test 类放到界面里面,并在 XAML 代码里中放入 Grid:


<Grid x:Name="Grid"></Grid>
复制代码


在代码中,我们设置鼠标移动的时候设置刷新 Test:


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


运行上述代码,并且鼠标在窗体内华东,我们在任务管理器中可以看到 CPU 使用率接近于 100%。关于这个问题国内已经有人报告给了 WPF 的开发团队,但目前 WPF 开发团队并未回复,而且也没有发布补丁,但是就这个问题形成的原因来说,一般在项目中几乎遇不到,因为没有人会将 DashStyle 属性设置为[0,0],除非他脑子瓦特了。

用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
WPF中的一个bug造成CPU资源拉满