GDI +如何使用PNG图像修复FPS下降?

时间:2017-09-09 12:06:37

标签: png gdi+

抱歉我的英语不好。

目前我正在使用这种方式。

Gdiplus::Image img(L"xxx.png");
Gdiplus::Graphics g(hdc);
g.DrawImage(&img,0,0);

当我使用PNG时,如果我绘制超过400 * 200像素,我的FPS会下降39~45。

但改为使用BMP图像FPS保持维持60.

我如何解决这个问题?。

转换pixelformat

我用这种方式(没有工作)

 img = Image::FromFile(filename);
 bmp = new Bitmap(img->GetWidth(), img->GetHeight(), PixelFormat32bppPARGB);
 Graphics gra(hdc);
 gra.FromImage(bmp);
 gra.DrawImage(img, destX, destY, img->GetWidth(), img->GetHeight());

1 个答案:

答案 0 :(得分:0)

我想这是由于PixelFormat。

GDI(+)在内部使用PixelFormat.Format32bppPArgb。绘图时会转换所有其他格式。转换可能会导致您的性能问题。

因此,如果您想要经常绘制图片,请在加载时自行转换,而不是让GDI在每次绘制时都这样做。

修改

PixelFormat可以像这样“转换”:

// Load png from disc
Image png = Image.FromFile("x.png");
// Create a Bitmap of same size as png with the right PixelFormat
Bitmap bmp = new Bitmap(png.Width, png.Height, PixelFormat.Format32bppPArgb);
// Create a graphics object which draws to the bitmap
Graphics g = Graphics.FromImage(bmp);
// Draw the png to the bmp
g.DrawImageUnscaled(png, 0, 0);

请注意,Image,Bitmap和Graphics对象实现了IDisposable,并且在不再需要时应该正确处理。

干杯

托马斯