3D游戏引擎FAQ

 
作者信息:
姓名:韩红雷
单位:中国传媒大学 动画学院
主要研究方向:计算机图形学、计算机动画技术、游戏引擎
Email:[email protected]
blog: http://hanhonglei.spaces.live.com/


1. 3D引擎(3D engine)、3D编程语言(3D language)和3D创作系统(3D authoring system)的区别是什么?
3D引擎是3D图形函数库。在因特网上有很多3D引擎,其中有一些还是免费的,有些商业化的引擎价格在50美元到25万美元之间。3D引擎需要使用外部的开发系统来编写程序,使用最多的是是微软的Visual C++。围绕3D引擎通过编程来开发游戏具有极大的自由度,但也需要很多的经验、工作和时间。

3D编程语言提供了一种更加容易的编写3D应用程序的方法,因为你使用的是一种专门为 3D游戏设计的脚本语言来编写DirectX界面。这种语言不受3D引擎速度和自由度的影响,并且避免了使用“真正”编程语言带来的问题。很多3D编程语言使用Basic——一种比较容易学习的语言,但由于其落后的语言结果,所以并不适合于编写大而复杂的游戏。比较适合于当前游戏开发需要的是基于C或者JavaScript的语言。

创作游戏最简单的方法是使用3D创作系统——它们有自己的3D引擎,并且具备可视化编辑器,可以很快地创作一个游戏原型。当然了,只有很简单的游戏才可能绕开编程,创作系统一般都提供脚本语言来进行编程或定制游戏。利用创作系统,再加上对独立3D引擎的编程,可以在很短的时间内创作一款游戏,很多大的游戏公司都开始使用创作系统来开发游戏了。

一些简单的创作系统针对FPS(First or third Person Shooters),不提供或者只提供有限的脚本编程。尽管利用他们开发的FPS游戏并没有什么市场,但如果你不希望使用脚本或者不想让你的游戏商业化的话,也可以使用他们来开发游戏。而多数的创作系统可以用来开发任何种类的游戏或者3D应用程序。下面是一个当下流行的系统和引擎的对比表:

**代表可以被显示,但需要第三方工具来创建。

$$$表示发行或者销售游戏需要额外收费或履行特定的条件。

该表格基于2005年秋的各厂家说明书,不保证所有数据的正确性。如果有多种许可版本,选择价格适中的版本列出。列出的Gamestudio/A6属性基于Gamestudio网站最新的更新版本。



上表并不是要说明哪个系统更好。即使功能很相似,各系统之间在速度或稳定性方面也会有差距。对于你来说哪个系统更加出色主要取决于你的工程、目标、个人倾向,当然还有你的预算。你可以通过分析屏幕截图、演示和使用试用版来决定你使用哪个系统。

2. 什么是渲染器(Renderer),什么是顶点变换和光照(T&L)?
渲染器是3D引擎的核心部分,它完成将3D物体绘制到屏幕上的任务。根据3D硬件使用方法的不同,可以分为DirectX和OpenGL两种渲染器。OpenGL渲染器通过OpenGL图形库来使用3D硬件,多数3D卡支持这种方法。而DirectX渲染器使用微软的DirectX库——归并到Windows操作系统中。在老的3D卡上面,OpenGL一般绘制速度较快一些,而在现代的3D卡上面,DirectX表现则更加出色。现在的OpenGL版本只有一个,而DirectX版本有很多:

DX6
基本的3D支持,没有硬件T&L,整合于Windows95中

DX7
与DX6相似,但具有硬件T&L,整合于Windows98中

DX8
有了重大改进,支持着色器,整合于Windows2000、ME、XP中

DX9
和DX8类似,具有类C的着色器语言,整合于WindowsXP SP2中


在一个物体被绘制到屏幕之前,必须先计算它的光照,并且将它从3D世界转换到屏幕二维坐标系中(这两个过程称为光照和顶点变换,也就是T&L,Transformation & Lighting)。渲染器可以使用自己的算法(软件T&L),也可以使用3D硬件(硬件T&L,OpenGL和DirectX7或以上版本)来完成这个任务。在老的系统上,必须模拟硬件T&L,所以运行速度很慢;而在新一代的3D卡(GeForce和Radeon)上面,硬件T&L运行十分快,并且比软件T&L光照效果要好。一些渲染器对两种方法都支持,这样可以让硬件发挥最大的效果。

3. 什么是剔除(culling)系统和LOD系统?
剔除系统可以只绘制出游戏场景中未被墙及其他物体遮挡的部分。一般的剔除系统是基于BSP树或者入口(Portal)的。BSP树系统是最快和最有效的场景组织结构,特别是对于室内场景来说,但是BSP树必须在场景编辑器中预计算。渲染器不支持使用八叉树(Octree)来组织场景的剔除。多数商业化3D引擎使用基于BSP树的剔除系统。如果使用BSP树的剔除系统的话,室内渲染速度和场景大小、对象数目无关,甚至在老的PC上都可以使游戏以正常的帧率运行。

LOD系统可以增加室外场景的帧率。如果摄像机离物体比较远的话,它可以自动将物体转换为“简单”形体,这样就减少了每帧要绘制的多边形数目。

4. 什么是阴影贴图(Shadow Mapping)?
也叫做光照贴图(Light Mapping)——这是一种可以在不减少帧率的情况下达到真实感光照和阴影效果的方法。阴影贴图编辑器允许在场景中放置任意数目的静态光源,它会为每个面预计算光流量(light flow)和静态阴影。现代商业 3D游戏中多数都会使用到阴影贴图。如下图所示,平滑的光照和阴影极大地提升了游戏的氛围。



5. 什么是粒子系统
粒子系统是一种特效发生器,它可以制造大量的小粒子来达到某种特殊的效果,比如烟雾、火焰或者爆炸。好的粒子效果甚至比渲染好的动画都出色,正因为如此,当前几乎所有的游戏中都使用了粒子系统。为了制造真实的粒子效果,粒子发生器必须在不影响帧率的情况下控制成千上万的粒子运动。简单的粒子系统只允许设置粒子的一些属性,比如生存时间、重力或者颜色;复杂的粒子系统允许为每个粒子的运动函数编写代码。一些粒子系统也包含了光线生成器来创建光线或者轨迹。



6. 什么是着色器(shader)?
着色器为图形渲染增加了新的方案,它允许顶点和像素级别的变换(transform)、光照(lighting),以及在运行时间渲染方式的修改。一个着色器是一段小脚本,运行在图形硬件上,为渲染到屏幕上的每个顶点或像素提供渲染方式。这就为用户提供了一种新的灵活的像素渲染的方法。顶点和像素着色器可以用来生成真实感水波、卡通风格、为模型覆盖毛发或者控制火山的熔岩等。很多新的游戏引擎都支持着色器。



7. 什么是骨骼动画(bones animation)
当前有两种模型动画的方式:顶点动画和骨骼动画。顶点动画中,每帧动画其实就是模型特定姿态的一个“快照”。通过在帧之间插值的方法,引擎可以得到平滑的动画效果。在骨骼动画中,模型具有互相连接的“骨骼”组成的骨架结构,通过改变骨骼的朝向和位置来为模型生成动画。

骨骼动画比顶点动画要求更高的处理器性能,但同时它也具有更多的有点,骨骼动画可以更容易、更快捷地创建。不同的骨骼动画可以被结合到一起——比如,模型可以转动头部、射击并且同时也在走路。一些引擎可以实时操纵单个骨骼,这样就可以和环境更加准确地进行交互——模型可以俯身并向某个方向观察或射击,或者从地上的某个地方捡起一个东西。多数引擎支持顶点动画,但不是所有的引擎都支持骨骼动画。

一些引擎包含面部动画系统,这种系统使用通过音位(phoneme)和情绪修改面部骨骼集合来表达面部表情和嘴部动作。



8. 什么是保存/读取系统(save/load system)?
这种系统允许终端用户保存整个游戏状态,它自动“冻结”所有正在运行的脚本和对象以及游戏变量,将它们写到一个文件中,有时候也有一张屏幕截图。如果要在以后的某个时间继续游戏或者在任意点离开和进入游戏场景的话,这种功能就十分必要。存储整个游戏状态看起来并没有什么难度,但在实际开发的时候却并不简单,它必须在游戏引擎的核心代码中实现。如果没有这个系统,为了保存游戏,就必须写一个脚本来存储每个变量和对象的状态——十分难使用,只有可能应用在简单的游戏中。所以说来,多数商业化高端引擎都包括存取系统。

9. 什么是物理引擎?
物理引擎通过为刚性物体赋予真实的物理属性的方式来计算它们的运动、旋转和碰撞反映。为每个游戏使用物理引擎并不是完全必要的——简单的“牛顿”物理(比如加速和减速)也可以在一定程度上通过编程或编写脚本来实现。然而,当游戏需要比较复杂的物体碰撞、滚动、滑动或者弹跳的时候(比如赛车类游戏或者保龄球游戏),通过编程的方法就比较困难了。物理引擎使用对象属性(动量、扭矩或者弹性)来模拟刚体行为,这不仅可以得到更加真实的结果,对于开发人员来说也比编写行为脚本要更加容易掌握。

好的物理引擎允许有复杂的机械装置,像球形关节、轮子、气缸或者铰链。有些也支持非刚性体的物理属性,比如流体。



物理引擎可以从另外的厂商购买,而一些游戏开发系统具备完整的物理引擎。但是要注意,虽然有的系统在其特性列表中说他们有物理引擎,但其实是一些简单的加速和碰撞检测属性而已。

10. 什么是客户端/服务器(client/server)网络系统?
现在的多人游戏存在两种基本的网络系统类型:点对点(peer-to-peer)和客户端/服务器。在点对点系统中,所有连接起来的PC地位都是平等的,每个PC独立运行游戏,并且同其他PC都进行更新信息的传输。而在客户端/服务器系统中,其中的一个PC是掌管和运行游戏的服务器,其他所有的PC都是客户端,只进行玩家属性的更新和从服务器接收信息。为了不另外增加PC,一般情况下,一个PC在作为服务器的同时也是客户端。

点对点系统在最初的多人游戏中使用,但在现在的游戏中很少使用这种网络系统,因为它有很多缺陷。点对点游戏不能保证同步运行,比如一个子弹在一台PC上击中了一个目标,但可能在另一台PC上却没有(这是一致性问题)。另外,由于连接起来的PC通信经常冲突,所以连接到一起的玩家数目不可能太多。超过4个玩家数目的联网游戏一般就要使用客户端/服务器系统。区域系统(zone system)是改进的客户端/服务器系统,它可以有多个服务器,游戏世界可以分割为由不同服务器控制的多个场景(区域)。区域系统用在玩家数量无限的大型多人在线游戏中。

客户端/服务器系统中允许的玩家数量多少主要取决于多玩家通信时所需带宽的大小。如果玩家移动很快而可预知的移动很少的话,需要的带宽就大。在最坏的情况下(单服务器在线空中格斗游戏),利用modem连接的玩家数量一般要低于25个。如果游戏世界被分成多个区域,并且玩家仅仅是走路或者交谈的话,即使1000个玩家也是可以同时在线的。



11. 什么是脚本编译器(script compiler)?
多数的 3D游戏系统包含脚本语言,可以用来控制物体或角色。每秒运动的物体越多,需要用到的脚本指令就越多。一般的脚本语言都是解释型的,也就是说脚本指令首先被转换为中介(intermediate)二进制代码,然后在游戏运行时由引擎执行。由于处理器需要逐字节地解释代码,所以解释型脚本语言运行很慢,会极大影响帧率,在基于解释型脚本语言的游戏中,一个场景包含的角色或物体数量不能太多,并且行为也不能太复杂。

而脚本编译器不是仅仅将脚本语言转换为二进制代码,而是将它转换为真正的机器代码(machine code)——也就是处理器的本机语言。编译好的脚本语言比解释型脚本语言的运行速度要快10倍左右,并且即使在同时有成千上万移动对象的游戏中,也不会影响帧率。

注意:有些系统在他们的特性列表中宣扬具有编译器,但他们所谓的编译仅仅是编译为中介二进制代码,也就是说使用的仍然是解释型脚本。

12. C-Script脚本语言和“真正”的C/C++有什么区别?
C-Script和C/C++的语法类似,但前者对于初学者来说更容易掌握。主要的区别有:

l 在C/C++中,你可以定义结构体或者类,而C-Script仅支持预定义对象的结构体,比如entity或者panel等。在C-Script中是不能自定义结构体和类的。

l C/C++有很多表示数字的类型,而在C-Script中只有一种数字变量类型,对float和integer类型都是通用的。

l C/C++中,如果有错误发生的话,整个程序都会中止。而C-Script会给出一个准确的出错消息,减少错误发生的可能性。比如,在C-Script中你不可能对字符串或者数组越界访问,而且你不用担心什么情况下使用“.”、“->”还是“&”来存取对象的成员。

13. 哪种方法更好:使用C-Script编写游戏,还是使用DLL插件在“真实”的C++中编写?
这是不是一个绝对的问题。C-Script比C++容易学习和使用,并且出错几率少,代码长度短。它不需要面对编程中出现的很多复杂问题,因为初始化、多任务处理、对象之间交互和游戏循环等都是由引擎控制的。这样说来,C-Script对于初学者是最好的选择。而另一方面,真实的C++编程确可以给你更大的编程自由度,可以允许你为引擎添加特定的功能模块,这是脚本语言所不能做到的,比如为一种新的3D对象添加特殊的渲染器,这取决于你编程能力的大小。





附言:
本文主要参考自 http://www.3dgamestudio.com/

本文正在完善中,可能会不断有新版本推出,更多信息请光临本人的Blog。

由于作者水平有限,错误在所难免,希望发现问题的朋友即时加以斧正,可以通过E-mail和本人取得联

你可能感兴趣的:(游戏,编程,服务器,脚本,语言,引擎)