AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GDI+ Performance Tipps

Ein Thema von Neutral General · begonnen am 23. Aug 2011 · letzter Beitrag vom 30. Jul 2013
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

GDI+ Performance Tipps

  Alt 23. Aug 2011, 19:11
Hallo,

Beschäftige mich seit ein paar Tagen etwas mit GDI+.

Mein Code ist momentan folgender:
(Nutze die GDI+ Library von http://www.bilsen.com/gdiplus/index.shtml)

Delphi-Quellcode:
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;
Jetzt das eigentliche Zeichnen:

Delphi-Quellcode:
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;
Jetzt wäre meine Frage wie man da (und auch generell) noch ein paar FPS rauskitzeln kann.
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#2

AW: GDI+ Performance Tipps

  Alt 23. Aug 2011, 21:03
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: GDI+ Performance Tipps

  Alt 23. Aug 2011, 21:12
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: GDI+ Performance Tipps

  Alt 23. Aug 2011, 21:23
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:
   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;
Ob das jetzt einen Einfluss auf die gewünschte FPS hat ist fraglisch.
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

Geändert von EWeiss (24. Aug 2011 um 00:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: GDI+ Performance Tipps

  Alt 23. Aug 2011, 23:42
@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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: GDI+ Performance Tipps

  Alt 24. Aug 2011, 00:26
Zitat:
Ja könnte noch prüfen ob das Bild nicht schon in diesem Format vorliegt.
War nur ein Tip von mir
Macht nicht wirklich sinn alles doppelt zu machen.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von ehX
ehX

Registriert seit: 11. Aug 2011
Ort: Augsburg
55 Beiträge
 
Delphi 2009 Professional
 
#7

AW: GDI+ Performance Tipps

  Alt 24. Aug 2011, 01:28
Zitat:
Verwende niemals das-und-das, weil das ist total langsam! Machs lieber so-und-so!"
Sorry, aber muss sein:
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*


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:
http://blogs.msdn.com/b/directx/arch...d-and-gdi.aspx

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
Fin

Geändert von ehX (24. Aug 2011 um 01:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: GDI+ Performance Tipps

  Alt 24. Aug 2011, 13:05
Hallo,

Ja DirectX ist immer sone Sache
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: GDI+ Performance Tipps

  Alt 24. Aug 2011, 14:35
Zitat:
warum noch was neues mit GDI+ entwicklen?
Weil es spass macht?
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:
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
Bla, bla

Ich gebe nichts auf Blogs die irgendwelche vergleiche ziehen vor allem dann nicht wenn es der Hersteller selber ist.


gruss

Geändert von EWeiss (24. Aug 2011 um 14:38 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#10

AW: GDI+ Performance Tipps

  Alt 24. Aug 2011, 14:55
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.
Ähm wat. Und ob GPUs bei Grafikverarbeitungen schneller (und effizienter) sind... das liegt einfach an der anderen Architektur. Der Unterschied ist gewaltig (eine GPU ist u.U. locker 1000× so schnell wie eine CPU, wenn nicht mehr).

Messbar ist der Unterschied also auf jeden Fall. Spürbar nicht unbedingt, je nachdem, was man macht...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz