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
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, 18: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, 20: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, 20: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, 20: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 (23. Aug 2011 um 23: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, 22: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 23. Aug 2011, 23: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
Antwort Antwort


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 16:21 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