作者:韓紅雷
1.
3D引擎(3D engine)、3D編程語言(3D language)和3D創(chuàng)作系統(tǒng)(3D authoring system)的區(qū)別是什么?
3D編程語言提供了一種更加容易的編寫3D應(yīng)用程序的方法,因為你使用的是一種專門為3D游戲設(shè)計的腳本語言來編寫DirectX界面。這種語言不受3D引擎速度和自由度的影響,并且避免了使用“真正”編程語言帶來的問題。很多3D編程語言使用Basic——一種比較容易學(xué)習(xí)的語言,但由于其落后的語言結(jié)果,所以并不適合于編寫大而復(fù)雜的游戲。比較適合于當(dāng)前游戲開發(fā)需要的是基于C或者JavaScript的語言。
創(chuàng)作游戲最簡單的方法是使用3D創(chuàng)作系統(tǒng)——它們有自己的3D引擎,并且具備可視化編輯器,可以很快地創(chuàng)作一個游戲原型。當(dāng)然了,只有很簡單的游戲才可能繞開編程,創(chuàng)作系統(tǒng)一般都提供腳本語言來進行編程或定制游戲。利用創(chuàng)作系統(tǒng),再加上對獨立3D引擎的編程,可以在很短的時間內(nèi)創(chuàng)作一款游戲,很多大的游戲公司都開始使用創(chuàng)作系統(tǒng)來開發(fā)游戲了。
一些簡單的創(chuàng)作系統(tǒng)針對FPS(First or third Person Shooters),不提供或者只提供有限的腳本編程。盡管利用他們開發(fā)的FPS游戲并沒有什么市場,但如果你不希望使用腳本或者不想讓你的游戲商業(yè)化的話,也可以使用他們來開發(fā)游戲。而多數(shù)的創(chuàng)作系統(tǒng)可以用來開發(fā)任何種類的游戲或者3D應(yīng)用程序。下面是一個當(dāng)下流行的系統(tǒng)和引擎的對比表:
**代表可以被顯示,但需要第三方工具來創(chuàng)建。
$$$表示發(fā)行或者銷售游戲需要額外收費或履行特定的條件。
該表格基于2005年秋的各廠家說明書,不保證所有數(shù)據(jù)的正確性。如果有多種許可版本,選擇價格適中的版本列出。列出的Gamestudio/A6屬性基于Gamestudio網(wǎng)站最新的更新版本。
|
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
|
上表并不是要說明哪個系統(tǒng)更好。即使功能很相似,各系統(tǒng)之間在速度或穩(wěn)定性方面也會有差距。對于你來說哪個系統(tǒng)更加出色主要取決于你的工程、目標(biāo)、個人傾向,當(dāng)然還有你的預(yù)算。你可以通過分析屏幕截圖、演示和使用試用版來決定你使用哪個系統(tǒng)。
2.
什么是渲染器(Renderer),什么是頂點變換和光照(T&L)?
渲染器是3D引擎的核心部分,它完成將3D物體繪制到屏幕上的任務(wù)。根據(jù)3D硬件使用方法的不同,可以分為DirectX和OpenGL兩種渲染器。OpenGL渲染器通過OpenGL圖形庫來使用3D硬件,多數(shù)3D卡支持這種方法。而DirectX渲染器使用微軟的DirectX庫——歸并到Windows操作系統(tǒng)中。在老的3D卡上面,OpenGL一般繪制速度較快一些,而在現(xiàn)代的3D卡上面,DirectX表現(xiàn)則更加出色。現(xiàn)在的OpenGL版本只有一個,而DirectX版本有很多:
DX6
|
基本的3D支持,沒有硬件T&L,整合于Windows95中
|
DX7
|
與DX6相似,但具有硬件T&L,整合于Windows98中
|
DX8
|
有了重大改進,支持著色器,整合于Windows2000、ME、XP中
|
DX9
|
和DX8類似,具有類C的著色器語言,整合于WindowsXP SP2中
|
在一個物體被繪制到屏幕之前,必須先計算它的光照,并且將它從3D世界轉(zhuǎn)換到屏幕二維坐標(biāo)系中(這兩個過程稱為光照和頂點變換,也就是T&L,Transformation & Lighting)。渲染器可以使用自己的算法(軟件T&L),也可以使用3D硬件(硬件T&L,OpenGL和DirectX7或以上版本)來完成這個任務(wù)。在老的系統(tǒng)上,必須模擬硬件T&L,所以運行速度很慢;而在新一代的3D卡(GeForce和Radeon)上面,硬件T&L運行十分快,并且比軟件T&L光照效果要好。一些渲染器對兩種方法都支持,這樣可以讓硬件發(fā)揮最大的效果。
3.
什么是剔除(culling)系統(tǒng)和LOD系統(tǒng)?
剔除系統(tǒng)可以只繪制出游戲場景中未被墻及其他物體遮擋的部分。一般的剔除系統(tǒng)是基于BSP樹或者入口(Portal)的。BSP樹系統(tǒng)是最快和最有效的場景組織結(jié)構(gòu),特別是對于室內(nèi)場景來說,但是BSP樹必須在場景編輯器中預(yù)計算。渲染器不支持使用八叉樹(Octree)來組織場景的剔除。多數(shù)商業(yè)化3D引擎使用基于BSP樹的剔除系統(tǒng)。如果使用BSP樹的剔除系統(tǒng)的話,室內(nèi)渲染速度和場景大小、對象數(shù)目無關(guān),甚至在老的PC上都可以使游戲以正常的幀率運行。
LOD系統(tǒng)可以增加室外場景的幀率。如果攝像機離物體比較遠(yuǎn)的話,它可以自動將物體轉(zhuǎn)換為“簡單”形體,這樣就減少了每幀要繪制的多邊形數(shù)目。
4.
什么是陰影貼圖(Shadow Mapping)?
也叫做光照貼圖(Light Mapping)——這是一種可以在不減少幀率的情況下達到真實感光照和陰影效果的方法。陰影貼圖編輯器允許在場景中放置任意數(shù)目的靜態(tài)光源,它會為每個面預(yù)計算光流量(light flow)和靜態(tài)陰影。現(xiàn)代商業(yè)3D游戲中多數(shù)都會使用到陰影貼圖。如下圖所示,平滑的光照和陰影極大地提升了游戲的氛圍。

具有陰影貼圖的場景 不具有陰影貼圖的場景
5.
什么是粒子系統(tǒng)
粒
子系統(tǒng)是一種特效發(fā)生器,它可以制造大量的小粒子來達到某種特殊的效果,比如煙霧、火焰或者爆炸。好的粒子效果甚至比渲染好的動畫都出色,正因為如此,當(dāng)
前幾乎所有的游戲中都使用了粒子系統(tǒng)。為了制造真實的粒子效果,粒子發(fā)生器必須在不影響幀率的情況下控制成千上萬的粒子運動。簡單的粒子系統(tǒng)只允許設(shè)置粒
子的一些屬性,比如生存時間、重力或者顏色;復(fù)雜的粒子系統(tǒng)允許為每個粒子的運動函數(shù)編寫代碼。一些粒子系統(tǒng)也包含了光線生成器來創(chuàng)建光線或者軌跡。

6.
什么是著色器(shader)?
著色器為圖形渲染增加了新的方案,它允許頂點和像素級別的變換(transform)、光照(lighting),
以及在運行時間渲染方式的修改。一個著色器是一段小腳本,運行在圖形硬件上,為渲染到屏幕上的每個頂點或像素提供渲染方式。這就為用戶提供了一種新的靈活
的像素渲染的方法。頂點和像素著色器可以用來生成真實感水波、卡通風(fēng)格、為模型覆蓋毛發(fā)或者控制火山的熔巖等。很多新的游戲引擎都支持著色器。

法線映射著色器 熔巖著色器
7.
什么是骨骼動畫(bones animation)
當(dāng)前有兩種模型動畫的方式:頂點動畫和骨骼動畫。頂點動畫中,每幀動畫其實就是模型特定姿態(tài)的一個“快照”。通過在幀之間插值的方法,引擎可以得到平滑的動畫效果。在骨骼動畫中,模型具有互相連接的“骨骼”組成的骨架結(jié)構(gòu),通過改變骨骼的朝向和位置來為模型生成動畫。
骨
骼動畫比頂點動畫要求更高的處理器性能,但同時它也具有更多的有點,骨骼動畫可以更容易、更快捷地創(chuàng)建。不同的骨骼動畫可以被結(jié)合到一起——比如,模型可
以轉(zhuǎn)動頭部、射擊并且同時也在走路。一些引擎可以實時操縱單個骨骼,這樣就可以和環(huán)境更加準(zhǔn)確地進行交互——模型可以俯身并向某個方向觀察或射擊,或者從
地上的某個地方撿起一個東西。多數(shù)引擎支持頂點動畫,但不是所有的引擎都支持骨骼動畫。
一些引擎包含面部動畫系統(tǒng),這種系統(tǒng)使用通過音位(phoneme)和情緒修改面部骨骼集合來表達面部表情和嘴部動作。

8.
什么是保存/讀取系統(tǒng)(save/load system)?
這
種系統(tǒng)允許終端用戶保存整個游戲狀態(tài),它自動“凍結(jié)”所有正在運行的腳本和對象以及游戲變量,將它們寫到一個文件中,有時候也有一張屏幕截圖。如果要在以
后的某個時間繼續(xù)游戲或者在任意點離開和進入游戲場景的話,這種功能就十分必要。存儲整個游戲狀態(tài)看起來并沒有什么難度,但在實際開發(fā)的時候卻并不簡單,
它必須在游戲引擎的核心代碼中實現(xiàn)。如果沒有這個系統(tǒng),為了保存游戲,就必須寫一個腳本來存儲每個變量和對象的狀態(tài)——十分難使用,只有可能應(yīng)用在簡單的
游戲中。所以說來,多數(shù)商業(yè)化高端引擎都包括存取系統(tǒng)。
9.
什么是物理引擎?
物
理引擎通過為剛性物體賦予真實的物理屬性的方式來計算它們的運動、旋轉(zhuǎn)和碰撞反映。為每個游戲使用物理引擎并不是完全必要的——簡單的“牛頓”物理(比如
加速和減速)也可以在一定程度上通過編程或編寫腳本來實現(xiàn)。然而,當(dāng)游戲需要比較復(fù)雜的物體碰撞、滾動、滑動或者彈跳的時候(比如賽車類游戲或者保齡球游
戲),通過編程的方法就比較困難了。物理引擎使用對象屬性(動量、扭矩或者彈性)來模擬剛體行為,這不僅可以得到更加真實的結(jié)果,對于開發(fā)人員來說也比編
寫行為腳本要更加容易掌握。
好的物理引擎允許有復(fù)雜的機械裝置,像球形關(guān)節(jié)、輪子、氣缸或者鉸鏈。有些也支持非剛性體的物理屬性,比如流體。
輪形發(fā)動機(wheel motor) 流體物理
物理引擎可以從另外的廠商購買,而一些游戲開發(fā)系統(tǒng)具備完整的物理引擎。但是要注意,雖然有的系統(tǒng)在其特性列表中說他們有物理引擎,但其實是一些簡單的加速和碰撞檢測屬性而已。
10.
什么是客戶端/服務(wù)器(client/server)網(wǎng)絡(luò)系統(tǒng)?
現(xiàn)在的多人游戲存在兩種基本的網(wǎng)絡(luò)系統(tǒng)類型:點對點(peer-to-peer)和客戶端/服務(wù)器。在點對點系統(tǒng)中,所有連接起來的PC地位都是平等的,每個PC獨立運行游戲,并且同其他PC都進行更新信息的傳輸。而在客戶端/服務(wù)器系統(tǒng)中,其中的一個PC是掌管和運行游戲的服務(wù)器,其他所有的PC都是客戶端,只進行玩家屬性的更新和從服務(wù)器接收信息。為了不另外增加PC,一般情況下,一個PC在作為服務(wù)器的同時也是客戶端。
點對點系統(tǒng)在最初的多人游戲中使用,但在現(xiàn)在的游戲中很少使用這種網(wǎng)絡(luò)系統(tǒng),因為它有很多缺陷。點對點游戲不能保證同步運行,比如一個子彈在一臺PC上擊中了一個目標(biāo),但可能在另一臺PC上卻沒有(這是一致性問題)。另外,由于連接起來的PC通信經(jīng)常沖突,所以連接到一起的玩家數(shù)目不可能太多。超過4個玩家數(shù)目的聯(lián)網(wǎng)游戲一般就要使用客戶端/服務(wù)器系統(tǒng)。區(qū)域系統(tǒng)(zone system)是改進的客戶端/服務(wù)器系統(tǒng),它可以有多個服務(wù)器,游戲世界可以分割為由不同服務(wù)器控制的多個場景(區(qū)域)。區(qū)域系統(tǒng)用在玩家數(shù)量無限的大型多人在線游戲中。
客戶端/服務(wù)器系統(tǒng)中允許的玩家數(shù)量多少主要取決于多玩家通信時所需帶寬的大小。如果玩家移動很快而可預(yù)知的移動很少的話,需要的帶寬就大。在最壞的情況下(單服務(wù)器在線空中格斗游戲),利用modem連接的玩家數(shù)量一般要低于25個。如果游戲世界被分成多個區(qū)域,并且玩家僅僅是走路或者交談的話,即使1000個玩家也是可以同時在線的。
Peer-to-Peer
|
最多4-5個玩家
|
Client/Server
|
最多25-50個玩家
|
Zone
|
人數(shù)不限,取決于服務(wù)器數(shù)目
|
11.
什么是腳本編譯器(script compiler)?
多數(shù)的3D游戲系統(tǒng)包含腳本語言,可以用來控制物體或角色。每秒運動的物體越多,需要用到的腳本指令就越多。一般的腳本語言都是解釋型的,也就是說腳本指令首先被轉(zhuǎn)換為中介(intermediate)二進制代碼,然后在游戲運行時由引擎執(zhí)行。由于處理器需要逐字節(jié)地解釋代碼,所以解釋型腳本語言運行很慢,會極大影響幀率,在基于解釋型腳本語言的游戲中,一個場景包含的角色或物體數(shù)量不能太多,并且行為也不能太復(fù)雜。
而腳本編譯器不是僅僅將腳本語言轉(zhuǎn)換為二進制代碼,而是將它轉(zhuǎn)換為真正的機器代碼(machine code)——也就是處理器的本機語言。編譯好的腳本語言比解釋型腳本語言的運行速度要快10倍左右,并且即使在同時有成千上萬移動對象的游戲中,也不會影響幀率。
注意:有些系統(tǒng)在他們的特性列表中宣揚具有編譯器,但他們所謂的編譯僅僅是編譯為中介二進制代碼,也就是說使用的仍然是解釋型腳本。
12.
C-Script腳本語言和“真正”的C/C++有什么區(qū)別?
C-Script和C/C++的語法類似,但前者對于初學(xué)者來說更容易掌握。主要的區(qū)別有:
l
在C/C++中,你可以定義結(jié)構(gòu)體或者類,而C-Script僅支持預(yù)定義對象的結(jié)構(gòu)體,比如entity或者panel等。在C-Script中是不能自定義結(jié)構(gòu)體和類的。
l
C/C++有很多表示數(shù)字的類型,而在C-Script中只有一種數(shù)字變量類型,對float和integer類型都是通用的。
l
C/C++中,如果有錯誤發(fā)生的話,整個程序都會中止。而C-Script會給出一個準(zhǔn)確的出錯消息,減少錯誤發(fā)生的可能性。比如,在C-Script中你不可能對字符串或者數(shù)組越界訪問,而且你不用擔(dān)心什么情況下使用“.”、“->”還是“&”來存取對象的成員。
13.
哪種方法更好:使用C-Script編寫游戲,還是使用DLL插件在“真實”的C++中編寫?
這是不是一個絕對的問題。C-Script比C++容易學(xué)習(xí)和使用,并且出錯幾率少,代碼長度短。它不需要面對編程中出現(xiàn)的很多復(fù)雜問題,因為初始化、多任務(wù)處理、對象之間交互和游戲循環(huán)等都是由引擎控制的。這樣說來,C-Script對于初學(xué)者是最好的選擇。而另一方面,真實的C++編程確可以給你更大的編程自由度,可以允許你為引擎添加特定的功能模塊,這是腳本語言所不能做到的,比如為一種新的3D對象添加特殊的渲染器,這取決于你編程能力的大小。