主题:简单的并行机制
2002-8-12
要编写一个好的游戏,必需使用到并行机制。并行机制要涉及到一个重要的语句,那就是While语句。你可能不禁会问:那不就是循环吗?对,并行机制就是要利用循环,即游戏循环(Game Loop)。实际上,所有程序并行的本质就是循环,连Windows也不例外。Windows号称多任务操作系统,实际上,在一个时间内CPU只能执行一条指令。所谓多任务,不过是并行的假象而已。在一个循环中分别执行各程序的一条语句,由于执行完该循环速度极快,于是看起来好象是多个任务同时工作一样。还有...,哎,不用费口舌了。相信你对并行有了一个初步应像,这就可以了,让我们继续。
不是有一种for循环吗,为什么不用它呢?对,for循环也可以。只要可以构成死循环的语句都可以。死循环呀,听起来有点可怕。其实解决死循环简单的很,用break语句,再不行用goto语句,一切死循环都轻松搞定。现在就让我们来练一下兵:
main()
{ int key;
while(1)
{if(kbhit())
{key=getch();
if(key==0){getch();continue;}
if(key==27)break;
if(key==13)printf("\n");/*支持回车*/
if(key==8&&wherex()>0)
{gotoxy(wherex()-1,wherey());/*支持退格*/
putch(' ');
}
printf("%c",key);/*输出字符*/
}
}
}
上面就是一个典型的文本编辑器界面,现在让我们来修改一下该程序,在屏幕右上角做一个计时器和一个计算击键次数的计数器,该计时器与计数器与文本编辑互不干扰,达到并行的效果。
main()
{ int key,x,y,n=0;
clrscr();
while(1)
{if(kbhit())
{key=getch();
if(key==0){getch();continue;}
if(key==27)break;
if(key==13)printf("\n");/*支持回车*/
if(key==8&&wherex()>0)
{gotoxy(wherex()-1,wherey());/*支持退格*/
putch(' ');
gotoxy(wherex()-1,wherey());
continue;
}
printf("%c",key);/*输出字符*/
n++;/*计数*/
}
x=wherex();y=wherey();
gotoxy(55,1);
printf(" %d sec,keydown times %d ",clock()/18,n);/*记时,显示*/
gotoxy(x,y);
}
}
现在我们实现了简单的并行机制。然而,该循环有个缺点:太耗CPU,如果不按下任何键,CPU也会不停地刷新计数与记时器。于是我们引入了周期的概念,使一个周期只执行一次语句,这样即节省CPU,使用要求执行速度不同的并行语句也容易控制。程序入下:
/*并行结构*/
#define delay_time 4; /*定义的周期长度*/
main()
{ long now_time=0,old_time,time_count=0;
char done=0; /*使用done标志使每一个周期只执行一次指令*/
clrscr();
old_time=clock();
while(!kbhit())
{now_time=clock();
if(now_time-old_time {if(!done)
{puts("计算!"); /*该语句可替换为自己需要并行的语句块*/
done=1;
}
}
else
{old_time=now_time;done=0;}
}
}
如果上面的puts语句换成两个沿对角线移动小球的语句,不就可以实现两个小球同时运动了吗?在程序中动态地调整delay_time的值,还可以确定小球移动的快慢。这只是一个提示,只要遵循该结构,还可以实现好多有趣的效果,读者可以自己去研究。
来 源: TC256网站
这里说到利用循环作并行,但更深人的需要自己体会
框架:
'Use parallel mechanism for recycling
const INTMAX =32768
dim I as integer ,J as integer,K as integer
dim wTag as integer
I=0
J=0
K=0
wTag=1
while (wTag)
{
' 模拟同时加三个数并显示
if I<INTMAX then
I=I+1
else
I=0
END IF
print "I=";I;" ";
if J<INT_MAX then
J=J+1
else
J=0
END IF
print "J=";J;" ";
if K<INT_MAX then
K++
else
K=0
END IF
print "K=";K;" ";
cls
WEND
这里并行说的是把N个任务分解成N个集合,每个集合都包括N个动作,每次并行,就 是运行各个集合的1、2个动作,来实现某些高效的程序
也就是说
打四个人,要打到吐血,每打一个人,那个人就会减少一个体力,体力为0,那个人就吐血升天, 那么这里就可以用循环并行实现了,把四个人分成四个集合,每个集合都包括N个执行打人一次的动作,每次并行,就是依此运行各个集合的1个动作,然后再加入判断体力是否为0,是就叫他快点吐血升天,OK,过不了多久,那四个人就OK!
-仅做实例,请勿模仿
虽然循环可以作并行,但在一时间点只能运行一条语句,作快的并行可以,利用CPU实现,但会减少移植性,虽然说这里机制不是很好的机制,但在很多地方都能用到,大家深入研究,会有更多的成果的
要编写一个好的游戏,必需使用到并行机制。并行机制要涉及到一个重要的语句,那就是While语句。你可能不禁会问:那不就是循环吗?对,并行机制就是要利用循环,即游戏循环(Game Loop)。实际上,所有程序并行的本质就是循环,连Windows也不例外。Windows号称多任务操作系统,实际上,在一个时间内CPU只能执行一条指令。所谓多任务,不过是并行的假象而已。在一个循环中分别执行各程序的一条语句,由于执行完该循环速度极快,于是看起来好象是多个任务同时工作一样。还有...,哎,不用费口舌了。相信你对并行有了一个初步应像,这就可以了,让我们继续。
不是有一种for循环吗,为什么不用它呢?对,for循环也可以。只要可以构成死循环的语句都可以。死循环呀,听起来有点可怕。其实解决死循环简单的很,用break语句,再不行用goto语句,一切死循环都轻松搞定。现在就让我们来练一下兵:
main()
{ int key;
while(1)
{if(kbhit())
{key=getch();
if(key==0){getch();continue;}
if(key==27)break;
if(key==13)printf("\n");/*支持回车*/
if(key==8&&wherex()>0)
{gotoxy(wherex()-1,wherey());/*支持退格*/
putch(' ');
}
printf("%c",key);/*输出字符*/
}
}
}
上面就是一个典型的文本编辑器界面,现在让我们来修改一下该程序,在屏幕右上角做一个计时器和一个计算击键次数的计数器,该计时器与计数器与文本编辑互不干扰,达到并行的效果。
main()
{ int key,x,y,n=0;
clrscr();
while(1)
{if(kbhit())
{key=getch();
if(key==0){getch();continue;}
if(key==27)break;
if(key==13)printf("\n");/*支持回车*/
if(key==8&&wherex()>0)
{gotoxy(wherex()-1,wherey());/*支持退格*/
putch(' ');
gotoxy(wherex()-1,wherey());
continue;
}
printf("%c",key);/*输出字符*/
n++;/*计数*/
}
x=wherex();y=wherey();
gotoxy(55,1);
printf(" %d sec,keydown times %d ",clock()/18,n);/*记时,显示*/
gotoxy(x,y);
}
}
现在我们实现了简单的并行机制。然而,该循环有个缺点:太耗CPU,如果不按下任何键,CPU也会不停地刷新计数与记时器。于是我们引入了周期的概念,使一个周期只执行一次语句,这样即节省CPU,使用要求执行速度不同的并行语句也容易控制。程序入下:
/*并行结构*/
#define delay_time 4; /*定义的周期长度*/
main()
{ long now_time=0,old_time,time_count=0;
char done=0; /*使用done标志使每一个周期只执行一次指令*/
clrscr();
old_time=clock();
while(!kbhit())
{now_time=clock();
if(now_time-old_time {if(!done)
{puts("计算!"); /*该语句可替换为自己需要并行的语句块*/
done=1;
}
}
else
{old_time=now_time;done=0;}
}
}
如果上面的puts语句换成两个沿对角线移动小球的语句,不就可以实现两个小球同时运动了吗?在程序中动态地调整delay_time的值,还可以确定小球移动的快慢。这只是一个提示,只要遵循该结构,还可以实现好多有趣的效果,读者可以自己去研究。
来 源: TC256网站
这里说到利用循环作并行,但更深人的需要自己体会
框架:
'Use parallel mechanism for recycling
const INTMAX =32768
dim I as integer ,J as integer,K as integer
dim wTag as integer
I=0
J=0
K=0
wTag=1
while (wTag)
{
' 模拟同时加三个数并显示
if I<INTMAX then
I=I+1
else
I=0
END IF
print "I=";I;" ";
if J<INT_MAX then
J=J+1
else
J=0
END IF
print "J=";J;" ";
if K<INT_MAX then
K++
else
K=0
END IF
print "K=";K;" ";
cls
WEND
这里并行说的是把N个任务分解成N个集合,每个集合都包括N个动作,每次并行,就 是运行各个集合的1、2个动作,来实现某些高效的程序
也就是说
打四个人,要打到吐血,每打一个人,那个人就会减少一个体力,体力为0,那个人就吐血升天, 那么这里就可以用循环并行实现了,把四个人分成四个集合,每个集合都包括N个执行打人一次的动作,每次并行,就是依此运行各个集合的1个动作,然后再加入判断体力是否为0,是就叫他快点吐血升天,OK,过不了多久,那四个人就OK!
-仅做实例,请勿模仿
虽然循环可以作并行,但在一时间点只能运行一条语句,作快的并行可以,利用CPU实现,但会减少移植性,虽然说这里机制不是很好的机制,但在很多地方都能用到,大家深入研究,会有更多的成果的