Performanceproblem GDI+ .DrawImage, Abhilfe?

10/10/2008 - 10:16 von Michael Böckinghoff | Report spam
Hallo NG,

da ich mit der normalen WinForms PictureBox probleme mit
der Transparenz von *.png Bildern habe die übereineandergelegt werden.

Habe ich stattdessen per GDI+ die Bilder übereinander gelegt, soweit so gut.

Nur jetzt Bewegen sich diese enzelnen Bilder noch alle ca. 100 ms, deswegen
muss
ich diesen "Merge" alle 100 ms wiederholen, und das zieht unheimlich CPU
Zeit ca 25% bei dem einfachen Beispiel im Moment.

Vorher hab ich das einfach über die .Location Eingeschaft der PictureBox
gemacht, da war die Performance OK, "nur" das Tranzparenzproblem stört bei
der Lösung

Gibt es irgend eine Möglichkeit in WinForms die Performance zu erhöhen?
WPF kommt nicht in frage, da das ganze auch im CompactFramework laufen soll.

Hier mein Codeschnipsel den ich zur Zeit benutze ( Da àndert sich zwar im
moment nicht die
Position der Grafik, der einfachheit halber hab ich das jetzt mal
rausgelassen...)


TIA und Gruß

Michael

Codeschnipsel (wahrscheinlich wieder hàsslich umgebrochen):
######################

private void BildMerge()
{
//Hintergrundbild erstellen:
Image HinterGrund;
HinterGrund = Image.FromFile("1GDot_255_255_192.png");

Image Bild1;
Bild1 =
Image.FromFile("ZylinderBallensichtMitBemaßung500x170.png");

Image Merged;
// Nur die größe vom Hintergrundbild ist interessant
Merged = new Bitmap(HinterGrund.Size.Width,
HinterGrund.Size.Height);


System.Drawing.Graphics myGraphic = null;

myGraphic = System.Drawing.Graphics.FromImage(Merged);
myGraphic.DrawImageUnscaled(HinterGrund, 0, 0);
myGraphic.DrawImage(Bild1, 0, 0, 100, 100);
myGraphic.DrawImage(Bild1, 50, 50, 200, 200);
myGraphic.DrawImage(Bild1, 100, 100, 10, 20);

myGraphic.Save();

this._panel1.BackgroundImage = Merged;
}

private void OnTimer(object sender, EventArgs e)
{
BildMerge();
}
 

Lesen sie die antworten

#1 Thomas Scheidegger
10/10/2008 - 10:28 | Warnen spam
Hallo Michael

per GDI+ die Bilder übereinander gelegt...
"Merge" alle 100 ms wiederholen, und das zieht unheimlich CPU HinterGrund
= Image.FromFile("1GDot_255_255_192.png");
Image.FromFile("ZylinderBallensichtMitBemaßung500x170.png");



werden Bilder jedesmal von Disk geladen?
Natürlich geht hier viel Zeit verloren...


myGraphic.Save();



bist du sicher dass dies hier/so Sinn macht?
(evtl. eher ein Graphics.Flush + Dispose, o.à.)




Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/

Ähnliche fragen