WPF中的一个bug造成CPU资源拉满
2023-04-18 16:57:23 时间
在 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],除非他脑子瓦特了。
相关文章
- 速度和性能狂卷,.NET 7有多少人买单
- 风云再续:他抖任他抖,IO诊断在我手
- 在开源社区的强烈抗议下 微软逆转了有争议的.NET变化
- Windows 11 的 Microsoft Store 上架 Visual Studio
- 微软:.NET 平台采用率的提升归功于开源
- 从文件下载视角来理解Web API
- 你以为的ASP.NET文件上传大小限制是你以为的吗
- 在Ubuntu中搭建.NET开发环境
- gRPC入门与实操(.NET篇)
- Rails MVC 和 CRUD(1)
- FANUC机器人PROFINET双通道板卡组态
- 网络IO
- 开源自己编写的半人工标注平台PaddleOCRLabel(.NET Winform版本)
- 还在死磕Ajax,不如看看Fetch ?
- 【ASP.NET Core】动态映射MVC路由
- 【ASP.NET Core】用配置文件来设置授权角色
- 【ASP.NET Core】按用户等级授权
- 【ASP.NET Core】自定义Session的存储方式
- 【ASP.NET Core】选项类的依赖注入
- 【ASP.NET Core】选项模式的相关接口