Hallo zusammen,
mit folgendem Quellcode zeichne ich diverse Bilder in eine PaintBox:
Delphi-Quellcode:
procedure TfrmCardInfo.pbCardsPaint(Sender: TObject);
var
i, col, row: Integer;
BasePath, s: string;
img: TJPEGImage;
Start: Cardinal;
begin
if (FBFCardInfoList.Count > 0) then begin
img := TJPEGImage.Create;
try
col := 1;
row := 0;
i := 0;
Start := GetTickCount;
repeat
FBFCardInfoList[i].Picture.Position := 0;
img.LoadFromStream(FBFCardInfoList[i].Picture);
pbCards.Canvas.Draw((col - 1) * img.Width + 5, row * img.Height + 10, img);
if ((col mod FMaxCols) = 0) then begin
col := 1;
Inc(row);
end else
Inc(col);
Inc(i);
until (i >= FBFCardInfoList.Count);
lblOrbs.Caption := IntToStr((GetTickCount - Start));
finally
img.Free;
end;
end;
end;
Die Bilder wurden zuvor in einem Thread von der Festplatte geladen und werden nun in einem Klassenobjekt in einer Objectlist aufbewahrt. Ich lade beim Zeichnen der Bilder auch immer nur noch aus einem Stream in ein TJPEGImage. Jedoch fängt die Anwendung an zu ruckeln, sobald ich das Fenster vergrößere und verkleinere. Die PaintBox in die gezeichnet wird, wird beim ändern der Formgröße immer durch die Anchor Property mit angepasst. Nehme ich die Zeile
pbCards.Canvas.Draw((col - 1) * img.Width + 5, row * img.Height + 10, img);
raus, dann läuft es flüssig(er). Getestet unter Windows 10 und Windows 7. Woran kann das liegen? Ist die Canvas.Draw Methode wirklich so langsam?
Wie kann ich das beschleunigen, da ich diese Ruckeleffekte nicht haben möchte?
PS: Das lblOrbs habe ich dazu verwendet, um die Zeit auszugeben wie lange gezeichnet wird. Das Ergebnis liegt immer irgendwo bei 300 - 370ms.