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做为成员变量存储起来不释放(其实我也试过,无效)。
高手进来指教!!!!!!
图像的翻转与旋转操作,导致刷新延迟较长,后采用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做为成员变量存储起来不释放(其实我也试过,无效)。
高手进来指教!!!!!!
...全文
相关推荐
淡出图像或图形对象
在IT行业中,尤其是在软件开发领域,我们经常需要处理图像和图形对象的显示效果。本文将深入探讨如何在C# .NET WinForms应用中利用GDI+库实现图像或Graphics对象的淡出效果。
C#中如何使用Winform实现炫酷的透明动画界面
综上所述,通过熟练掌握和运用UpdateLayeredWindow,开发者可以在C#的Winform环境中创建出极具视觉吸引力的透明动画界面,同时需要注意解决由此产生的各种挑战,如控件更新、性能优化等。
C# 生成二维码
- 考虑到性能和资源管理,建议合理设置二维码的尺寸。- 对于需要长期保存的二维码,应确保其内容不会轻易改变。通过以上介绍和分析,我们可以看到C#生成二维码不仅简单易行,而且具有很高的实用性。
c#调用 c++实时刷新控件显示图像
通过这种方式,你可以充分利用C++的高效性能和C#的易用界面,为你的应用程序带来更流畅的视觉体验。
C# 截取电脑屏幕全屏代码,自适应分辨率。包含labview调用方法。
LabVIEW是美国国家仪器公司(NI)开发的一种图形化编程环境,主要用于数据采集、测试测量和控制应用。在LabVIEW中调用C#代码通常通过.NET调用节点或者动态链接库(DLL)实现。


