![]() |
GDI+ Performance Tipps
Hallo,
Beschäftige mich seit ein paar Tagen etwas mit GDI+. Mein Code ist momentan folgender: (Nutze die GDI+ Library von ![]()
Delphi-Quellcode:
Jetzt das eigentliche Zeichnen:
type
TForm1 = class(TForm) ApplicationEvents1: TApplicationEvents; procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean); procedure FormCreate(Sender: TObject); private FAngle: Single; FBild1, FBild2: IGPBitmap; FBack: IGPBitmap; public { Public-Deklarationen } end; implementation procedure TForm1.FormCreate(Sender: TObject); begin FBild1 := TGPBitmap.Create('Background.jpg'); FBild1.ConvertFormat(PixelFormat32bppPARGB,DitherTypeNone,PaletteTypeOptimal); FBild2 := TGPBitmap.Create('Typ.png'); FBild2.ConvertFormat(PixelFormat32bppPARGB,DitherTypeNone,PaletteTypeOptimal); FBack := TGPBitmap.Create(Width,Height); end;
Delphi-Quellcode:
Jetzt wäre meine Frage wie man da (und auch generell) noch ein paar FPS rauskitzeln kann.
procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
var Attr: IGPImageAttributes; Matrix: TGPColorMatrix; Graph1, Graph2: IGPGraphics; begin // Zum Zeichnen auf das Offscreen-Bitmap Graph1 := TGPGraphics.Create(FBack); // Hintergrund malen Graph1.DrawImage(FBild1,0,0); // ColorMatrix initialisieren (--> Alpha Transparenz 60%) Matrix.SetToIdentity; Matrix.M[3,3] := 0.6; // Image-Attributes erstellen für Transparent-Color = Blau und Alpha Transparenz (s.o). Attr := TGPImageAttributes.Create; Attr.SetColorKey(TGPColor.Blue,TGPColor.Blue,ColorAdjustTypeBitmap); Attr.SetColorMatrix(Matrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap); // Rotierendes, Alpha-Transparentes Bild mit Transparent-Color (blau) zeichnen Graph1.TranslateTransform(FBild2.Width / 2,FBild2.Height / 2); Graph1.RotateTransform(FAngle); Graph1.DrawImage(FBild2,-FBild2.Width / 2,-FBild2.Height / 2, FBild2.Width,FBild2.Height,0,0,FBild2.Width, FBild2.Height,TGPUnit.UnitPixel,Attr); Graph1.ResetTransform; // Zum Zeichnen des Offscreen-Bitmaps auf das Formular Graph2 := TGPGraphics.Create(Canvas.Handle); Graph2.DrawImage(FBack,0,0); FAngle := FAngle + 1; Done := false; end; Z.B. hat das setzen des Pixelformats der Bitmaps auf PixelFormat32bppPARGB die Framerate quasi verdoppelt. Gibt es sonst noch irgendwelche Tricks? Auch bzgl. Dingen, die in meinem Beispiel-Code vllt. nicht benutzt werden. Gruß Neutral General |
AW: GDI+ Performance Tipps
Jetzt gäbe es da noch die Rückfrage, um wie viele fps es sich denn handelt. Mehr als 60 stellt der Bildschirm eh nicht dar, solange es ein TFT ist.
Bernhard |
AW: GDI+ Performance Tipps
Betriebssystem wäre eventuell auch noch relevant, da GDI+ unter manchen Betriebssystemen Hardwarebeschleunigung nutzt und unter anderen nicht. Konkret helfen kann ich leider nicht... habe GDI+ selbst noch nie verwendet.
|
AW: GDI+ Performance Tipps
Ich würde die Bilder nicht ins PixelFormat32bppPARGB Konvertieren sondern direkt das richtige Format verwenden.
Bei den Konvertieren hast du keine kontrolle darüber wie groß die Dateien eigentlich werden. Lieber prüfen ob deine Bilder das richtige Format verwenden anstatt sie zu Konvertieren.
Delphi-Quellcode:
Ob das jetzt einen Einfluss auf die gewünschte FPS hat ist fraglisch.
if FBild1 <> 0 then
begin GdipGetImagePixelFormat(FBild1, format); if format = PixelFormat32bppARGB then // Accept files with alpha channel begin GdipCreateHBITMAPFromBitmap(pointer(FBild1), hbmReturn, $000000); if hbmReturn <> 0 then Result := hbmReturn; end; GdipDisposeImage(FBild1); end; Obwohl die größe einer Datei schon einfluss darauf haben könnte! PS: Verstehe jetzt auch nicht warum du ein *.png Konvertieren musst. Hat das nicht immer das PixelFormat32bppARGB ? Wenn du nicht sicher bist kannst du ja vorher erstmal prüfen ob es vorhanden ist ansonsten Konvertierst du etwas das schon im richtigen Format vorliegt. Dann verwendest du quasi einen Wrapper welcher zwischen deiner Anwendung und der GdiPlus.dll rumwurschtelt Das kann auch nochmal zu performance problemen führen. Warum dann nicht direkt die Unit für GDIplus aus D2010 (Denke die gibt es doch Oder? ) gruss |
AW: GDI+ Performance Tipps
@rollstuhlfahrer & NamenLozer:
Das ist sehr unterschiedlich. Auf einem schwächeren Computer (Intel Core Duo 1,8GHz) (Win 7) bekomme ich ca. 15 FPS, bei mir Zuhause auf einem i5 4x2,66GHz (Win 7) bekomme ich ca. 45 FPS (Ohne Ändern des Pixelformats sind es gerade mal 25). Wobei die FPS aber auch sehr davon abhängen wie viel überhaupt sichtbar ist. Wenn ich das Formular sehr klein mache und man nur noch einen kleinen Ausschnitt sieht (250x350) bekomme ich fast 100 FPS. Wobei es mir aber ganz unabhängig von den bisherigen FPS um darum ging von euch ggf. kleinere oder größere Tricks/Tipps zu erfahren um das ganze noch ein bisschen besser/schneller zu machen. @EWeiss: Ja könnte noch prüfen ob das Bild nicht schon in diesem Format vorliegt. Habe im Internet einen Post gefunden in dem jemand empfiehlt dieses Pixelformat zu verwenden (weil: weiß ich nicht mehr genau). Hab es dann ausprobiert und es hat tatsächlich einen deutlichen Geschwindigkeitsschub gebracht ;) Der Wrapper wird sicher ein bisschen ausbremsen. Aber ich würde fast behaupten, dass man das kaum spüren dürfte, da die Methoden der Klassen größtenteils 1:1 die GDI+ Funktionen kapseln und dadurch nicht viel mehr Overhead als der zusätzliche Methodenaufruf entstehen sollte. Mir ging es auch um allgemeine Tipps wie "Verwende niemals das-und-das, weil das ist total langsam! Machs lieber so-und-so!" Falls da jemand aus seiner Erfahrung irgendetwas derartiges berichten kann, würde ich mich freuen :) |
AW: GDI+ Performance Tipps
Zitat:
Macht nicht wirklich sinn alles doppelt zu machen. gruss |
AW: GDI+ Performance Tipps
Zitat:
Verwende niemals GDI+, weil das ist total langsam. Machs lieber mit Direct2D oder auch OpenGL....vor Allem....in der derzeitigen W7-Welt, warum noch was neues mit GDI+ entwicklen? *duck* :duck: P.S: Ja, es IST komplizierter und JA, nicht jeder 0815-Consumer-PC kann es gut...aber der kann auch kein GDI+ gut (schnell) rendern. Also: Blut lecken und das richtige für Grafik nehmen :-) Folgender Artikel solle auch darüber Aufschluss geben, warum GDI+ zwar hardwarebeschleunigt, aber dennoch veraltet und unterlegen ist, bzw. für neue Projekte nicht mehr verwendet werden sollte: ![]() P.P.S: Sobald du die GPU mal unter Kontrolle hast, magst du nie mehr zurück zur CPU oder Pseudo-GPU-Beschleunigung für das Rendering, glaub mir :) |
AW: GDI+ Performance Tipps
Hallo,
Ja DirectX ist immer sone Sache :mrgreen: Hab es bisher nie geschafft so richtig da rein zu kommen. Man findet überall im Internet Initialisierungs-Code für DX (D3D), aber dann hört es auch schon fast auf. Und dann bin ich immer etwas erschlagen von den tausenden Funktionen und Konstanten und weiß nicht mehr wo ich da jetzt weiter ansetzen soll. Das was ich jetzt mit GDI+ mache war auch weil ich mir mal ein paar GDI+ Kenntnisse aneignen wollte. Ob ich damit irgendwas ernsthaftes programmiert hätte, kann ich nicht sagen ;) |
AW: GDI+ Performance Tipps
Zitat:
Und nicht jeder das machen muss was dir so vorschwebt? Und Messbar langsamer? Denke mal nicht. Nur weil die Zeichenoperationen von der GPU, quasi ausgelagert werden ist das nicht schneller für mich. Rechne die auslastung der GPU auf die CPU um dann ist es genauso langsam.. Es wird also nur suggestiert das man mit DX schneller ist. Zitat:
Ich gebe nichts auf Blogs die irgendwelche vergleiche ziehen vor allem dann nicht wenn es der Hersteller selber ist. gruss |
AW: GDI+ Performance Tipps
Zitat:
Messbar ist der Unterschied also auf jeden Fall. Spürbar nicht unbedingt, je nachdem, was man macht... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz