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...