» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


发新话题
打印

[原创]游戏引擎,3D引擎,物理引擎以及其他

游戏引擎,3D引擎,物理引擎以及其他。

原创,首发于tgfc,未经作者书面允许禁止转贴。

某自称xxx老师的ID说我没实际本事。好吧,我怎么也算是写过几年程序,也算曾经当过业内人士,这次就来简单喷喷游戏引擎,3D引擎,物理引擎以及其他,看看到底是谁没营养



出错请指出,欢迎讨论,要战的话请拿出所引用的参考文献的出处。

一,游戏引擎

在游戏的启蒙时代,其实是没有游戏引擎的,那时候的游戏足够简单,类似于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来计算,很可能计算速度不够,速度不够的结果我就不用再多描述了,玩过游戏的人都知道这意味着什么。

好,基本上我要说的技术上的也就这么多,现在回头来看看某xxx老师的言论:“havok是负责物理,和丢帧没什么关系。”,希望大家可以笑一笑了。


TOP

需要补充的是,用CPU计算物理,如果要想达到可以接受的效果,速度上基本上不可接受(以目前高端民用的CPU来论)。

Ageia PhysX物理加速卡的官方销售人员曾和我们部门联系过,也寄过一些技术资料和演示,demo之类的我还是见过的。



TOP

引用:
原帖由 foxhounds 于 2007-1-28 20:14 发表
感觉写得很好,要支持


PS:开头的XXX老师是谁哦..
你去playstation版看看就知道了,一个老“专家”


TOP

引用:
原帖由 jinwyp 于 2007-1-29 02:09 发表



我想问一下你知道那个物理卡 cpu相当与现在cpu多少吗?


其实现在的cpu模拟物理完全没有问题  但目前的x86的硬件结构不适合 做物理  虽然数度上可能有些问题  其实是cpu还要跑xp这样os的软件 而且更适 ...
没错,通用CPU完全不适合做这个,当然也包括ps3和xo的主CPU。

大量浮点+并行运算  其实这正是显卡的强项,所以 ATI 叫嚷着要用显卡来计算物理当然有其根据。

但是目前已经实现的软件物理引擎,可以说基本上还都是用CPU老哥自己扛着的  - -;

TOP

引用:
原帖由 hudihutian 于 2007-1-29 16:50 发表


就不说你啥了,去稍微有点水平的显卡/cpu论坛学习一下……

应该就可以知道啥是amd(ati已经不存在了)公司为啥要收购前ati,以及其cpu与gpu溶合技术的发展方向,以及达人对cell的 ...
个人还不是很习惯AA合并后的称呼。

另我说的是ps3的主CPU,而不是完整的CELL,CELL 在我看来就是 PowerPC + DSP

CPU和GPU的溶合还是个很前卫的话题,x86架构的历史包袱太重了,近期不要指望能有什么突破性的进展

gz确实都是玩硬件的,但是我们讨论的是软件。

TOP

发新话题
     
官方公众号及微博