加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – System.Drawing对我们想做的事情来说太慢了吗?

发布时间:2020-12-16 01:39:09 所属栏目:百科 来源:网络整理
导读:我目前正在开发win表单应用程序的用户界面.主窗口是无边框形式,其表面区域几乎完全在Form.Paint事件中呈现.创建一个后台缓冲区并按常规绘制: private void form_Paint(object sender,PaintEventArgs e) { e.Graphics.DrawImage(BackBuffer,e.ClipRectangle,
我目前正在开发win表单应用程序的用户界面.主窗口是无边框形式,其表面区域几乎完全在Form.Paint事件中呈现.创建一个后台缓冲区并按常规绘制:

private void form_Paint(object sender,PaintEventArgs e) {
  e.Graphics.DrawImage(BackBuffer,e.ClipRectangle,GraphicsUnit.Pixel);
}

后缓冲区的某些区域在各种条件下重绘;鼠标悬停效应很常见.仔细重绘的类只会使适用的区域无效.尽管如此,只需在表格上滑动鼠标就足以将高端CPU驱动到> 50秒使用几秒钟.

我已经分析了应用程序,并且在上面调用DrawImage时,超过80%的CPU时间被烧毁.我知道GDI很慢并且没有(很少?)使用GPU ……并且应用程序的目标平台并不能保证GPU不会首先集成.但我不知道这是坏事.

我是否应该面对这样一个事实:GDI对于我们想要做的事情来说还不够快,或者是否有机会改进代码呢?

-编辑-

BackBuffer表示在系统启动期间创建的位图.它的大小与屏幕分辨率相匹配.在诸如鼠标悬停和点击之类的各种事件期间,在其上绘制了各种区域.它的创建相当简单:

this.BufferBmp = new Bitmap(screenWidth,screenHeight);
this.Gfx = Graphics.FromImage(BufferBmp);

Gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;

解决方法

创建自己的“后台缓冲区”而不是使用内置的双缓冲支持很难获得高效率.重要的是缓冲区的像素格式.在大多数现代机器上,无论如何我尝试过,32bppPArgb格式的速度是其他任何机器的十倍.支持内置的双缓冲支持,以实现卓越的性能.

另一种可能的损失是你试图保持裁剪区域尽可能小.当区域变得复杂时,这可以字节.如果你让快速鼠标移动产生小的矩形更新区域,听起来就像你那么接近.当绘画落后时,它几乎总是会因为鼠标获得更高的优先级,你可以建立一个非常复杂的小矩形链.首先通过使整个区域无效来测试它.接下来的方法是自己扩展区域,始终保持一个矩形. OnPaint运行时重置.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读