c#[图形应用] GetHbitmap性能问题 Gdi 高手进!!!!
最近开发过程中碰到了一个性能瓶颈,要使用一个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做为成员变量存储起来不释放(其实我也试过,无效)。
高手进来指教!!!!!!