C# 使用gdi绘制cpu占用高的问题以及闪烁问题的解决方案

导读:本篇文章讲解 C# 使用gdi绘制cpu占用高的问题以及闪烁问题的解决方案,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1.问题一,当我们直接在form上连续绘制会出现闪烁的情况!

解决方案:启用窗体的双缓冲设置  this.DoubleBuffered = true;或者在构造函数中添加代码以下代码即可:

 this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
                ControlStyles.UserPaint |
                      ControlStyles.AllPaintingInWmPaint, true);

 

2.假设form中有一个panel,此时我需要在窗口加载动态的在panel中添加数量不等的控件,如果不做处理,在加载时也会出现闪烁

解决方案:将panel设置为双缓冲控件,添加一个自定义控件,继承panel,在自定义控件的构造函数中添加代码

 this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
                ControlStyles.UserPaint |
                      ControlStyles.AllPaintingInWmPaint, true);

可以解决闪烁问题,如果编译报错,删除报错行即可!

3.当我开启双缓冲后,绘制正常,一切看起来都是那么完美,但是如果我们查看CPU占用率会发现很高,并随我们绘制的快慢和累计时间而也越来越大!我的电脑基本上上会达到30%左右,这在有的场景下是不能容忍的

经测试发现,关闭双缓冲,cpu占用率下降一半,但是还是很高!并且会闪烁!

临时方案1:究其原因,鼠标移动太快,调用Invalidate次数过多,并且太快!  在mouse_move中使用Thread.sleep(10),来控制刷新频率。当然,界面刷新可能不太流畅!

临时方案2:如何每次刷新的位置固定和区域固定,使用Invalidate的重载,传递区域进去,这样也可以有效减少CPU占用!

解决方案:针对连续绘制的问题,首先我们需要禁用掉Form的双缓冲,然后重载函数OnPaintBackground和Onpaint,

并且注释掉base,调用,实现手动绘制背景,这样,我们再绘制时,背景就不会被擦除!同时绘制的时候,我们只绘制相邻的点,这样避免重绘所有点,带来覆盖和性能损失!在mouse_up时再在OnPaintBackground中绘制背景和所有节点!

当然如果画布上绘制的对象很多,在刷新背景时,会明显看到绘制的先后顺序。我们可以新建一个bitmap,大小和画布一致,然然后将所有对象绘制在bitmap上,绘制完成后使用form的gdi将bitmap绘制在form上即可!

关键代码:

                 Bitmap memoryPanel = new Bitmap (this.Width, this.Height);
                Graphics tempg = Graphics.FromImage(memoryPanel);
                tempg.Clear(this.BackColor);
                tempg.SmoothingMode = SmoothingMode.AntiAlias;
                ReDrawAllElement(tempg);
               e.Graphics.DrawImage(memoryPanel, this.ClientRectangle);

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/51854.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!