3 fonctions graphiques plus rapides que les fonctions de bases de delphi

Contenu du snippet

Voici 3 fonctions graphique, la premiere permet de creer un point sur 1 bitmap, la seconde a crée une droite horizontal, et la derniere à colorer tout le bitmap...

Les 2 premiers sont environs 5 fois plus rapides que les fonctions de bases de delphi, la derniere tres peu parcontre (5%+) enfin c deja ça de gagné :)

Aussi pour ASMClear, en mode 24 bits elle fonctionne mais pas comme il faut :-\ si quelqu'un sait pourquoi je suis preneur

Si l'image n'est pas en 32 ou 24 bits on a la procedure tout bete de delphi,

Source / Exemple :


procedure ASMPoint(Bitmap:TBitmap;X,Y:dword;color:dword);
var
p1:pointer;
begin
if (X>Bitmap.Height-1) or (Y>Bitmap.Width-1) then exit;
p1:=Bitmap.ScanLine[X-1];
case Bitmap.PixelFormat of
pf32bit:
  asm
  push edi
  mov edi,p1
  mov eax,y
  shl eax,2
  add edi,eax
  mov eax,color
  mov [edi],eax
  pop edi
  end;
pf24bit:
  asm
  push edi
  mov edi,p1
  mov eax,y
  imul eax,3
  add edi,eax
  mov eax,color
  mov ecx,eax
  shr ecx,16
  mov [edi],ax
  mov [edi+2],cl
  pop edi
  end;
else
bitmap.Canvas.Pixels[X,Y]:=Color;
end;

procedure ASMHorizontal(Bitmap:TBitmap;Y:dword;color:dword);
var
p1:pointer;m:dword;
begin
p1:=Bitmap.ScanLine[Y];
m:=Bitmap.Width;
case Bitmap.PixelFormat of
pf32bit:
  asm
  push  edi
  mov ecx,m
  mov eax,color
  mov edi,p1
  rep stosd
  pop  edi
  end;
pf24bit:
  asm
  push  edi
  xor ecx,ecx
  mov eax,color
  mov edi,p1
  @Loop1:
  mov [edi],eax
  add edi,3
  inc ecx
  cmp ecx,m
  jne @Loop1
  pop  edi
  end;
else
Bitmap.Canvas.Pen.Color:=Color;
Bitmap.Canvas.MoveTo(0,Y);
Bitmap.Canvas.LineTo(m,Y);
end;
end;

procedure ASMClear(Bitmap:TBitmap;color:dword);
var
p1:pointer;m:dword;
begin
with bitmap do begin
p1:=ScanLine[height-1];
m:=Width*Height;
end;
case Bitmap.PixelFormat of
pf32bit:
asm
push  edi
mov ecx,m
mov eax,color
mov edi,p1
rep stosd
pop  edi
end;
pf24bit:
asm
push  edi
xor ecx,ecx
mov eax,color
mov edx,color
shr edx,16
mov edi,p1
@Loop1:
mov [edi],ax
mov [edi+2],dl
add edi,3
inc ecx
cmp ecx,m
jne @Loop1
pop  edi
end;
else
Bitmap.Canvas.Brush.Color:=Color;
Bitmap.Canvas.Rectangle(0,0,Bitmap.Width,Bitmap.Height);
end;
end;

Conclusion :


ça peu etre interressant pour faires de petit jeux sans lag, et sans utilisé scanline tout le temps :)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.