人气 168

[游戏程序] 游戏入门基础]并行处理 [复制链接]

九艺网 2017-3-10 17:01:10

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
[table][tr][td]要编写一个好的游戏,必需使用到并行机制。并行机制要涉及到一个重要的语句,那就是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);/*输出字符*/
        }
    }
}

上面就是一个典型的文本编辑器界面,现在让我们来修改一下该程序,在屏幕右上角做一个计时器和一个计算击键次数的计数器,该计时器与计数器与文本编辑互不干扰,达到并行的效果。
<p class="my1">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,使用要求执行速度不同的并行语句也容易控制。程序入下:

<font face="Fixedsys" size="2">/*并行结构*/
#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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-4-24 22:34 , Processed in 0.058552 second(s), 23 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.