VGA12h模式下GUI界面设计的速度考虑
1。 VGA12h模式下各种不同方式划线1满屏的耗时对比:
==============================================
划线方法 耗时(秒) 运行程序* 写次数 线性地址计算 REG设置
-----------------------------------------------------------------------------------------------------
扫描划块(REG) 0.046343422 lineff.com L*P/8 线间不重复 不重复
扫描划线(REG) 0.061104584 linehh.com L*P/8 线间重复 线间重复
垂直划线(REG) 0.326120375 linev.com L*P 点间不重复 线间重复
普通划线(REG) 0.823882125 linen.com L*P 点间重复 线间重复
-----------------------------------------------------------------------------------------------------
普通划点(BIOS) 3.899710625 lineb.com L*P 点间重复 点间重复
==============================================
注:REG--VGA寄存器 BIOS--BIOS中断 L--线条数 P--像素数
* --lineff.com、linehh.com划线100*16屏,其余.com划16屏
由此可见,BIOS描点划线速度太慢(耗时约为扫描线法的64倍),在GUI编程中不予考虑。即使是采用VGA寄存器编程,普通划线耗时约为扫描线法的13.5倍,普通划线耗时约为垂直线法的2.53倍。
注意:lineff.com和linehh.com的方式是都是划扫描线,而且因为线条的起止落在8的倍数的像素上,所以每次写8个像素,划块、划线速度最快,lineff.com因为线间不重复计算地址,所以更快,耗时是linehh.com的3分之2!linev.com是划竖线最快的方式,原因同扫描线划块--不重复计算地址!划非水平线、非竖线的其它线条,就只能采用普通划线方式。
所以,在要求速度的GUI设计中划块要用lineff.com方式,划框线要用linehh.com和linev.com方式,而不是用linen.com普通划线方式!
2。 绝对压榨速度的几点考虑:
在用VGA寄存器法划线时,必然要经历先①计算视频缓冲线性地址、②计算位屏蔽值、设置位屏蔽等寄存器,然后③描点划线,最后④恢复改动过的寄存器的默认值这几个阶段。
在第①环节中可能用到乘除法,但乘法和除法被公认为开销较大的运算,遇到需要反复执行的乘除法时,应该以移位和加法替代,左移1位相当于乘以2,右移2位相当于除以4。在许多绘图算法里计算地址时都要用到乘以80,可如下计算:
80*y=(64+16)*y=(y shl 6)+(y shl 4)
汇编代码为:
mov ax,y
mov cx,4
shl ax,cl ;y*16
mov bx,ax
shl bx,1
shl bx,1 ;y*64
add ax,bx ;(y*64)+(y*16)
在第②③④阶段必然用到的寄存器操作中,是用out dx,al还是out dx,ax,效率也是不一样的。如下程序段:
mov dx,3CEh
xor al,al
out dx,al
inc dx
mov ax,Color
out dx,al
dec dx
mov al,1
out dx,al
mov al,0Fh
out dx,al
可考虑改成:
mov dx,3CEh
xor al,al
mov ah,Color
out dx,ax
mov ax,0F01h
out dx,ax
在划线的各个阶段中,都可以注意一下此步操作有无必要重复,如有固定的增量关系等,可以简化,如无必要,则可省略。可参照line?.com中的程序代码。
1。 VGA12h模式下各种不同方式划线1满屏的耗时对比:
==============================================
划线方法 耗时(秒) 运行程序* 写次数 线性地址计算 REG设置
-----------------------------------------------------------------------------------------------------
扫描划块(REG) 0.046343422 lineff.com L*P/8 线间不重复 不重复
扫描划线(REG) 0.061104584 linehh.com L*P/8 线间重复 线间重复
垂直划线(REG) 0.326120375 linev.com L*P 点间不重复 线间重复
普通划线(REG) 0.823882125 linen.com L*P 点间重复 线间重复
-----------------------------------------------------------------------------------------------------
普通划点(BIOS) 3.899710625 lineb.com L*P 点间重复 点间重复
==============================================
注:REG--VGA寄存器 BIOS--BIOS中断 L--线条数 P--像素数
* --lineff.com、linehh.com划线100*16屏,其余.com划16屏
由此可见,BIOS描点划线速度太慢(耗时约为扫描线法的64倍),在GUI编程中不予考虑。即使是采用VGA寄存器编程,普通划线耗时约为扫描线法的13.5倍,普通划线耗时约为垂直线法的2.53倍。
注意:lineff.com和linehh.com的方式是都是划扫描线,而且因为线条的起止落在8的倍数的像素上,所以每次写8个像素,划块、划线速度最快,lineff.com因为线间不重复计算地址,所以更快,耗时是linehh.com的3分之2!linev.com是划竖线最快的方式,原因同扫描线划块--不重复计算地址!划非水平线、非竖线的其它线条,就只能采用普通划线方式。
所以,在要求速度的GUI设计中划块要用lineff.com方式,划框线要用linehh.com和linev.com方式,而不是用linen.com普通划线方式!
2。 绝对压榨速度的几点考虑:
在用VGA寄存器法划线时,必然要经历先①计算视频缓冲线性地址、②计算位屏蔽值、设置位屏蔽等寄存器,然后③描点划线,最后④恢复改动过的寄存器的默认值这几个阶段。
在第①环节中可能用到乘除法,但乘法和除法被公认为开销较大的运算,遇到需要反复执行的乘除法时,应该以移位和加法替代,左移1位相当于乘以2,右移2位相当于除以4。在许多绘图算法里计算地址时都要用到乘以80,可如下计算:
80*y=(64+16)*y=(y shl 6)+(y shl 4)
汇编代码为:
mov ax,y
mov cx,4
shl ax,cl ;y*16
mov bx,ax
shl bx,1
shl bx,1 ;y*64
add ax,bx ;(y*64)+(y*16)
在第②③④阶段必然用到的寄存器操作中,是用out dx,al还是out dx,ax,效率也是不一样的。如下程序段:
mov dx,3CEh
xor al,al
out dx,al
inc dx
mov ax,Color
out dx,al
dec dx
mov al,1
out dx,al
mov al,0Fh
out dx,al
可考虑改成:
mov dx,3CEh
xor al,al
mov ah,Color
out dx,ax
mov ax,0F01h
out dx,ax
在划线的各个阶段中,都可以注意一下此步操作有无必要重复,如有固定的增量关系等,可以简化,如无必要,则可省略。可参照line?.com中的程序代码。
附件
my major is english----my love is dos----my teacher is the buddha----my friends--how about U
