回 帖 发 新 帖 刷新版面

主题:[求助]关于图象的

我在编图象程序时每过一段时间就要刷屏,刷屏时屏幕闪的很厉害,这个有什么解决办法?

回复列表 (共32个回复)

沙发

你的帖居然被我发现了XD
请在刷屏前加这2句:
while (Port[$3DA] AND 8 > 0) do;
while (Port[$3DA] AND 8 = 0) do;
原理比较复杂, 用就行了

板凳

其实我想说, Pascal的Graph单元就是渣.

切换图形模式(320x200, 256色)的函数:
procedure setgraph; assembler;
  asm
    MOV AX, 13H
    INT 10H
  end;

切换回文本模式的函数:
procedure settext; assembler;
  asm
    MOV AX, 3H
    INT 10H
  end;

图形模式下画点:
procedure plot(x, y:word; color:byte);
  begin
    mem[$A000:y*320+x]:=color;
  end;
x为横坐标(0-319).
y为纵坐标(0-199).
color是颜色.
在我的机器(AMD-K6, 32M内存)上速度约5660000个点/秒.

图形模式下画线(别问我是怎么实现的......用就行):
procedure line(x1,y1,x2,y2:word; color:byte); assembler;
  var DeX,DeY  : Integer;
    IncF     : Integer;
    Offset   : Word;
  asm
    MOV  AX,[X2]
    SUB  AX,[X1]
    JNC  @@Dont1
    NEG  AX
  @@Dont1:
    MOV  [DeX],AX
    MOV  AX,[Y2]
    SUB  AX,[Y1]
    JNC  @@Dont2
    NEG  AX
  @@Dont2:
    MOV  [DeY],AX
    CMP  AX,[DeX]
    JBE  @@OtherLine
    MOV  AX,[Y1]
    CMP  AX,[Y2]
    JBE  @@DontSwap1
    MOV  BX,[Y2]
    MOV  [Y1],BX
    MOV  [Y2],AX
    MOV  AX,[X1]
    MOV  BX,[X2]
    MOV  [X1],BX
    MOV  [X2],AX
  @@DontSwap1:
    MOV  [IncF],1
    MOV  AX,[X1]
    CMP  AX,[X2]
    JBE  @@SkipNegate1
    Neg  [IncF]
  @@SkipNegate1:
    MOV  AX,[Y1]
    MOV  BX,320
    MUL  BX
    MOV  DI,AX
    ADD  DI,[X1]        {Offset in DI}
    MOV  BX,[DeY]       {RefVar in BX}
    MOV  CX,BX
    MOV  AX,$A000
    MOV  ES,AX          {Video segment}
    MOV  DL,[Color]
    MOV  SI,[DeX]
  @@DrawLoop1:
    MOV  ES:[DI],DL
    ADD  DI,320
    SUB  BX,SI
    JNC  @@GoOn1
    ADD  BX,[DeY]
    ADD  DI,[IncF]
  @@GoOn1:
    LOOP @@DrawLoop1
    JMP  @@ExitLine
  @@OtherLine:
    MOV  AX,[X1]
    CMP  AX,[X2]
    JBE  @@DontSwap2
    MOV  BX,[X2]
    MOV  [X1],BX
    MOV  [X2],AX
    MOV  AX,[Y1]
    MOV  BX,[Y2]
    MOV  [Y1],BX
    MOV  [Y2],AX
  @@DontSwap2:
    MOV  [IncF],320
    MOV  AX,[Y1]
    CMP  AX,[Y2]
    JBE  @@SkipNegate2
    NEG  [IncF]
  @@SkipNegate2:
    MOV  AX,[Y1]
    MOV  BX,320
    MUL  BX
    MOV  DI,AX
    ADD  DI,[X1]        {Offset in DI}
    MOV  BX,[DeX]       {RefVar in BX}
    MOV  CX,BX
    MOV  AX,$A000
    MOV  ES,AX          {Video segment}
    MOV  DL,[Color]
    MOV  SI,[DeY]
  @@DrawLoop2:
    MOV  ES:[DI],DL
    INC  DI
    SUB  BX,SI
    JNC  @@GoOn2
    ADD  BX,[DeX]
    ADD  DI,[IncF]
  @@GoOn2:
    Loop @@DrawLoop2
  @@ExitLine:
End;
x1,y1是第1个点的坐标
x2,y2是第2个点的坐标
color是颜色.
在我的机器上速度约35300条线(随机坐标)/秒, 相比之下Pascal自带的Graph单元就是渣啊

你可以看看这个东西:[url=http://www.programmersheaven.com/d/click.aspx?ID=F28009]点击此处下载[/url]
这是一个VGA单元, 非常好用(只要你能看懂鸟语XD)

3 楼

放点好东西
SVGA图形单元:[url=ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/2svga.zip]点这里下载[/url]
800x600x24位真彩色, 效果除了强大还是强大, 而且是国人开发(虽然说明文档还是鸟语......- -||)

4 楼

谢谢,能不能把CMP.TPU
MOUSE.TPU
SHOW256.TPU
SHOW320.TPU
SVGA16.TPU
SVGA256.TPU
TXT.TPU
VGA256.TPU
这几个单元详细讲解一下呢?

5 楼

还有一个问题,为什么加了那两句后还是会闪的?

6 楼

你刷屏是只刷屏幕的一部分还是全部刷?
如果是只刷屏幕的一部分, 效果不是很明显, 我的建议是: 把屏幕上的图象存放在一个数组里, 然后对那个数组进行操作, 最后用那个数组刷屏, 只要处理的好, 完全看不到闪烁.

7 楼

[quote]
谢谢,能不能把CMP.TPU
MOUSE.TPU
SHOW256.TPU
SHOW320.TPU
SVGA16.TPU
SVGA256.TPU
TXT.TPU
VGA256.TPU
这几个单元详细讲解一下呢?
[/quote]
那里面有说明文档......说实话, 那个单元我不常用......

8 楼

关于刷屏的那个程序,原代码太长,不方便贴过来,可以到http://hi.baidu.com/wywy/blog/item/16576f6371f775600d33fa56.html
里去看看.

9 楼

能不能把那些文件发一份给我? Thanks

10 楼

我晕......这么卡, 我回去做一个发给你

我来回复

您尚未登录,请登录后再回复。点此登录或注册