c#[图形应用] GetHbitmap性能问题 Gdi 高手进!!!!

BornShijia 2010-04-07 02:04:55
最近开发过程中碰到了一个性能瓶颈,要使用一个bitmap对象场景选绘制,可能涉及上百次的drawImage操作,并且涉及
图像的翻转与旋转操作,导致刷新延迟较长,后采用GDI方式进行绘制以提高速度,代码如下:
public static void StretchBlt(Graphics g, Bitmap bmpSrc)
{
//目标hdc
IntPtr pTarget = g.GetHdc();
//与目标hdc兼容的源hdc
IntPtr pSource = CreateCompatibleDC(pTarget);
IntPtr hbmp = bmpSrc.GetHbitmap();//性能瓶颈,大约耗时2ms
//源hdc选择bitmap对象的句柄
IntPtr pOldHdc = SelectObject(pSource, hbmp);

StretchBlt(pTarget, 0, 0, nWidth, nHeight, pSource, 0, 0, nWidthSrc, nHeightSrc, TernaryRasterOperations.SRCCOPY);

//以下为清理工作
IntPtr pNew = SelectObject(pSource, pOldHdc);
DeleteObject(pNew);
DeleteDC(pSource);
DeleteDC(hbmp);
g.ReleaseHdc(pTarget);
}


代码中的: IntPtr hbmp = bmpSrc.GetHbitmap();//性能瓶颈,大约耗时2ms
为所debug出的瓶颈所在。一次绘制2ms,100次以上的绘制就会出现很大延时。

不知有没有高手碰到过此类问题,另外我看了一篇《一次性能提升300%的优化实践》的文章,其中看起来是和我描述的问题一致,但实际上它是字体句柄的性能问题:
IntPtr handle = font.ToHfont(); //性能瓶颈

我采用了文章所描述的cache方式,但是却无法绘制出图像(第一次除外,因第一次是通过bmpSrc.GetHbitmap()方法获得的hdc,之后绘制所使用的hdc就是第一次获得的hdc,再也无法正常绘制图像)
它的方法其实相当于我把bmpSrc.GetHbitmap()获得的hdc做为成员变量存储起来不释放(其实我也试过,无效)。


高手进来指教!!!!!!

...全文
807 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dylike 2010-07-02
  • 打赏
  • 举报
回复
用C++可以挽回你那2毫秒
memoCKH 2010-07-02
  • 打赏
  • 举报
回复
同样的问题,顶!
masky5310 2010-04-08
  • 打赏
  • 举报
回复
关注下
帮顶
cnzdgs 2010-04-07
  • 打赏
  • 举报
回复
如果Bitmap改变的频率不高,可以用GetHbitmap得到GDI位图对象保存起来,每次绘制都使用这个对象。

110,537

社区成员

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

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

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