作者:韓紅雷
1.
3D引擎(3D engine)、3D編程語言(3D language)和3D創作系統(3D authoring system)的區別是什么?
3D編程語言提供了一種更加容易的編寫3D應用程序的方法,因為你使用的是一種專門為3D游戲設計的腳本語言來編寫DirectX界面。這種語言不受3D引擎速度和自由度的影響,并且避免了使用“真正”編程語言帶來的問題。很多3D編程語言使用Basic——一種比較容易學習的語言,但由于其落后的語言結果,所以并不適合于編寫大而復雜的游戲。比較適合于當前游戲開發需要的是基于C或者JavaScript的語言。
創作游戲最簡單的方法是使用3D創作系統——它們有自己的3D引擎,并且具備可視化編輯器,可以很快地創作一個游戲原型。當然了,只有很簡單的游戲才可能繞開編程,創作系統一般都提供腳本語言來進行編程或定制游戲。利用創作系統,再加上對獨立3D引擎的編程,可以在很短的時間內創作一款游戲,很多大的游戲公司都開始使用創作系統來開發游戲了。
一些簡單的創作系統針對FPS(First or third Person Shooters),不提供或者只提供有限的腳本編程。盡管利用他們開發的FPS游戲并沒有什么市場,但如果你不希望使用腳本或者不想讓你的游戲商業化的話,也可以使用他們來開發游戲。而多數的創作系統可以用來開發任何種類的游戲或者3D應用程序。下面是一個當下流行的系統和引擎的對比表:
**代表可以被顯示,但需要第三方工具來創建。
$$$表示發行或者銷售游戲需要額外收費或履行特定的條件。
該表格基于2005年秋的各廠家說明書,不保證所有數據的正確性。如果有多種許可版本,選擇價格適中的版本列出。列出的Gamestudio/A6屬性基于Gamestudio網站最新的更新版本。
|
FPS
|
Authoring
Systems
|
3D
Languages
|
3D
Engines
|
|
3DGM
|
Quest
|
Radish
|
Virtools
|
A6std
|
A6ext
|
A6com
|
A6Pro
|
DB
|
DBPRO
|
Blitz
|
TV3D
|
Irrlicht
|
Torque
|
Nebula
|
Crystal
|
Cipher
|
PR
|
Jupiter
|
Price (US
$)
|
$49
|
$749
|
$2495
|
$5000
|
€49
|
€89
|
€199
|
€899
|
$49
|
$99
|
$100
|
$500
|
—
|
$100
|
—
|
—
|
$100
|
$1500
|
$$$
|
Publish restrictions
|
$$$
|
no
|
no
|
no
|
Splash
|
Splash
|
Splash
|
no
|
no
|
no
|
no
|
no
|
no
|
$$$
|
no
|
LGPL
|
no
|
$$$
|
$$$
|
Renderer
|
DX6
|
DX8
|
DX8
|
|
DX9
|
DX9
|
DX9
|
DX9
|
DX6
|
DX9
|
DX7
|
DX8
|
|
|
DX8
|
OG
|
DX8
|
DX9
|
|
Software
T&L
|
yes
|
—
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
—
|
—
|
—
|
yes
|
—
|
—
|
—
|
—
|
yes
|
yes
|
Hardware
T&L
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
Culling
system
|
—
|
|
|
Portal
|
BSP
|
BSP
|
BSP
|
BSP
|
—
|
BSP
|
—
|
BSP
|
|
|
|
Portal
|
BSP
|
BSP
|
BSP
|
LOD
system
|
—
|
yes
|
yes
|
yes
|
—
|
yes
|
yes
|
yes
|
—
|
yes
|
yes
|
—
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
Terrain
|
yes
|
—
|
yes
|
yes
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
Shadow
mapping
|
—
|
—
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
—
|
**
|
yes
|
yes
|
**
|
yes
|
—
|
yes
|
yes
|
yes
|
yes
|
Dynamic
shadows
|
—
|
$59
|
yes
|
yes
|
—
|
—
|
yes
|
yes
|
—
|
yes
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
Shader
|
—
|
yes
|
yes
|
—
|
—
|
—
|
yes
|
yes
|
—
|
yes
|
—
|
yes
|
—
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
Particle
generator
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
—
|
yes
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
Beam
generator
|
—
|
—
|
—
|
—
|
—
|
—
|
yes
|
yes
|
—
|
—
|
—
|
—
|
—
|
—
|
yes
|
yes
|
—
|
—
|
—
|
Template
system
|
yes
|
—
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
Bones
animation
|
—
|
yes
|
yes
|
yes
|
—
|
—
|
yes
|
yes
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
Save/Load
System
|
—
|
—
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
yes
|
Expandable (plugin)
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
—
|
yes
|
yes
|
—
|
—
|
—
|
yes
|
yes
|
—
|
—
|
yes
|
Network
system
|
—
|
$799
|
zone
|
zone
|
—
|
—
|
c/s
|
zone
|
p-p
|
c/s
|
c/s
|
—
|
c/s
|
zone
|
c/s
|
c/s
|
c/s
|
c/s
|
zone
|
Physics
engine
|
—
|
yes
|
yes
|
$5000
|
—
|
—
|
1
obj
|
yes
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
yes
|
Level
editor
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
—
|
$99
|
yes
|
—
|
—
|
yes
|
—
|
—
|
—
|
yes
|
yes
|
Model
editor
|
—
|
yes
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
Script
editor
|
—
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
yes
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
Script
compiler
|
—
|
—
|
—
|
—
|
yes
|
yes
|
yes
|
yes
|
—
|
yes
|
yes
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
—
|
Script
debugger
|
—
|
—
|
—
|
—
|
yes
|
yes
|
yes
|
yes
|
—
|
yes
|
—
|
—
|
—
|
yes
|
yes
|
—
|
—
|
—
|
—
|
Script
syntax
|
—
|
Chart
|
Lisp
|
Chart
|
C
|
C
|
C
|
C
|
Basic
|
Basic
|
Basic
|
—
|
—
|
C
|
TCL
|
|
—
|
—
|
C
|
上表并不是要說明哪個系統更好。即使功能很相似,各系統之間在速度或穩定性方面也會有差距。對于你來說哪個系統更加出色主要取決于你的工程、目標、個人傾向,當然還有你的預算。你可以通過分析屏幕截圖、演示和使用試用版來決定你使用哪個系統。
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.
什么是物理引擎?
物
理引擎通過為剛性物體賦予真實的物理屬性的方式來計算它們的運動、旋轉和碰撞反映。為每個游戲使用物理引擎并不是完全必要的——簡單的“牛頓”物理(比如
加速和減速)也可以在一定程度上通過編程或編寫腳本來實現。然而,當游戲需要比較復雜的物體碰撞、滾動、滑動或者彈跳的時候(比如賽車類游戲或者保齡球游
戲),通過編程的方法就比較困難了。物理引擎使用對象屬性(動量、扭矩或者彈性)來模擬剛體行為,這不僅可以得到更加真實的結果,對于開發人員來說也比編
寫行為腳本要更加容易掌握。
好的物理引擎允許有復雜的機械裝置,像球形關節、輪子、氣缸或者鉸鏈。有些也支持非剛性體的物理屬性,比如流體。
輪形發動機(wheel motor) 流體物理
物理引擎可以從另外的廠商購買,而一些游戲開發系統具備完整的物理引擎。但是要注意,雖然有的系統在其特性列表中說他們有物理引擎,但其實是一些簡單的加速和碰撞檢測屬性而已。
10.
什么是客戶端/服務器(client/server)網絡系統?
現在的多人游戲存在兩種基本的網絡系統類型:點對點(peer-to-peer)和客戶端/服務器。在點對點系統中,所有連接起來的PC地位都是平等的,每個PC獨立運行游戲,并且同其他PC都進行更新信息的傳輸。而在客戶端/服務器系統中,其中的一個PC是掌管和運行游戲的服務器,其他所有的PC都是客戶端,只進行玩家屬性的更新和從服務器接收信息。為了不另外增加PC,一般情況下,一個PC在作為服務器的同時也是客戶端。
點對點系統在最初的多人游戲中使用,但在現在的游戲中很少使用這種網絡系統,因為它有很多缺陷。點對點游戲不能保證同步運行,比如一個子彈在一臺PC上擊中了一個目標,但可能在另一臺PC上卻沒有(這是一致性問題)。另外,由于連接起來的PC通信經常沖突,所以連接到一起的玩家數目不可能太多。超過4個玩家數目的聯網游戲一般就要使用客戶端/服務器系統。區域系統(zone system)是改進的客戶端/服務器系統,它可以有多個服務器,游戲世界可以分割為由不同服務器控制的多個場景(區域)。區域系統用在玩家數量無限的大型多人在線游戲中。
客戶端/服務器系統中允許的玩家數量多少主要取決于多玩家通信時所需帶寬的大小。如果玩家移動很快而可預知的移動很少的話,需要的帶寬就大。在最壞的情況下(單服務器在線空中格斗游戲),利用modem連接的玩家數量一般要低于25個。如果游戲世界被分成多個區域,并且玩家僅僅是走路或者交談的話,即使1000個玩家也是可以同時在線的。
Peer-to-Peer
|
最多4-5個玩家
|
Client/Server
|
最多25-50個玩家
|
Zone
|
人數不限,取決于服務器數目
|
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對象添加特殊的渲染器,這取決于你編程能力的大小。