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

BornShijia BornShijia 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近开发过程中碰到了一个性能瓶颈,要使用一个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做为成员变量存储起来不释放(其实我也试过,无效)。


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

...全文

相关推荐

评论 4
收藏 已收藏
分享
返回顶部
BornShijia
C# 111,128 成员 642,536 内容