主题:[求助]关于图象的
angwuy
[专家分:2280] 发布于 2006-11-02 12:09:00
我在编图象程序时每过一段时间就要刷屏,刷屏时屏幕闪的很厉害,这个有什么解决办法?
回复列表 (共32个回复)
沙发
maxumi [专家分:2200] 发布于 2006-11-02 14:43:00
你的帖居然被我发现了XD
请在刷屏前加这2句:
while (Port[$3DA] AND 8 > 0) do;
while (Port[$3DA] AND 8 = 0) do;
原理比较复杂, 用就行了
板凳
maxumi [专家分:2200] 发布于 2006-11-02 15:22:00
其实我想说, 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 楼
maxumi [专家分:2200] 发布于 2006-11-02 15:31:00
放点好东西
SVGA图形单元:[url=ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/2svga.zip]点这里下载[/url]
800x600x24位真彩色, 效果除了强大还是强大, 而且是国人开发(虽然说明文档还是鸟语......- -||)
4 楼
angwuy [专家分:2280] 发布于 2006-11-02 16:47:00
谢谢,能不能把CMP.TPU
MOUSE.TPU
SHOW256.TPU
SHOW320.TPU
SVGA16.TPU
SVGA256.TPU
TXT.TPU
VGA256.TPU
这几个单元详细讲解一下呢?
5 楼
angwuy [专家分:2280] 发布于 2006-11-02 17:01:00
还有一个问题,为什么加了那两句后还是会闪的?
6 楼
maxumi [专家分:2200] 发布于 2006-11-03 07:44:00
你刷屏是只刷屏幕的一部分还是全部刷?
如果是只刷屏幕的一部分, 效果不是很明显, 我的建议是: 把屏幕上的图象存放在一个数组里, 然后对那个数组进行操作, 最后用那个数组刷屏, 只要处理的好, 完全看不到闪烁.
7 楼
maxumi [专家分:2200] 发布于 2006-11-03 07:48:00
[quote]
谢谢,能不能把CMP.TPU
MOUSE.TPU
SHOW256.TPU
SHOW320.TPU
SVGA16.TPU
SVGA256.TPU
TXT.TPU
VGA256.TPU
这几个单元详细讲解一下呢?
[/quote]
那里面有说明文档......说实话, 那个单元我不常用......
8 楼
angwuy [专家分:2280] 发布于 2006-11-03 09:43:00
关于刷屏的那个程序,原代码太长,不方便贴过来,可以到http://hi.baidu.com/wywy/blog/item/16576f6371f775600d33fa56.html
里去看看.
9 楼
maxumi [专家分:2200] 发布于 2006-11-03 10:27:00
能不能把那些文件发一份给我? Thanks
10 楼
maxumi [专家分:2200] 发布于 2006-11-03 10:44:00
我晕......这么卡, 我回去做一个发给你
我来回复