初入3D游戏编程,便跃跃欲试在这里写点东西,一是方便自己日后查阅,二是为有需要的朋友提供一些便利.
第一章 3D游戏编程入门
视频游戏本质上是一个持续不断的循环,它执行逻辑并且在屏幕上绘制图象----通常以30~60帧/秒或更高的速度进行控制.
一个简化的游戏循环
1)初始化,主要针对内存分配,资源获取,从磁盘或者文件中加载数据等
2)进入游戏循环,这里指的循环是指主游戏循环,用户在这里一般多是执行动作,并且直到游戏循环结束和退出.
3)读取游戏玩家输入,处理来自键盘,鼠标以及摇杆等输入的信息.
4)执行AI和游戏逻辑,关注于人工智能,物理系统和通用游戏逻辑,并且根据结果在屏幕上绘制下一帧.
5)渲染下一帧,根据游戏玩家输入,以及游戏AI和逻辑的执行结果,生成下一个游戏动画帧,因为通常在offscreen buffer中进行的缘故,一般不为用户所见.下一帧图象被快速地复制到可视区域,产生动画影像.在一个3D软件的引擎中,一般使用非常复杂的3D graphics pipelining(亦为3D图形管线)[来源于http://www.extremetech.com/article2/0,1558,9722,00.asp]来渲染生成数个多边形.,但在基于OpenGL或Direct3D硬件加速引擎中,大部分工作都由硬件在承担.
6)同步显示,很多时候,计算机的速度经常被游戏的复杂度所降低或者提高.相应地游戏帧频也是这样的.在这种情况下,一般采用定时函数或者等待函数,同步游戏到某个最大帧频,并且保持该帧频.一般用户可以接受的帧频是30~60,超过60或者低于30都是不便于用户接受的.
7)循环,主要又回到游戏循环开头,然后重新开始游戏.
8)关闭游戏,主要做的是清理工作,在返回操作系统之前释放占用的所有资源,并清理系统.
个人看法,随着游戏的发展,我越来越觉得游戏在填鸦一样,因为框架是固定的,如这本书中列出来的,记得在我最初的简易赛车游戏中(仍为腹中胎儿)就是由几个简单的类组成,CGame,CDraw,CInput,以及CSound.很简易的,每个类分工很清楚,在前面的(1)中,我一般采用两种方法来进行初始化,a)在各个类中设置构造函数,这个构造函数一般完成一些该类的成员变量的初始化工作,b)Create函数主要完成一些资源加载.以及其它工作.(2)一般在主函数WinMain中进行.其中主要的流程在后面的内容有详细介绍.3)一般是由CInput控制.4)通常是由CGame完成,主要的AI以及游戏逻辑都在这里完成.5)应该是由CDraw来完成?8)主要是各个类中对应的析构函数完成.等,
视频游戏是超高性能计算机程序,这将促使你在时间关键代码部分和内存关键代码部分不使用高级API,你必须不能依靠高级API,而应该自己来做这些事情.否则你将偿付低速度和低性能所带来的困饶.
因而你应该努力避免使用基于WIN32API的高级函数,而求助于更加接近低层的技术.书本中就提示了使用_asm关键字,其中包括所要使用的汇编语言.其实在c++中也用到这中做法,用英文说linkage specification(翻译过来就是连接说明),其中的关键字就是extern"C"再在大括号中加入你要使用的c函数原型,显然c的编程实现效率总体上还是胜于c++的,所以,这也是一个这个话题的应用.
参考文献:
林丽闽,褚尚军,标准C++程序设计教程,电子工业出版社P67-P70