- 听众
- 收听
- 积分
- 1003
- 主题
- 回帖
- 0
- 精华
注册时间2007-2-6
最后登录1970-1-1
该用户从未签到
|
发表于 2007-10-10 08:04:00
|
显示全部楼层
回复:CS引擎是什么东西啊
一,游戏引擎
在游戏的启蒙时代,其实是没有游戏引擎的,那时候的游戏足够简单,类似于pacman之类的游戏用头发想想也明白它根本用不到引擎这种概念。
随着游戏的复杂,对游戏项目的复杂性和开发周期提出了更高的要求。首先是代码的重用,为每个游戏完全重写一套代码实在是不划算,而且伴随代码的重写,测试的压力也很大。其次是开发周期的压力,商业竞争要求游戏厂商要足够快地推出更复杂更好玩的游戏,把游戏的内容硬编码进代码很快成为了一种很愚蠢的做法,因为这样的话,简单的修改就会牵扯很多地方。
于是,游戏引擎的概念被提出,从游戏架构上来说,3d的fps和2d rpg/slg可能是最早引入引擎概念的。而随着技术的进步,引擎也越来越成熟。
那么,游戏引擎究竟做了什么?
1 封装了硬件平台和操作系统的功能调用。
大多数的通用引擎封装了硬件平台和操作系统的功能调用,用统一的接口暴露给程序员,这样便做到了跨平台。举个例子,绝大多数的pc游戏引擎都同时支持DirectX和openGL,为Windows编译好的游戏可以用DirectX,为Linux编译的版本则显然会自动使用openGL,而这些在某种层次上可以做到对程序员透明(当然,3D部分是最麻烦的,稍后说明)。
2 提供基本的功能服务。
游戏引擎会提供一些基本的功能服务。
比如:
A 对文件系统的抽象,研发的时候直接读取硬盘上的游戏资源,发行版本自动改为读取打包文件中的资源。
B 提供统一的对象管理,大部分是树装的层次结构。
C 内存管理,异常处理
D 游戏脚本支持,把游戏引擎的功能以脚本函数的方式暴露给脚本,这样可以在脚本中编写游戏逻辑,操作游戏引擎,大大方便了修改游戏,举个例子,WOW的UI部分就暴露了脚本接口,玩家可以自己用LUA编写UI插件。
3提供一个易扩充的框架结构
很多游戏引擎是易扩充的,比如更换渲染模块,添加物理引擎等,这样可方便的针对项目量体裁衣。比如我需要DirectX不需要物理引擎,都可以自由定制。
4提供研发用的编辑器
很难想象没有编辑器如何做游戏。玩家熟悉的编辑器举几个例子:星际争霸,魔兽争霸3.
二,3D引擎
随着技术的进步,现在的游戏基本都使用3D技术来渲染画面了,很多玩家根本就想不到即便是那些看起来是2D的游戏,其实也是用3D模式渲染的。举个例子,PS2的GS硬件上对纯2D其实基本可以说没有支持,PS2的2D游戏,基本上都是用正交投影的3D模式渲染的,不论是 SSF3.3还是GGXX都是这样,平面的人物也是用三角形构成的。用3D有很多优势,比如3D硬件速度快,支持alpha十分简单等等。
如果大家学过D3D或者openGL,就会发现往屏幕上画一个三角形,贴图然后让它转起来,其实很简单,关键的代码不超过50行,那为什么还要搞出3D引擎这种听起来很华丽的词汇呢?
工程学上,盖一个平房和造帝国大厦,其规模和复杂性完全不在一个数量级。同理,往屏幕上画一个三角形,贴图然后让它转起来和大家玩到的FF12也完全不是一个档次。现实生活中的游戏太复杂了,以至于必须要3D引擎来完成很多工作。
1 场景。
游戏引擎需要管理场景,也就是玩家所在的某个区域,不管是战场还是道具屋。根据需要剔除不需要显示的部分(对于FPS来说玩家身后显然是永远也看不到的)。
2对象
游戏引擎需要管理场景中的对象,比如一个木桶,一棵树,在需要的时候向硬件提交对它们的渲染。
3动画
这里的动画指的是3D物体的动作。游戏中有很多需要动画的地方,例如草的摆动,开门,乃至于玩家控制人物的走动。很难想象手工写代码去计算构成玩家角色的每一个三角形的坐标变换。常见的方法都是在3D创作软件中设置好动作然后导出,动作用专用的脚本来描述,3D引擎会对它进行解释。
4渲染
我这里只就现在的先进的渲染方法来说。现在的pc和console硬件都具备了可编程的显示硬件(不论是pc还是ps3,xb,xb360),叫做shader,shader分为两种:vertex shader和pixel shader,更先进的硬件还会提供一种叫做 geometric shader 的可编程硬件。shader是在显卡上的,它需要对应的代码来运行,可以用shader的汇编或者专用的c语言来编写shader(我有个朋友就喜欢用汇编直接写shader - -b)。shader使用起来没有想象的那么难,买本nv的CG教程,至多三天就能大概知道怎么用了。
渲染每一个模型的时候,乃至于渲染模型的不同部分,动作的不同阶段,3D引擎会自动选用适当的shader来执行渲染,手工完成这件事情几乎是不可能的。
三,物理引擎
越来越多的玩家对游戏的感官真实性提出了要求,他们追求更真实,于是仿真现实世界的物理引擎被提出来,物理引擎把游戏中的物体的行为进行修饰,让他们表现得看起来更真实。举个简单的物理引擎的例子:直到CS 1.6,游戏玩起来还是那个样子,然而CS:Source则不同,尽管只用了简单的物理效果,我们已经可以用枪击倒油桶之类的物体了。
那么物理引擎究竟是怎么工作的呢?依我看来物理引擎其实有两个任务:物体之间的物理交互,物体自身的物理交互。
1 物体之间的物理交互。
比如刚才说的子弹击中油桶,油桶被击倒。这个比较简单,CS中子弹是没有体积概念的,这种碰撞计算很简单。而其他的类型就不那么简单了,比如有立方体的碰撞,球体碰撞,乃至于曲面的互碰撞计算。不要忘了,这可是3D坐标系中的碰撞计算,回想一下你的空间解析几何知识吧,这种计算对资源的消耗有多么大。
2物体自身的物理交互
如果我击中了一块玻璃,玻璃碎掉或者扫射旗子,旗子上被打出很多弹孔,这也需要物理引擎来帮忙,当然并不是必须的。但是玻璃的碎裂如果要求很真实,用物理引擎计算碰撞的结果就很必要了,碰撞是仅导致玻璃裂开还是粉碎,取决于碰撞的强度。
题外话:游戏中的矩形玻璃最简单的实现就是俩三角形一层材质,但是,计算机很笨,玻璃碎掉它不会自动增加多变形来表达每一个碎片。即便是物理引擎也不会做这件事情。现在都是需要程序员做额外的工作,未来DX10会提供geometric shader,做这个工作就会大大简化。
四,其他
刚才说了很多理论和原理上的东西,那么游戏引擎,3D引擎,物理引擎是怎么攒到一起的呢?前面说了,游戏引擎是个框架,3D引擎,物理引擎被装在里面。更进一步说,其实物理引擎是受制于3D部分的。物理引擎要计算的物体数据是3D引擎提供的。
下面是一个简化的frame渲染流程:
调整3D场景状态(CPU)
处理输入(CPU)
处理音效(SPU)
处理物理效果(CPU/SPE/PPU/GPU)
渲染3D(GPU)
渲染2D(GPU)
这个流程可以说基本上所有的游戏都会有,而且我也把主要负责的模块写在了后面。从目前的技术来看,程序中能充分发挥多核,也就是多处理器优势的部分,必定是能够多线程操作的部分,就游戏而言,网络通信和处理音效是最容易多线程化的,因为它们本质上就必定是多线程实现。渲染基本上是单向的,CPU向GPU提出需求,除非CPU需要GPU的运算结果,这种情况不是很多。
好,现在剩下处理物理效果(CPU/SPE/PPU/GPU),对于没有专用物理硬件的环境来说,目前常见的就是用CPU来算这种对浮点要求极高的任务,当然,PS3可以借助CPU中的SPE.未来可能会有用GPU来协助的实现。当然最好的就是用专用硬件,传说中的xx物理加速卡。这里有个关键的问题,这种运算很难多线程,换句话说,渲染之前,必须等待物理计算完成,如果我们采用的是CPU来计算,很可能计算速度不够,速度不够的结果我就不用再多描述了,玩过游戏的人都知道这意味着什么。 |
|