On 22 Aug 2007, at 18:24, Evgeniy Ivanov wrote:

2007/8/22, Jonas Maebe <[EMAIL PROTECTED]>:


It is because you do not redirect the line drawing directly to SDL,
but instead use the default line drawing routines. Those are indeed
very slow, because they call a procedural variable (directputpixel)
for each pixel which has to be drawn). And directputpixel then calls
through to SDL, which every time must recalculate the pixel position
on the screen (instead of just adding 1 to the horizontal or vertical
coordinate in case of horizontal/vertical line drawing).

Hm... I really forgot to hook Line (but wrote the routine). But HLine and VLine are hooked and the speed problem is in the Bar function, it has such
code:
           for y:=y1 to y2 do
              Hline(x1,x2,y);
HLine is hooked and works quickly. But it locks the screen every time it is executed (but calls DirectPutPixel without locking (that's why it is fast):
procedure sdlgraph_HLine(x,x2,y: smallint);
var
temp:DefPixelProc;
begin
 temp:=DirectPutPixel;
DirectPutPixel:[EMAIL PROTECTED]; // It doesn't lock the screen as
sdlgraph_DirectPutPixel. It's quick.

No, it is still slow. You indeed do not have locking overhead, but you are still calling nonBuf_DirectPutPixel via a procvar for each pixel which has to be drawn (from hlinedefault). That is still very slow.

Bar3D's speed is fine if you have a fast hline implementation (like for e.g. go32v2 in most modes).


Jonas
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to