游戏编程之路 -- 《Windows游戏编程大师技巧》第一章 笔记

来源:互联网 发布:华为数据网络怎么设置 编辑:程序博客网 时间:2024/04/30 06:31

初次接触游戏编程,于是选择了《Windows游戏编程大师技巧》这本书,决定现在开始,坚持下去。

 

在第一章的freakout程序中,主程序winmain的循环使用了PeekMessage而不是GetMessage。于是就开始去找这两者的区别。

通过在网上找文章和看msdn,并结合编程大师里面的段落意思,让我比较深刻的理解了在freekout程序里面使用PeekMessage的用意。

在编程大师里面有一段话:

 

Basically, Windows needs to have what's called an event loop. This is standard for all Windows programs since Windows is, for the most part, event-driven. However, games aren't event-driven; they run at all times, whether the user does something or not. So we need to at least support a minimum event loop to make Windows happy.

 

翻译过来的大致意思是,标准的windows程序是事件驱动的,所以windows必须要有一个消息循环,但游戏程序却不是事件驱动的,无论用户是否有动作,游戏程序都是一直在运行。但无论如何,我们还是要有一个消息循环,因为你编写的游戏程序也是windows程序。

 

起初我看的时候有些不明白,奇了个怪,说来说去,那还不都是消息驱动?但在网上比较了一下PeekMessage和GetMessage,就知道了作者说以上一段话的原因。

 

首先,GetMessage和PeekMessage都可以从消息队列中获得消息,所以,在你的主循环中,你可以根据你的目的去选择其中的一个。然而GetMessage的行为是只有在消息队列中有消息是才会返回,而PeekMessage是无论消息队列中是否有消息,都会返回,有则返回非0,无则返回0。FreakOut程序中使用的是PeekMessage,原因就是,这个是游戏程序," they run at all times",所以你不能用GetMessage来等待用户的输入,你要保证游戏程序的逻辑和帧的刷新始终是在运行的。这就是使用PeekMessage的原因。

 

当然PeekMessage还有其他的特性,比如可以通过设置参数来去决定是否移除消息队列中的消息等,但FreakOut里面用PeekMessage的原因已经明了。