Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
3 FONCTIONS GRAPHIQUES PLUS RAPIDES QUE LES FONCTIONS DE BASES DE DELPHI
Information sur la source
Description
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
- 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;
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 :)
Sources de la même categorie
Commentaires
|
CalendriCode
| | | L | M | M | J | V | S | D |
| | | | | 1 | 2 | 3 |
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
|
|