首页 > 代码库 > 3D游戏引擎〇 开始

3D游戏引擎〇 开始

游戏循环:
初始化:执行一些基本的初始化操作,如内存分配,资源获取,从磁盘加载数据等。
进入游戏循环:进入主游戏循环,用户不断地执行动作,知道退出主循环为止。
读取玩家输入:处理玩家输入,或将其存储到缓存区中,供AI和游戏逻辑使用。
执行AI和游戏逻辑:这部分为游戏代码的主体部分,将执行AI,物理系统,和通用系统逻辑,并根据结果在屏幕上绘制下一帧。
渲染下一帧:首先游戏绘制的下一帧图像在离频offscreen缓存中绘制,然后进行一系列的渲染。在基于3D软件的引擎中,由一个非常复杂的3D图形流水线来进行渲染构成世界的无数多边形;而在基于OpenGL或Direct3D的3D硬件加速引擎中,大部分工作有硬件来承担。
同步显示:控制固定帧率,30帧为可接收的最小值,60帧为最大值,一般通过一些定时函数或等待函数来同步游戏到某个最大帧频。
循环。




大型游戏是一种超高性能计算机程序,为了效率,关键代码部分不会去使用高级API。一般来说,必须编写与游戏代码内部循环有关的一切内容,否则游戏达不到需要的速度和性能。如使用memset()函数,这个函数相当快,但其实进行单字节填充,而一般使用的都是4字节或8字节的基础数据类型组成内存结构,所以一般会使用四字节填充或者更多,效率也会提高很多,如下面实现的一次写入4字节的函数,为内联汇编语言函数,进一步提高效率:

inline void Memset_QUAD(void *dest,UINT data,int count){
	//每次填充4字节 32位
	_asm
	{
		mov edi,dest;
		mov ecx,count;
		mov eax,data;
		rep stosd;
	}//汇编代码使一些时间关键代码部分和内存关键代码部分的效率大幅提升,以后有空还是要研究一下汇编的。
}


这段代码是32位的汇编代码,现在CPU都是64位的为了效率应该使用64位的汇编代码。
而对于DirectX中的API还是值得信任的,DirectX是作为一种高性能API编写的,其效率是有保证的,一般要避免Win32 API的高级函数的使用。


一些技巧需要注意的地方:
对所做工作进行备份。编写游戏代码很容易让系统锁死,进行辈备份是必要的。
开始游戏项目时。需要进行良好的组织。项目中使用合理的文件名称和目录名称,使用一致的变量命名规则,尽可能使用单独的目录存储图形和声音数据,而不是将所有内容放到一个目录中。
使用内联函数。使用inline来避免函数调用,加快程序速度。这会将程序变大,但对于游戏来说速度更重要。
尽可能使用32位变量而不是8位或16位,现在是尽量使用64位变量,因为现在的CPU都是64位而不是32位,而对于小于64位的数据,会由高速缓存和其他相关的内存寻址操作,导致速度变慢。
不要害怕使用全局变量:许多游戏在对于时间有严格要求的函数中都不使用参数,而是简单地使用全局参数,参数的出栈入栈会造成较高的消耗。而全局变量一定要使用较好的命名规则,且注意安全。
以RISC精简指令集计算机方式进行编程,(精简指令集通过精简指令使计算机系统的复杂操作由硬件交给软件实现,而实现系统的更加高效)而这样做的具体做法就是 不要写复杂的语句,由于CPU中处理这些复杂语句耗费更多,而使用多句简单语句来代替复杂语句。
多使用位运算来替代乘除,以及熟练使用异或。
编写高效的算法,虽然汇编可以提高O(n)的算法的速度,但对于O(n*n)没有效果,最重要的还是从算法入手,来提高效率。
不要在编写代码过程中优化代码。代码编写中,忍不住想去优化之前的代码,但这是浪费时间,与其分心与与当前任务无关的代码,不如更快的将现在的任务完成,然后再进行仔细的优化。
慎用C++。尤其是C++中的多继承。
如果你发现当前采取的路线很困难,马上停止,进行备份,然后想办法绕过困难。犯一个错误,并重新编写1000行代码,要比采用一个不好的编码结构强得多。代码的可扩展性,可维护性和结构漂亮是很重要的一件事。
对于简单对象,不要编写复杂的数据结构。游戏编程中90%的工作是数据操作,要使数据操作更简单高效是极其重要的。


3D游戏引擎〇 开始