2017-09-09 5 views
-1

Désolé pour mon mauvais anglais.GDI + Comment réparer FPS drop en utilisant l'image PNG?

Actuellement, j'utilise cette méthode. Lorsque j'utilise le format PNG si je dessine plus de 400 * 200 pixels, mon FPS baisse le 39 ~ 45.

mais au lieu d'utiliser l'image BMP FPS garder maintenir 60.

Comment puis-je résoudre ce problème ?.

convertir pixelformat

J'utilise cette façon (ne fonctionne pas)

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()); 
+0

Votre initialisation de l'objet graphique est erroné. Essayez quelque chose comme 'Graphics * gra = Graphics :: FromImage (bmp);' Désolé mais je ne suis pas trop familier avec C++ –

Répondre

0

Je suppose que cela est dû à la PixelFormat. GDI (+) utilise en interne PixelFormat.Format32bppPArgb.

Tous les autres formats sont convertis lors du dessin. La conversion est susceptible d'entraîner votre problème de performance. Donc, si vous voulez dessiner une image fréquemment, convertissez-la vous-même au chargement au lieu de la faire faire par GDI à chaque tirage.

EDIT:

Le PixelFormat peut être "convertie" comme ceci:

// 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); 

Soyez conscient du fait que l'image, Bitmap et objets graphiques mettent en œuvre IDisposable et doivent être éliminés correctement lorsqu'ils ne sont plus.

Vive

Thomas

+0

Merci! J'essaie plusieurs choses pour convertir PixelFormat. mais ça ne marche pas du tout. Pourriez-vous me donner un exemple? Comment? – HOJ

+0

Désolé. Cela ne marche pas aussi. Et j'utilise l'API WIN32. Votre exemple ne convient pas API WIN32. – HOJ