C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

常用链接

留言簿(8)

搜索

  •  

最新评论

阅读排行榜

评论排行榜


    定时器的使用固然很简单方便,但是事实上这样的方法仅适合用在显示简易动画及小型的游戏程序中。因而一般而言,游戏本身需要显示顺畅的游戏画面,使玩家感觉不到延迟的状况,基本上游戏画面必须在一秒钟之内更新至少25次以上,这一秒钟内程序还必须进行消息的处理和大量数学运算甚至音效的输出等操作。而使用定时器的消息来驱动这些操作,往往达不到所要求的标准,不然就会产生画面显示不顺畅和游戏响应时间太长的情况。

    这里提出一种“游戏循环”概念。游戏循环是将原先程序中的消息循环加以修改,方法时判断其中的内容是否有要处理的消息,如果有则进行处理,否则按照设定的时间间隔来重绘画面。下面所使用的游戏循环的程序代码:

    // 游戏循环
    
// 当收到的msg.message不是窗口结束消息WM_QUIT,则继续运行循环。
    
// 其中msg是一个MSG的消息结构,其结构成员message则是一个消息类型的代号
    while( msg.message!=WM_QUIT )
    
{
        
// 使用PeekMessage()函数来检测目前是否有要处理的消息
        
// 若检测到消息(包含WM_QUIT消息)则会返回一个非“0”的值,否则返回“0”。
        
// 因此在游戏循环中,若检测到消息便进行消息的处理,否则运行else叙述之后的程序代码
        
// 注意:PeekMessage()函数不能用原先消息循环的条件GetMessage()取代
        
// 因为GetMessage()函数只有在取得WM_QUIT消息时才会返回“0”,其他时候则是返回非“0”或“-1”(发生错误时)
        if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )
        
{
            TranslateMessage( 
&msg );
            DispatchMessage( 
&msg );
        }

        
else
        
{
            
// GetTickCount()函数会取得系统开始运行到目前所经过的时间,单位是百万分之一秒
            
// DWORD GetTickCount();   //取得系统开始到目前经过的时间
            
// 在这里取得时间的目的主要是可以搭配接下来的判断式,用来调整游戏运行的速度,
            
// 使得游戏不会因为运行计算机速度的不同而跑的太快或太慢
            tNow = GetTickCount();
            
// “tPre”记录前次绘图的时间,而“tNow-tPre”则是计算上次绘图到这次循环运行之间
            
// 相差多少时间。这里设置为若相差100个单位时间以上则再次进行绘图的操作,通过这个
            
// 数值的控制可以调整游戏运行的快慢
            if(tNow-tPre >= 100)
                MyPaint(hdc);
        }

    }
    如果把100改为40,即设定40个单位时间(1微妙),那样每隔40个单位进行一次绘图的操作,那么1秒钟大约重绘窗口1000/40=25此,刚好可以达到期望值。

    由于循环的运行速度远比定时器发出时间信号来得快,因此使用游戏循环的可以更精准地控制程序运行速度并提高每秒钟画面重绘的次数。


范例ch3_2:使用游戏循环产生动画效果,并在窗口左上角显示每秒画面更新次数。
下载地址:ch3_2(上传到windows live空间,可能需要MSN账号登陆)
说明:程序源代码中有相关的注释。
程序运行结果如下图:


    在这个范例中设定画面更新的时间间隔是0.1秒,所以每秒钟最多会更新10次画面,不过如果在范例运行的同时,运行其他程序,那么CPU必须马上去处理所开启的其他程序,因此可能会使得每秒画面的更新次数下降。这样的情形在每秒画面更新次数越高的时候会越显著。

PS:如想获得更多关于Visual C++游戏开发的内容,可点击随笔:《Visual C++游戏编程基础》学习笔记——索引随笔
posted on 2010-04-09 15:03 烟皑 阅读(806) 评论(1)  编辑 收藏 引用 所属分类: 《Visual C++游戏编程基础》学习笔记

Feedback

# re: 基础动画显示——游戏循环 2010-08-16 17:28 sad
是毫秒
不是微秒!  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理