Hier mal der direkte Codevergleich
VCL <-> Graphics32:
Die ist alles das was TCanvas für ein SetPixel macht/braucht:
Delphi-Quellcode:
procedure TCanvas.SetPixel(X, Y: Integer; Value: TColor);
begin
Changing;
RequiredState([csHandleValid, csPenValid]);
Windows.SetPixel(FHandle, X, Y, ColorToRGB(Value));
Changed;
end;
procedure TCanvas.RequiredState(ReqState: TCanvasState);
var
NeededState: TCanvasState;
begin
NeededState := ReqState - State;
if NeededState <> []
then
begin
if csHandleValid
in NeededState
then
begin
CreateHandle;
if FHandle = 0
then
raise EInvalidOperation.CreateRes(@SNoCanvasHandle);
end;
if csFontValid
in NeededState
then CreateFont;
if csPenValid
in NeededState
then CreatePen;
if csBrushValid
in NeededState
then CreateBrush;
State := State + NeededState;
end;
end;
function SetPixel(
DC: HDC; X, Y: Integer; Color: COLORREF): COLORREF;
stdcall;
Umwandlungen, if-Clauses und jede Menge mehr - für jeden einzeln gesetzen Pixel! Zudem ein Call einer
API-Funktion. Das ist nicht wirklich schlimm, aber im Vergleich mal das was ein TBitmap32 macht:
Delphi-Quellcode:
procedure TBitmap32.SetPixel(X, Y: Integer; Value: TColor32);
begin
Bits[X + Y * Width] := Value;
end;
Was sieht schneller aus?
Btw: TCanvas.SetPixel direkt aufzurufen bringt
imho so gut wie nix, da der Compiler die Properties eh beim Kompilieren auf die Funktionen umlenkt -> es ist einem direkten Funktionsaufruf gleichwertig.
\\edit: Kleine Zusatzinfo: Die G32 benutzt wo es geht, und so weit vorhanden MMX, 3DNow, SSE, SSE2. (Das kommt beim Überblenden von halbtransparenten Bitmaps und den ganzen Filten+Stretchen+Rotation gut zum Einsatz.)
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel