前天去阳江购书中心想买一些关于DirectX9相关的书,结果找遍整个书店也没找到一本合适的。讲游戏开发的书倒是有几本。去掉几本大部分内容都在讲游戏本身的书后,我选择了两本书,一本就是现在正在读的,书名看标题。另一本是Direct3D中的2D编程,不过是基于DX8.0的,而且很大篇幅都是讲2D,其实也不错,2D也是3D的基础嘛。
昨天看了《Visual C++游戏开发技术与实例》(以后简称V书)的第一章,主要是讲一些背景知识,例如游戏开发的历史和Windows编程。虽然以前也有看过游戏发展史的相关资料,这次看又收获不少,不过那些什么历史上第一个、最先什么的东西和之前看过的不一样,可能暂时也是没什么权威的统一信息吧,算了,反正现在不用太注意这个。
算起来我也算是个游戏老手了,小学一二年级的时候就接触了街机,那时候玩游戏机可是会被家长和老师批评的(我想现在也是吧),所以每次去游戏机厅就像去做坏事一样,提心吊胆的,老是担心会被同学看见,那时的学生超听话,看见同学去游戏机厅大多数会向班主任报告,我的机友很少,就一两个邻居,属于很调皮的那种,老爸常常以近墨者黑的道理教训我,叫我不要和他们玩,可是游戏机的吸引力太大了,只有口袋里有一两块钱,大多数都会往游戏机厅跑,想起来还真怀念街霸等街机啊(大多数名字都忘记了)。后来终于有了自己的家用游戏机FC,也就是任天堂经典的红白机。当时(93年)以为是全世最新的游戏机了,看了V书后才知道原来FC是83年产的,过了很多年才在中国流行起来,不过也没流行多久。我那台FC很快就被小霸王学习机所取代了,最后我把FC以不到100块的价钱卖给了同班同学(真应该保存下来,作个纪念多好啊)。嗯,从那以后过多两三年我就开始接触电脑了,从此与电脑游戏结伴同行8年。
还是说说书的内容吧,第一章后半部分简单讲了一些Windows编程的基础知识,如消息机制,GDI,定时器,回调(CALLBACK)机制,多线程,动态链接库,COM,声音和MFC等知识。其实这些东西之前都懂一点点,但是不能说精通,因为看了V书后,对这些东西的认识又更进一步。先说说消息机制吧,16位的机子只有一个消息队列,所以整个系统的每一个消息都必须等待排在它之前的消息处理完后才能得到控制权,嗯,书上说这种操作系统叫协同式的多任务系统。进入32位后,即Windows98系统之后,每个程序有属于自己的一个消息队列,这样对应于每个进程,可以定制自己的消息处理函数,所以在Windows98和之后的操作系统上,我们可以同时运行多个程序。嗯,书上说这种操作系统叫抢占式的多任务系统。
还大概知道了GetMessage和PeekMessage的区别。除非在队列中有消息,否则GetMessage不会把控制权交回给程序。PeekMessage不同,它每隔一段时间就往消息队列中Peek一下,如果有消息则返回TRUE,没有则返回FALSE。在这里要说一下游戏的两个渲染时机,有些游戏是在接收到WM_PAINT消息后渲染的,而有一些则是在队列空闲的时候(即PeekMessage返回FALSE时)渲染的,不过我还不太清楚这两种渲染时机的区别是什么。
GDI就不想多说了,好像也只是一些函数,知道如何创建和如何使用就行了。嗯,HDC似乎贯穿GDI的所有操作。
最主要的收获还是明白了定时器的作用。原来定时器的主要作用是发送WM_TIMER消息的。设置定时器的函数是SetTimer,停止它的函数是KillTimer。也可以将WM_TIMER消息发送给自己定义的消息处理函数。
回调机制不说了。多线程也不多说了,主要是如何实现同步与互斥的问题。DLL也不说了。COM太复杂,也不说了。
Windows中和声音相关的API主要分两类,一种是高层的,以waveIn和waveOut作前缀,一种是低屋的,以midiIn和midiOut做前缀。还有一些以mci做前缀的接口(MCI,Media Control Interface)。
书上说MFC也可以开发游戏,不过是面向小型游戏的,开发大型游戏是需要很多Windows API的,MFC对API的封装使得它并不适合编写一些底层的软件。写游戏,还是从WinMain开始吧。