|
|
发表于 2004-12-8 10:36:00
|
显示全部楼层
Re: 开发游戏所用到的典型技术总结
游戏就分为3大块
Game_Init( ); // 初始化
while ( true )
{
Update( ); // 数据处理
Render( ); // 渲染
}
Game_Destroy( ); // 释放
很多人都热衷于Render块,因为渲染出很漂亮的效果都在这里完成的。也有很多人热衷于Update块,比如很多算法和物理模拟都在这里完成的。
但引擎发展变化很大的,各式各样,很难有统一的标准,而且,每个人达到的需求不同,分类的侧重点不同,对引擎的结构理解也是不一样的。
如果说到3D MMORPG我到可以给一个客户端标准引擎的模块清单
分横向和纵向2块,实际上是一个工具清单
最下面的是
1、动画管理模块
动画的定义,播放,状态,时钟等。一般动画分为骨骼动画和关键祯动画,前者多用于比较复杂的角色,NPC等,后者用于一些比如场景上树,花等的动画,还可以用于一些动画特效。
2、粒子特效生成模块
跟动画管理模块的功能一样,其实也是一个动画,只不过,上面的动画是预先定义的数据,粒子特效的动画是由程序生成的,包含一些比如元素,周期,衰减,数量,速度,加速度,方向,角度等参数,根据不同要求可以取舍,Maya有一个火焰编辑器的工具,可以参考上面的参数。
3、场景管理模块
包含对象管理,剪裁,镜头,碰撞等。
场景除了地形以外,还有很多场景上的对象,比如房子、树、河流等,这些都需要采用一些算法动态管理,同时还要根据镜头的移动进行裁减,避免渲染过多影响效率。
角色在场景上移动的时候要做碰撞检测和移动检测,比如,有的房子能走进去,或者能走到桥的上面,有的河流能在里面走动,但有的房子就不能走进去,有的河流也不能穿过。
场景上除了静态的对象还有动态的对象,这些对象可能是动画,比如花草树木的摇摆,还可能有粒子特效,比如下雪,某处可能炊烟缭绕。
4、对象编辑模块
把一个静态的装备绑定到一个动作上,还有把特效合成到动作上。
每个角色可能有很多很多的装备,但是角色是有动作的,不可能为每个动作给装备也制作动画,装备是没有动画的,需要根据角色的动作给穿在身上的装备用程序来生成动画,不同的装备有不同的动画,比如,帽子随脑袋的摇摆而移动,大刀,长枪可能有自己独特的动作,这都需要进行管理。
还有一些特效,比如很多游戏有踩在脚底下的光环,有的战斗的时候会在武器上出现一个爆炸的特效,很多魔法其实也是特效, 这些都需要进行编辑。
同时特效还有合成叠加的,比如有些魔法先放一光柱然后再发一大球。
6、UI模块
每个游戏都会有界面,界面都类似Window,但Win32的接口都不能用,必须自己定义一些UI对象,类似Window,我们可以定义一个自己的Window基类,然后从上面派生很多窗体,控件,比如常见的按钮,文本框,图片框,列表框,下拉列表框,组合框,滚动条等等。同时需要实现这些对象的一些基本属性方法事件。
5、文件管理模块
包括资源文件和配置文件
游戏根据自己程序的特点,往往资源文件都是自定义的,比如图片,声音,当然也有为了保护产权加密的,在游戏的过程中,有些需要初始化时就载入以提高速度,有的需要动态载入动态释放。当然有的为了提高速度,将很多文件打包放在一起的。(网络游戏我不建议打一个很大很大的包,更新起来比较麻烦,尽量控制包的大小,现代磁盘I/O技术已经相当快了)
同时成千上万的文件为了更新方便和程序载入方便,需要制作一些配置文件,指明路径类型用途等,还有一些系统参数,这些配置文件也需要程序进行分析。
6、脚本模块
对于一些对象表现、状态、位置不能简单用一些配置文件来解决,比如任务,需要定义一些简单的语法描述一些过程,比如分支(if),循环(while),还有跳转(goto)等等,当然还有一些事件(event)。
7、网络模块
这个我就不多说了。
这里少了一个东西就是内存管理模块,之所以没有是因为我的这个引擎这部分不是独立的,所有数据都是面向对象封装的,由父对象集中管理,遵循的原则是随需申请,集中释放。比较好的做法是,所有的对象都从一个基类派生,而且不要定义默认的构造函数。
其实我觉得其他类型的游戏都没有这么复杂,但很多还是相似的,比如2D MMORPG,每个模块功能可能都不一样,但每个模块都要具备。休闲游戏,可能就没有场景管理模块,其他的都应该有。当然为了简化,比如脚本模块就可以省掉。
为什么我说这是纵横分割的呢,因为很多模块是建立在其他模块之上的,比如一些工具,比如动画管理器,任务编辑器,场景编辑器等等
至于说到更底层,比如怎么渲染,怎么处理声音,怎么处理网络,怎么处理鼠标等等,这些不能作为上面的分类,否则就乱了,当然,可以分的更细一点,但我觉得没有什么必要,很多东西不需要进行封装,直接用底层的函数就够了,封装一下反而搞得不伦不类。
|
|