怎么样测试VGA12H写屏速度?
怎么样测试VGA12H写屏速度?
	File: VGASpeed.txt
	Name: 测试VGA12H模式的速度
	Author: zyl910
	Blog: http://blog.csdn.net/zyl910/
	Version: V1.1
	Updata: 2006-11-23
下载(注意修改下载后的扩展名)
	
	经过上一次的测试后,发现读显存的速度比写显存的速度慢得多。
	很多资料建议我们使用写模式1来实现显存内的位图传送。当使用写模式1进行位图传送时,是一边读一边写的形式。而现在内存读速度很慢,那么会不会影响位图传送速度呢?于是我做了个测试。
	测试结果
	~~~~~~~~
	CPU : AMD Athlon XP 1700+(实际频率:1463 MHz (11 x 133))
	内存: DDR266 256MB
	显卡: NVIDIA GeForce2 MX/MX 400(AGP 4X)
	显存带宽: 125MHz * 128bit = 2000MB/s
	操作系统: Windows XP SP2
	[FPS: C]
	Video to System: 11.3000
	System to Video : 51.0807
	OffScr to System: 11.7646
	System to OffScr: 51.6840
	Video to OffScr: 37.1039
	OffScr to Video : 37.0033
	[FPS: movsb]
	Video to System: 11.9657
	System to Video : 85.5702
	OffScr to System: 11.9657
	System to OffScr: 85.5702
	Video to OffScr: 37.2044
	OffScr to Video : 37.3050
	[FPS: movsw]
	Video to System: 23.5293
	System to Video : 122.4729
	OffScr to System: 23.6298
	System to OffScr: 122.2718
	[FPS: movsd]
	Video to System: 44.7459
	System to Video : 152.7392
	OffScr to System: 44.8464
	System to OffScr: 152.4376
	CPU : AMD Athlon XP 1700+(实际频率:1463 MHz (11 x 133))
	内存: DDR266 256MB
	显卡: NVIDIA GeForce2 MX/MX 400(AGP 4X)
	显存带宽: 125MHz * 128bit = 2000MB/s
	操作系统: Windows 98SE
	[FPS: C]
	Video to System: 11.6641
	System to Video : 60.7337
	OffScr to System: 11.7000
	System to OffScr: 60.5326
	Video to OffScr: 35.3945
	OffScr to Video : 35.4950
	[FPS: movsb]
	Video to System: 11.9657
	System to Video : 98.9436
	OffScr to System: 11.9657
	System to OffScr: 99.2453
	Video to OffScr: 35.6961
	OffScr to Video : 35.6961
	[FPS: movsw]
	Video to System: 23.4287
	System to Video : 173.4530
	OffScr to System: 23.5293
	System to OffScr: 173.4530
	[FPS: movsd]
	Video to System: 44.4442
	System to Video : 268.1735
	OffScr to System: 44.4442
	System to OffScr: 269.5812
	CPU : AMD Athlon XP 1700+(实际频率:1463 MHz (11 x 133))
	内存: DDR266 256MB
	显卡: NVIDIA GeForce2 MX/MX 400(AGP 4X)
	显存带宽: 125MHz * 128bit = 2000MB/s
	操作系统: DOS实模式
	[FPS: C]
	Video to System: 11.7646
	System to Video : 61.2365
	OffScr to System: 11.8652
	System to OffScr: 61.1359
	Video to OffScr: 37.2044
	OffScr to Video : 37.2044
	[FPS: movsb]
	Video to System: 12.0663
	System to Video : 108.0939
	OffScr to System: 12.0663
	System to OffScr: 108.3956
	Video to OffScr: 37.4055
	OffScr to Video : 37.3050
	[FPS: movsw]
	Video to System: 23.6298
	System to Video : 190.4464
	OffScr to System: 23.7304
	System to OffScr: 190.5470
	[FPS: movsd]
	Video to System: 44.9470
	System to Video : 278.9326
	OffScr to System: 44.9470
	System to OffScr: 279.4354
	CPU : Intel Celeron, 1000 MHz (10 x 100)
	内存: SDRAM 256MB
	显卡: ATI Radeon 9550(AGP 4X)
	显存带宽: 392MHz * 128bit = 6272MB/s
	操作系统: Windows XP SP2
	[FPS: C]
	Video to System: 11.5000
	System to Video : 52.0862
	OffScr to System: 11.6641
	System to OffScr: 52.0862
	Video to OffScr: 32.6796
	OffScr to Video : 32.5790
	[FPS: movsb]
	Video to System: 11.6641
	System to Video : 51.8851
	OffScr to System: 11.6000
	System to OffScr: 52.0862
	Video to OffScr: 32.6796
	OffScr to Video : 32.5790
	[FPS: movsw]
	Video to System: 22.2221
	System to Video : 76.4199
	OffScr to System: 22.1215
	System to OffScr: 76.7215
	[FPS: movsd]
	Video to System: 40.5227
	System to Video : 100.3514
	OffScr to System: 40.5227
	System to OffScr: 100.3514
	
	分析
	~~~~
	一、用写模式1实现的位图传送的确不够快
	跟我们猜想的一样,位图传送的确不够快,才30多郑
	让我们理论分析一下。
	每一次是先读再写,且每次硬件会利用锁存器一次性复制4个字节,所以速度为:1/(1/11.3000 + 1/51.0807)*4 = 9.25305 * 4 = 37.0122
	与测试结果相符。
	看来不能在VGA12H下利用显存内位图传送实现高速动画。最佳方案是先在内存中将屏幕画好,再一次性传送到显存。反正现在CPU主频够高,DDR内存条访问速度够快。
	估计写模式1只能用作填充(如清屏)。
	
	二、访问离屏显存并没有比访问主表面显存快
	受某些早期资料的误导,曾以为访问离屏显存会比较快。可是现代的显卡都有缓冲机制,所以无论是访问主表面显存,还是访问离屏显存,速度都一样快。
	当然在有条件的时候,应该使用离屏显存来实现双缓冲平滑动画。
	测试代码
	~~~~~~~~
| /* File: VGA12H.c Name: 测试VGA12H模式的速度 Author: zyl910 Blog: http://blog.csdn.net/zyl910/ Version: V1.0 Updata: 2006-11-23 S: system memory. 系统内存 V: video memory(primary surface). 主表面显存 O: offscreen video memory. 离屏显存 */ #include <stdio.h> #include <conio.h> #include <mem.h> #include <dos.h> typedef unsigned char BYTE; typedef unsigned int WORD; typedef unsigned long DWORD; typedefvoid far* LPVOID; #define SCR_W640 #define SCR_H480 #define SCR_PLANES4 #define SCANSIZE_DIB((SCR_W)/2) #define SCANSIZE_VGA((SCR_W)/8) #defineSEG_VIDEO0xA000 #define LPOFFSCREEN(MK_FP(SEG_VIDEO, (unsigned)0xF000)) #define WaitVR() while(!(inportb(0x3da)&0x08)) static volatile DWORD far* const pbiosclock = MK_FP(0x0040, 0x6C); #define BIOSCLOCK_F((double)18.2) typedef void (*TESTFUNC)(DWORD iF); #define TESTFPS_WAITVR1 static BYTEbyVGA[SCR_PLANES][SCANSIZE_VGA]; 
voidrepmovsb(LPVOIDlpD, LPVOIDlpS, WORDcBytes)
{
_asm{
pushds
pushes
movcx, cBytes
lesdi, lpD
ldssi, lpS
cld
repmovsb
popes
popds
}
}
voidrepmovsw(LPVOIDlpD, LPVOIDlpS, WORDcWords)
{
_asm{
pushds
pushes
movcx, cWords
lesdi, lpD
ldssi, lpS
cld
repmovsw
popes
popds;
}
}
voidrepmovsd(LPVOIDlpD, LPVOIDlpS, WORDcDWords)
{
_asm{
pushds
pushes
movcx, cDWords
lesdi, lpD
ldssi, lpS
cld
db 0x66;repmovsw; /* rep movsd */
popes
popds
}
}
voidvgasetvideomode(BYTEbymode)
{
_asm{
moval, bymode;
movah, 0x00;
int0x10;
}
}
intvgasetwritemode(intmode)
{
BYTEby;
outportb(0x3CE, 5);
by = inportb(0x3CF);
outportb(0x3CF, (by & 0xFC) | (mode & 0x03));
returnmode & 0x03;
}
voidvgasetreadplane(BYTEn)
{
_asm{
movdx, 0x3CE;/* gc[4]:Read Map Select */
moval, 4;
outdx, al;
incdx;
mov al, n;
out dx, al;
}
}
voidvgasetplanemask(BYTEbymask)
{
_asm{
movdx, 0x3C4;/* sc[2]:Map Mask */
moval, 2;
outdx, al;
incdx;
mov al, bymask;
out dx, al;
}
}
doubleTestFps(TESTFUNCpfun, intnFlags)
{
DWORDcntF;
DWORD tmrold, tmrcur, tmrover;
do{
cntF = 0;
tmrold = *pbiosclock;
tmrover = tmrold + (DWORD)(BIOSCLOCK_F * 10); /* 10s */
do{
if (nFlags & TESTFPS_WAITVR)WaitVR();
pfun(cntF);cntF++; tmrcur = *pbiosclock; }while((tmrcur<tmrover)&&(tmrcur>=tmrold)); if (tmrcur < tmrold)continue; }while(0); return cntF / ((tmrcur-tmrold)/BIOSCLOCK_F); } 
void filloffscreen(intc)
{
BYTEiP;
BYTEbymask;vgasetwritemode(0); 
memset(byVGA[0], -(1&(c>>0)), SCANSIZE_VGA);
memset(byVGA[1], -(1&(c>>1)), SCANSIZE_VGA);
memset(byVGA[2], -(1&(c>>2)), SCANSIZE_VGA);
memset(byVGA[3], -(1&(c>>3)), SCANSIZE_VGA);
bymask = 1;
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetplanemask(bymask);
repmovsd(LPOFFSCREEN, byVGA[iP], SCANSIZE_VGA/sizeof(DWORD));
bymask <<= 1;
}
}
void Test_C_V2S(DWORD iF)
{
intiX, iY;
intiP;
WORDpscan;
BYTE far*pbyV;
BYTE*pbyS;vgasetwritemode(0); 
pscan = 0;
for(iY=0; iY<SCR_H; iY++)
{
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetreadplane(iP);
pbyS = byVGA[iP];
pbyV = MK_FP(SEG_VIDEO, pscan);
for(iX=0; iX<SCANSIZE_VGA; iX++)
{
*pbyS++ = *pbyV++;
}
}
pscan += SCANSIZE_VGA;
}
}
void Test_C_S2V(DWORD iF)
{
intiX, iY;
BYTEiP;
WORDpscan;
BYTE far*pbyV;
BYTE*pbyS;
BYTEbymask;vgasetwritemode(0); 
memset(byVGA[0], -(1&(((int)iF)>>0)), SCANSIZE_VGA);
memset(byVGA[1], -(1&(((int)iF)>>1)), SCANSIZE_VGA);
memset(byVGA[2], -(1&(((int)iF)>>2)), SCANSIZE_VGA);
memset(byVGA[3], -(1&(((int)iF)>>3)), SCANSIZE_VGA);
pscan = 0;
for(iY=0; iY<SCR_H; iY++)
{
bymask = 1;
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetplanemask(bymask);
pbyS = byVGA[iP];
pbyV = MK_FP(SEG_VIDEO, pscan);
for(iX=0; iX<SCANSIZE_VGA; iX++)
{
*pbyV++ = *pbyS++;
}
bymask <<= 1;
}
pscan += SCANSIZE_VGA;
}
}
void Test_C_O2S(DWORD iF)
{
intiX, iY;
BYTEiP;
BYTE far*pbyV;
BYTE*pbyS;vgasetwritemode(0); 
for(iY=0; iY<SCR_H; iY++)
{
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetreadplane(iP);
pbyS = byVGA[iP];
pbyV = LPOFFSCREEN;
for(iX=0; iX<SCANSIZE_VGA; iX++)
{
*pbyS++ = *pbyV++;
}
}
}
}
void Test_C_S2O(DWORD iF)
{
intiX, iY;
BYTEiP;
BYTE far*pbyV;
BYTE*pbyS;
BYTEbymask;vgasetwritemode(0); 
memset(byVGA[0], -(1&(((int)iF)>>0)), SCANSIZE_VGA);
memset(byVGA[1], -(1&(((int)iF)>>1)), SCANSIZE_VGA);
memset(byVGA[2], -(1&(((int)iF)>>2)), SCANSIZE_VGA);
memset(byVGA[3], -(1&(((int)iF)>>3)), SCANSIZE_VGA);
for(iY=0; iY<SCR_H; iY++)
{
bymask = 1;
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetplanemask(bymask);
pbyS = byVGA[iP];
pbyV = LPOFFSCREEN;
for(iX=0; iX<SCANSIZE_VGA; iX++)
{
*pbyV++ = *pbyS++;
}
bymask <<= 1;
}
}
}
void Test_C_V2O(DWORD iF)
{
intiX, iY;
WORDpscan;
BYTE far*pbyV;
BYTE far*pbyO;vgasetwritemode(1); vgasetplanemask(0xFF); 
pscan = 0;
for(iY=0; iY<SCR_H; iY++)
{
pbyO = LPOFFSCREEN;
pbyV = MK_FP(SEG_VIDEO, pscan);
for(iX=0; iX<SCANSIZE_VGA; iX++)
{
*pbyO++ = *pbyV++;
}
pscan += SCANSIZE_VGA;
}
}
void Test_C_O2V(DWORD iF)
{
intiX, iY;
WORDpscan;
BYTE far*pbyV;
BYTE far*pbyO;filloffscreen(iF & 0xF); vgasetwritemode(1); vgasetplanemask(0xFF); 
pscan = 0;
for(iY=0; iY<SCR_H; iY++)
{
pbyO = LPOFFSCREEN;
pbyV = MK_FP(SEG_VIDEO, pscan);
for(iX=0; iX<SCANSIZE_VGA; iX++)
{
*pbyV++ = *pbyO++;
}
pscan += SCANSIZE_VGA;
}
}
void Test_SB_V2S(DWORD iF)
{
intiY;
intiP;
WORDpscan;vgasetwritemode(0); 
pscan = 0;
for(iY=0; iY<SCR_H; iY++)
{
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetreadplane(iP);
repmovsb(byVGA[iP], MK_FP(SEG_VIDEO, pscan), SCANSIZE_VGA/sizeof(BYTE));
}
pscan += SCANSIZE_VGA;
}
}
void Test_SB_S2V(DWORD iF)
{
intiY;
BYTEiP;
WORDpscan;
BYTEbymask;vgasetwritemode(0); 
memset(byVGA[0], -(1&(((int)iF)>>0)), SCANSIZE_VGA);
memset(byVGA[1], -(1&(((int)iF)>>1)), SCANSIZE_VGA);
memset(byVGA[2], -(1&(((int)iF)>>2)), SCANSIZE_VGA);
memset(byVGA[3], -(1&(((int)iF)>>3)), SCANSIZE_VGA);
pscan = 0;
for(iY=0; iY<SCR_H; iY++)
{
bymask = 1;
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetplanemask(bymask);
repmovsb(MK_FP(SEG_VIDEO, pscan), byVGA[iP], SCANSIZE_VGA/sizeof(BYTE));
bymask <<= 1;
}
pscan += SCANSIZE_VGA;
}
}
void Test_SB_O2S(DWORD iF)
{
intiY;
BYTEiP;vgasetwritemode(0); 
for(iY=0; iY<SCR_H; iY++)
{
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetreadplane(iP);
repmovsb(byVGA[iP], LPOFFSCREEN, SCANSIZE_VGA/sizeof(BYTE));
}
}
}
void Test_SB_S2O(DWORD iF)
{
intiY;
BYTEiP;
BYTEbymask;vgasetwritemode(0); 
memset(byVGA[0], -(1&(((int)iF)>>0)), SCANSIZE_VGA);
memset(byVGA[1], -(1&(((int)iF)>>1)), SCANSIZE_VGA);
memset(byVGA[2], -(1&(((int)iF)>>2)), SCANSIZE_VGA);
memset(byVGA[3], -(1&(((int)iF)>>3)), SCANSIZE_VGA);
for(iY=0; iY<SCR_H; iY++)
{
bymask = 1;
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetplanemask(bymask);
repmovsb(LPOFFSCREEN, byVGA[iP], SCANSIZE_VGA/sizeof(BYTE));
bymask <<= 1;
}
}
}
void Test_SB_V2O(DWORD iF)
{
intiY;
WORDpscan;vgasetwritemode(1); vgasetplanemask(0xFF); 
pscan = 0;
for(iY=0; iY<SCR_H; iY++)
{
repmovsb(LPOFFSCREEN, MK_FP(SEG_VIDEO, pscan), SCANSIZE_VGA/sizeof(BYTE));
pscan += SCANSIZE_VGA;
}
}
void Test_SB_O2V(DWORD iF)
{
intiY;
WORDpscan;filloffscreen(iF & 0xF); vgasetwritemode(1); vgasetplanemask(0xFF); 
pscan = 0;
for(iY=0; iY<SCR_H; iY++)
{
repmovsb(MK_FP(SEG_VIDEO, pscan), LPOFFSCREEN, SCANSIZE_VGA/sizeof(BYTE));
pscan += SCANSIZE_VGA;
}
}
void Test_SW_V2S(DWORD iF)
{
intiY;
intiP;
WORDpscan;vgasetwritemode(0); 
pscan = 0;
for(iY=0; iY<SCR_H; iY++)
{
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetreadplane(iP);
repmovsw(byVGA[iP], MK_FP(SEG_VIDEO, pscan), SCANSIZE_VGA/sizeof(WORD));
}
pscan += SCANSIZE_VGA;
}
}
void Test_SW_S2V(DWORD iF)
{
intiY;
BYTEiP;
WORDpscan;
BYTEbymask;vgasetwritemode(0); 
memset(byVGA[0], -(1&(((int)iF)>>0)), SCANSIZE_VGA);
memset(byVGA[1], -(1&(((int)iF)>>1)), SCANSIZE_VGA);
memset(byVGA[2], -(1&(((int)iF)>>2)), SCANSIZE_VGA);
memset(byVGA[3], -(1&(((int)iF)>>3)), SCANSIZE_VGA);
pscan = 0;
for(iY=0; iY<SCR_H; iY++)
{
bymask = 1;
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetplanemask(bymask);
repmovsw(MK_FP(SEG_VIDEO, pscan), byVGA[iP], SCANSIZE_VGA/sizeof(WORD));
bymask <<= 1;
}
pscan += SCANSIZE_VGA;
}
}
void Test_SW_O2S(DWORD iF)
{
intiY;
BYTEiP;vgasetwritemode(0); 
for(iY=0; iY<SCR_H; iY++)
{
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetreadplane(iP);
repmovsw(byVGA[iP], LPOFFSCREEN, SCANSIZE_VGA/sizeof(WORD));
}
}
}
void Test_SW_S2O(DWORD iF)
{
intiY;
BYTEiP;
BYTEbymask;vgasetwritemode(0); 
memset(byVGA[0], -(1&(((int)iF)>>0)), SCANSIZE_VGA);
memset(byVGA[1], -(1&(((int)iF)>>1)), SCANSIZE_VGA);
memset(byVGA[2], -(1&(((int)iF)>>2)), SCANSIZE_VGA);
memset(byVGA[3], -(1&(((int)iF)>>3)), SCANSIZE_VGA);
for(iY=0; iY<SCR_H; iY++)
{
bymask = 1;
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetplanemask(bymask);
repmovsw(LPOFFSCREEN, byVGA[iP], SCANSIZE_VGA/sizeof(WORD));
bymask <<= 1;
}
}
}
void Test_SD_V2S(DWORD iF)
{
intiY;
intiP;
WORDpscan;vgasetwritemode(0); 
pscan = 0;
for(iY=0; iY<SCR_H; iY++)
{
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetreadplane(iP);
repmovsd(byVGA[iP], MK_FP(SEG_VIDEO, pscan), SCANSIZE_VGA/sizeof(DWORD));
}
pscan += SCANSIZE_VGA;
}
}
void Test_SD_S2V(DWORD iF)
{
intiY;
BYTEiP;
WORDpscan;
BYTEbymask;vgasetwritemode(0); 
memset(byVGA[0], -(1&(((int)iF)>>0)), SCANSIZE_VGA);
memset(byVGA[1], -(1&(((int)iF)>>1)), SCANSIZE_VGA);
memset(byVGA[2], -(1&(((int)iF)>>2)), SCANSIZE_VGA);
memset(byVGA[3], -(1&(((int)iF)>>3)), SCANSIZE_VGA);
pscan = 0;
for(iY=0; iY<SCR_H; iY++)
{
bymask = 1;
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetplanemask(bymask);
repmovsd(MK_FP(SEG_VIDEO, pscan), byVGA[iP], SCANSIZE_VGA/sizeof(DWORD));
bymask <<= 1;
}
pscan += SCANSIZE_VGA;
}
}
void Test_SD_O2S(DWORD iF)
{
intiY;
BYTEiP;vgasetwritemode(0); 
for(iY=0; iY<SCR_H; iY++)
{
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetreadplane(iP);
repmovsd(byVGA[iP], LPOFFSCREEN, SCANSIZE_VGA/sizeof(DWORD));
}
}
}
void Test_SD_S2O(DWORD iF)
{
intiY;
BYTEiP;
BYTEbymask;vgasetwritemode(0); 
memset(byVGA[0], -(1&(((int)iF)>>0)), SCANSIZE_VGA);
memset(byVGA[1], -(1&(((int)iF)>>1)), SCANSIZE_VGA);
memset(byVGA[2], -(1&(((int)iF)>>2)), SCANSIZE_VGA);
memset(byVGA[3], -(1&(((int)iF)>>3)), SCANSIZE_VGA);
for(iY=0; iY<SCR_H; iY++)
{
bymask = 1;
for(iP=0; iP<SCR_PLANES; iP++)
{
vgasetplanemask(bymask);
repmovsd(LPOFFSCREEN, byVGA[iP], SCANSIZE_VGA/sizeof(DWORD));
bymask <<= 1;
}
}
}
intmain(void)
{
doublefpsC_V2S, fpsC_S2V, fpsC_O2S, fpsC_S2O, fpsC_V2O, fpsC_O2V;
doublefpsSB_V2S, fpsSB_S2V, fpsSB_O2S, fpsSB_S2O, fpsSB_V2O, fpsSB_O2V;
doublefpsSW_V2S, fpsSW_S2V, fpsSW_O2S, fpsSW_S2O;
doublefpsSD_V2S, fpsSD_S2V, fpsSD_O2S, fpsSD_S2O;/* VGA 12h: 640*480*4bit */ vgasetvideomode(0x12); /* C language */ fpsC_V2S = TestFps((TESTFUNC)Test_C_V2S, 0); fpsC_S2V = TestFps((TESTFUNC)Test_C_S2V, 0); fpsC_O2S = TestFps((TESTFUNC)Test_C_O2S, 0); fpsC_S2O = TestFps((TESTFUNC)Test_C_S2O, 0); fpsC_V2O = TestFps((TESTFUNC)Test_C_V2O, 0); fpsC_O2V = TestFps((TESTFUNC)Test_C_O2V, 0); /* movsb */ fpsSB_V2S = TestFps((TESTFUNC)Test_SB_V2S, 0); fpsSB_S2V = TestFps((TESTFUNC)Test_SB_S2V, 0); fpsSB_O2S = TestFps((TESTFUNC)Test_SB_O2S, 0); fpsSB_S2O = TestFps((TESTFUNC)Test_SB_S2O, 0); fpsSB_V2O = TestFps((TESTFUNC)Test_SB_V2O, 0); fpsSB_O2V = TestFps((TESTFUNC)Test_SB_O2V, 0); /* movsw */ fpsSW_V2S = TestFps((TESTFUNC)Test_SW_V2S, 0); fpsSW_S2V = TestFps((TESTFUNC)Test_SW_S2V, 0); fpsSW_O2S = TestFps((TESTFUNC)Test_SW_O2S, 0); fpsSW_S2O = TestFps((TESTFUNC)Test_SW_S2O, 0); /* movsd */ fpsSD_V2S = TestFps((TESTFUNC)Test_SD_V2S, 0); fpsSD_S2V = TestFps((TESTFUNC)Test_SD_S2V, 0); fpsSD_O2S = TestFps((TESTFUNC)Test_SD_O2S, 0); fpsSD_S2O = TestFps((TESTFUNC)Test_SD_S2O, 0); /* Text Mode */ vgasetvideomode(0x3); 
/* out */
printf("[FPS: C]/n");
printf("Video to System:%16.4f/n", fpsC_V2S);
printf("System to Video :%16.4f/n", fpsC_S2V);
printf("OffScr to System:%16.4f/n", fpsC_O2S);
printf("System to OffScr:%16.4f/n", fpsC_S2O);
printf("Video to OffScr:%16.4f/n", fpsC_V2O);
printf("OffScr to Video :%16.4f/n", fpsC_O2V);
printf("[FPS: movsb]/n");
printf("Video to System:%16.4f/n", fpsSB_V2S);
printf("System to Video :%16.4f/n", fpsSB_S2V);
printf("OffScr to System:%16.4f/n", fpsSB_O2S);
printf("System to OffScr:%16.4f/n", fpsSB_S2O);
printf("Video to OffScr:%16.4f/n", fpsSB_V2O);
printf("OffScr to Video :%16.4f/n", fpsSB_O2V);
printf("[FPS: movsw]/n");
printf("Video to System:%16.4f/n", fpsSW_V2S);
printf("System to Video :%16.4f/n", fpsSW_S2V);
printf("OffScr to System:%16.4f/n", fpsSW_O2S);
printf("System to OffScr:%16.4f/n", fpsSW_S2O);
printf("[FPS: movsd]/n");
printf("Video to System:%16.4f/n", fpsSD_V2S);
printf("System to Video :%16.4f/n", fpsSD_S2V);
printf("OffScr to System:%16.4f/n", fpsSD_O2S);
printf("System to OffScr:%16.4f/n", fpsSD_S2O);return 0; } |