Ich habe es übertrieben/überspitzt gesagt, natürlich fällt das bei kleinen Bildern nicht auf.
Aber wenn überall sollche kleine Leistungsersparnisse verschwendet werden, dann kommt es am Ende etwas zusammen.
Ich mag es nicht wenn etwas verschwendet wird, wenn ich es vermeiden kann dann nutze ich es, deshalb habe ich es für mich gemacht.
Ich habe auch test gemacht:
Code: Alles auswählen
procedure TForm1.BtnTest1Click(Sender: TObject);
var t1, t2,t3: QWord;
i,w, h: Integer;
pic: TPicture;
bmp: TBitmap;
begin
pic:=TPicture.Create;
try
w:=7680; h:=4320;
//w:=1920; h:=1080;
t1:=GetTickCount64;
for i:=1 to SpinEdit1.Value do begin;
bmp := TBitmap.Create;
bmp.SetSize(w, h);
bmp.Canvas.FillRect(10,10,20,30);
pic.Graphic:=bmp;
bmp.Free;
TBitmap(pic.Graphic).Canvas.FillRect(50,50,60,60);;
end;
t2:=GetTickCount64;
for i:=1 to SpinEdit1.Value do begin;
bmp := TBitmap.Create;
bmp.SetSize(w, h);
bmp.Canvas.FillRect(10,10,20,30);
pic.SetGraphicDirect(bmp);
//bmp Nicht freigeben, es gehört jetzt zu pic: bmp.Free;
TBitmap(pic.Graphic).Canvas.FillRect(50,50,60,60);;
end;
t3:=GetTickCount64;
Memo1.Lines.Add('Vergleich1 ----- ');
Memo1.Lines.Add('SetGraphic in ms: '+IntToStr(t2-t1));
Memo1.Lines.Add('SetGraphicDirect in ms: '+IntToStr(t3-t2));
finally
pic.Free;
end;
end;
procedure TForm1.BtnTest2Click(Sender: TObject);
var t1, t2, z1,z2: QWord;
i, w, h: Integer;
pic: TPicture;
bmp: TBitmap;
begin
pic:=TPicture.Create;
try
z1:=0; z2:=0;
//w:=7680; h:=4320;
w:=3840; h:=2160;
//w:=1920; h:=1080;
for i:=1 to SpinEdit1.Value do begin;
bmp := TBitmap.Create;
bmp.SetSize(w, h);
bmp.Canvas.FillRect(10,10,20,30);
t1:=GetTickCount64;
pic.Graphic:=bmp;
t2:=GetTickCount64;
z1:=z1+(t2-t1);
bmp.Free;
TBitmap(pic.Graphic).Canvas.FillRect(50,50,60,60);;
end;
for i:=1 to SpinEdit1.Value do begin;
bmp := TBitmap.Create;
bmp.SetSize(w, h);
bmp.Canvas.FillRect(10,10,20,30);
t1:=GetTickCount64;
pic.SetGraphicDirect(bmp);
t2:=GetTickCount64;
z2:=z2+(t2-t1);
//bmp Nicht freigeben, es gehört jetzt zu pic: bmp.Free;
TBitmap(pic.Graphic).Canvas.FillRect(50,50,60,60);;
end;
Memo1.Lines.Add('Direktvergleich ----- ');
Memo1.Lines.Add('SetGraphic in ms: '+IntToStr(z1));
Memo1.Lines.Add('SetGraphicDirect in ms: '+IntToStr(z2));
finally
pic.Free;
end;
end;
Ergebnisse vom ersten Test ist das gleiche wie deine Ergebnisse:
Code: Alles auswählen
Vergleiche-Button 5x geklickt.
Vergleich1(ganze Schleife gemessen) ---- 7680x4320
Vergleich1 -----
SetGraphic in ms: 3011
SetGraphicDirect in ms: 2620
Vergleich1 -----
SetGraphic in ms: 2979
SetGraphicDirect in ms: 2606
Vergleich1 -----
SetGraphic in ms: 2980
SetGraphicDirect in ms: 2605
Vergleich1(ganze Schleife gemessen) ---- 1920x1080
SetGraphic in ms: 171
SetGraphicDirect in ms: 156
Vergleich1 -----
SetGraphic in ms: 172
SetGraphicDirect in ms: 156
Vergleich1 -----
SetGraphic in ms: 172
SetGraphicDirect in ms: 156
Vergleich1 -----
SetGraphic in ms: 172
SetGraphicDirect in ms: 140
Vergleich1 -----
SetGraphic in ms: 172
SetGraphicDirect in ms: 156
Im zweiten Test wird nur die Zeit, die verschwendet wird gemessen, für kleine Bilder nicht richtig meßbar, aber für große Bilder sieht man den unterschied deutlich. Natürlich kann man auch sagen "Wer verwendet schon 7680x4320 Bilder?" oder "Das sind doch Milisekunden Unterschiede.", dann wären wir am Anfang.
Code: Alles auswählen
Direktvergleich (nur Grafikzuweisungsteile) ----- 7680x4320
SetGraphic in ms: 606
SetGraphicDirect in ms: 158
Direktvergleich -----
SetGraphic in ms: 622
SetGraphicDirect in ms: 171
Direktvergleich -----
SetGraphic in ms: 627
SetGraphicDirect in ms: 155
Direktvergleich -----
SetGraphic in ms: 640
SetGraphicDirect in ms: 188
Direktvergleich -----
SetGraphic in ms: 621
SetGraphicDirect in ms: 172
Direktvergleich (nur Grafikzuweisungsteile) ----- 3840x2160
SetGraphic in ms: 110
SetGraphicDirect in ms: 96
Direktvergleich -----
SetGraphic in ms: 110
SetGraphicDirect in ms: 47
Direktvergleich -----
SetGraphic in ms: 78
SetGraphicDirect in ms: 16
Direktvergleich -----
SetGraphic in ms: 125
SetGraphicDirect in ms: 31
Direktvergleich -----
SetGraphic in ms: 95
SetGraphicDirect in ms: 63
Nicht richtig messbar.
Direktvergleich ----- (nur Grafikzuweisungsteile) ----- 1920x1080
SetGraphic in ms: 0
SetGraphicDirect in ms: 0
Direktvergleich -----
SetGraphic in ms: 32
SetGraphicDirect in ms: 0
Direktvergleich -----
SetGraphic in ms: 46
SetGraphicDirect in ms: 47
Direktvergleich -----
SetGraphic in ms: 15
SetGraphicDirect in ms: 0
EDIT: Die nächsten ursprunglichen Aussagen von mir sind falsch. Jetzt erinnere ich mich wieder, ich hatte vergessen für fpc Assemblerroutinen einzuschalten, danach konnte man keinen Unterschied festellen.Solche Milisekundenunterschiede sieht man später im Programm. Ich wollte vor Jahren mein einfaches Grafikviewer von TurboDelphi zu Lazarus portieren, obwohl Graphics32-Bibliothek für beide Paltformen gleichen Code verwendet lief die Delphiversion flüssiger. Sobald man 1920x1080 auf 200% vergrößerte war verschieben des Bildabschnitts bei Lazarusversion langsamer.