Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#1

Bitmap zeichen (gehts noch schneller?)

  Alt 28. Feb 2016, 12:45
Mit den in der untenstehenden Test-Prozedur enthaltenen Prozeduren DrawBitmap und DrawGPBitmap zeichne ich eine Bitmap auf den Canvas einer maximierten Form.
Größe der Bitmap : 4000 x 3000 Pixel
Größe des Canvass : 1920 x 1000 Pixel

Meine Erwartung war, das das mit der GPBitmap (TGPGraphics.DrawImage) schneller geht als mit DrawBitmap (StretchBlt).

Ich habe folgende Zeiten gemessen, jeweils für 100 maliges Zeichnen:

DrawBitmap : 234 ms.
DrawGPBitmap: 31809 ms, also knapp 136 mal so lange.

Da ich mir kaum vorstellen kann, dass das DrawImage (immerhin GDI+) so viel langsamer ist, als das StretchBlt, vermute ich, dass ich irgend etwas verkehrt mache.

Weiß jemand, wie man eine GPBitmap schnell ausgibt?

Das Bild kann hier [URL="https://commons.wikimedia.org/w/index.php?curid=6558322"] heruntergeladen werden.

Delphi-Quellcode:
PROCEDURE TMain.Test;
//------------------------------------------------------------------------------
FUNCTION DrawBitmap(const Dsn:String; Count:Integer):Cardinal;
var I,W,H:Integer; Image:TGPImage; Graphics:TGPGraphics; Bmp:TBitmap;
begin
   Bmp:=TBitmap.Create;
   Image:=TGPImage.Create(Dsn);
   W:=Image.GetWidth;
   H:=Image.GetHeight;
   Bmp.SetSize(W,H);
   Graphics:=TGPGraphics.Create(Bmp.Canvas.Handle);
   Graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);
   Graphics.DrawImage(Image,MakeRect(0,0,W,H));
   Graphics.Free;
   Image.Free;
   Result:=GetTickCount;
   for I:=1 to Count do begin
      SetStretchBltMode(Canvas.Handle,COLORONCOLOR);
      SetBrushOrgEx(Canvas.Handle,0,0,nil);
      StretchBlt(Canvas.Handle,0,0,ClientWidth,ClientHeight,
                 Bmp.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,SrcCopy);
   end;
   Result:=GetTickCount-Result;
   Bmp.Free
end;
//------------------------------------------------------------------------------
FUNCTION DrawGPBitmap(const Dsn:String; Count:Integer):Cardinal;
var I:Integer; Image:TGPBitmap; Graphics:TGPGraphics;
begin
   Image:=TGPBitmap.Create(Dsn);
   Result:=GetTickCount;
   for I:=1 to Count do begin
      Graphics:=TGPGraphics.Create(Canvas.Handle);
      Graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);
      Graphics.DrawImage(Image,MakeRect(0,0,ClientWidth,ClientHeight));
      Graphics.Free;
   end;
   Result:=GetTickCount-Result;
   Image.Free;
end;
//------------------------------------------------------------------------------
// https://commons.wikimedia.org/w/index.php?curid=6558322
const Dsn='E:\Daten\DownLoads\PfauVonVorne.jpg';
var T1,T2:Cardinal;
begin
   T1:=DrawBitmap(Dsn,100);
   T2:=DrawGPBitmap(Dsn,100);
   ShowMessage(IntToStr(T1)+#13+IntToStr(T2));
// Ausgabe
// DrawBitmap 234 ms bei 100 Durchläufen
// DrawGPBitmap 31809 ms bei 100 Durchläufen
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat