gdi + Graphics :: DrawImage真的很慢~~
我正在使用GDI + Graphic来绘制一张4000 * 3000的图像来进行屏幕显示,但它确实很慢。 它大约需要300ms。 我希望它只占用不到10ms的时间。
Bitmap *bitmap = Bitmap::FromFile("XXXX",...);
// - - - - - - - - - - - - - - - - - - - - - - // 这部分需要约300ms,太可怕了!
int width = bitmap->GetWidth();
int height = bitmap->GetHeight();
DrawImage(bitmap,0,0,width,height);
// ------------------------------------------
我无法使用CachedBitmap,因为我想稍后编辑位图。
我该如何改进它? 或者有什么不对吗?
这种本地GDI功能也可以将图像绘制到屏幕上,并且只需要1 ms:
SetStretchBltMode(hDC, COLORONCOLOR);
StretchDIBits(hDC, rcDest.left, rcDest.top,
rcDest.right-rcDest.left, rcDest.bottom-rcDest.top,
0, 0, width, height,
BYTE* dib, dibinfo, DIB_RGB_COLORS, SRCCOPY);
// ------------------------------------------------ --------------
如果我想使用StretchDIBits,我需要传递BITMAPINFO,但是如何从Gdi +位图对象获取BITMAPINFO? 我通过FreeImage lib做了实验,我使用FreeImageplus对象调用StretchDIBits,它画得非常快。 但是现在我需要绘制位图,并在位图的位数组上写入一些算法,如果我有一个位图对象,该如何才能获得BITMAPINFO? 这真的很烦人-___________- |
你有一个4000×3000分辨率的屏幕? 哇!
如果不是,你应该只绘制图像的可见部分,它会更快......
[编辑第一次评论后]我的评论确实有点愚蠢,我想DrawImage会掩盖/跳过不需要的像素。
编辑完成后(显示StretchDIBits),我猜测StretchDIBits是硬件加速(“如果驱动程序不支持JPEG或PNG文件图像”是一个提示...),而DrawImage可能会产生速度差异的可能来源是的(我没有证据证明这一点!)编码在C中,依靠CPU的力量而不是GPU的一个...
如果我记得正确,DIB图像很快(尽管是“独立于设备”)。 请参阅高速Win32动画:“使用CreateDIBSection执行高速动画”。 好吧,它适用于DIB与GDI,旧版Windows版(1996!),但我认为它仍然是正确的。
[编辑]也许Bitmap :: GetHBITMAP函数可能会帮助您使用StretchDIBits(未测试...)。
如果您使用的是GDI +,那么TextureBrush类就是快速渲染图像所需的。 我已经写了几个2D游戏,大约30 FPS左右。
我从来没有用C ++写过.NET代码,所以这里有一个C#示例:
Bitmap bmp = new Bitmap(...)
TextureBrush myBrush = new TextureBrush(bmp)
private void Paint(object sender, PaintEventArgs e):
{
//Don't draw the bitmap directly.
//Only draw TextureBrush inside the Paint event.
e.Graphics.FillRectangle(myBrush, ...)
}
只是一个想法; 而不是在绘图之前检索图像的宽度和高度,为什么不在加载图像时缓存这些值?
链接地址: http://www.djcxy.com/p/50273.html