Mesures de vitesse sur PutPixel en mode 13h

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

Laisser un commentaire