DrawImage导致的屏幕闪烁(非频繁刷新)

varlj 2010-01-04 01:54:58
使用GDI+在PANEL上画图,结果发现在DrawImage的时候速度太慢,导致屏幕会很明显的闪一下
程序在点击时刷新界面

代码超级简单:

//ON_PAINT事件里面,我点击PANEL时会重画
//本来bmp是用来做双缓冲的,后来为了证实闪烁是DrawImage引起的,索性把要画的图像保存到了本地,这样来画
//结果刷新时还是闪烁明显,我测试了一下,需要15毫秒左右
Bitmap bmp = new Bitmap(@"f:\test.bmp", false);
e.Graphics.DrawImageUnscaled(bmp, 0, 0);



我看到网上评测,GDI中的BitBlt效率比DrawImage好,不过测试了一下,快是快了很多,稳定的2毫秒,不过还是闪

bmp = new Bitmap(@"f:\test.bmp", false);
Graphics g = Graphics.FromImage(bmp);

IntPtr dcCtr = e.Graphics.GetHdc();
IntPtr dcImg = CreateCompatibleDC(dcCtr);
SelectObject(dcImg, bmp.GetHbitmap());

BitBlt(dcCtr, 0, 0, Width, Height, dcImg, 0, 0,TernaryRasterOperations.SRCCOPY);

DeleteDC(dcImg);
e.Graphics.ReleaseHdc(dcCtr);
e.Graphics.Dispose();


麻烦大家看看,给个解决方案吧
...全文
734 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
varlj 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wartim 的回复:]
lz去看下我的博客,变色球,fps xp下平均每秒刷90次,用picturebox的image属性
[/Quote]

游戏看起来很不错
学习一下,谢谢
varlj 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mjp1234airen4385 的回复:]
就是加上这句话:
this.doublebuffer = true;
[/Quote]

不是说WinForm默认是开启双缓冲的吗………………
我怎么试都没去改这句
结果刚才试了一下,还真不闪了
wartim 2010-01-04
  • 打赏
  • 举报
回复
无闪烁
wartim 2010-01-04
  • 打赏
  • 举报
回复
lz去看下我的博客,变色球,fps xp下平均每秒刷90次,用picturebox的image属性
mjp1234airen4385 2010-01-04
  • 打赏
  • 举报
回复
就是加上这句话:
this.doublebuffer = true;
mjp1234airen4385 2010-01-04
  • 打赏
  • 举报
回复
双缓冲模式开启了吗?
  • 打赏
  • 举报
回复
自己也正学GDI+,期待吧

111,123

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧