Test de 3 façons différentes d’afficher un pixel (avec Turbo Pascal 7.0) :
(***************************************************************)
procedure PutPixel1(x,y: word; color: byte);
begin
Mem[VGA_SEGMENT: y*320+x]:=color;
end; { PutPixel1 }
(***************************************************************)
procedure PutPixel2(x,y: word; color: byte); assembler;
asm
mov ax,VGA_SEGMENT { es <-- $A000 }
mov es,ax
mov ax,VGA_WIDTH { ax <-- 320 }
mul y { ax <-- y*320 }
add ax,x { ax <-- y*320+x }
mov bx,ax { bx <-- y*320+x }
mov al,color
mov es:[bx],al
end; { PutPixel2 }
(***************************************************************)
procedure PutPixel3(x,y: word; color: byte); assembler;
asm
mov ax,VGA_SEGMENT { es <-- $A000 }
mov es,ax
mov ax, y { ax <-- y }
mov di, ax { di <-- y }
shl ax, 8 { ax <-- y*256 }
shl di, 6 { di <-- y*64 }
add di, ax { di <-- y*320 }
add di, x { di <-- y*320+x }
mov al, color
mov [es:di],al
end; { PutPixel3 }
(***************************************************************)
Sous DOSBox, la procédure la plus rapide semble être la première (test réalisé plusieurs fois) :
Extrait du programme de test :
for c:=0 to 15 do
begin
for y:=0 to 199 do
begin
for x:=0 to 319 do
begin
PutPixel1(x,y,c);
end;
end;
end;
En approfondissant, et pour une raison que je ne m'explique pas, on se rend compte que la position des PutPixels dans le programme a une influence : le premier est avantagé. J'ai donc changé la méthodologie et arrive à ceci :
PutPixel2 semble être la procédure plus rapide. Je suis autour de 25,4 ms par écran, soit 39,4 FPS.
Si vous pensez avoir mieux au niveau du code, je suis preneur...









