• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            游戲引擎全剖析

            Posted on 2007-12-03 22:05 orlando 閱讀(4850) 評(píng)論(8)  編輯 收藏 引用
            第1部分: 游戲引擎介紹, 渲染和構(gòu)造3D世界


            介紹
              自Doom游戲時(shí)代以來(lái)我們已經(jīng)走了很遠(yuǎn)。 DOOM不只是一款偉大的游戲,它同時(shí)也開(kāi)創(chuàng)了一種新的游戲編程模式: 游戲 "引擎"。 這種模塊化,可伸縮和擴(kuò)展的設(shè)計(jì)觀念可以讓游戲玩家和程序設(shè)計(jì)者深入到游戲核心,用新的模型,場(chǎng)景和聲音創(chuàng)造新的游戲, 或向已有的游戲素材中添加新的東西。大量的新游戲根據(jù)已經(jīng)存在的游戲引擎開(kāi)發(fā)出來(lái),而大多數(shù)都以ID公司的Quake引擎為基礎(chǔ), 這些游戲包括Counter  Strike, Team Fortress, Tac Ops, Strike Force, 以及Quake Soccer。Tac Ops 和Strike Force 都使用了Unreal Tournament 引擎。事實(shí)上, "游戲引擎" 已經(jīng)成為游戲玩家之間交流的標(biāo)準(zhǔn)用語(yǔ),但是究竟引擎止于何處,而游戲又從哪里開(kāi)始呢?像素的渲染,聲音的播放,怪物的思考以及游戲事件的觸發(fā),游戲中所有這一切的幕后又是什么呢? 如果你曾經(jīng)思考過(guò)這些問(wèn)題, 而且想要知道更多驅(qū)動(dòng)游戲進(jìn)行的東西,那么這篇文章正好可以告訴你這些。 本文分多個(gè)部分深入剖析了游戲引擎的內(nèi)核, 特別是Quake引擎,因?yàn)槲易罱ぷ鞯墓綬aven Software已經(jīng)在Quake引擎的基礎(chǔ)上開(kāi)發(fā)出了多款游戲,其中包括著名的Soldier of Fortune 。


            開(kāi)始
              讓我們首先來(lái)看看一個(gè)游戲引擎和游戲本身之間的主要區(qū)別。 許多人們會(huì)混淆游戲引擎和整個(gè)游戲 。這有點(diǎn)像把一個(gè)汽車發(fā)動(dòng)機(jī)和整個(gè)汽車混淆起來(lái)一樣 。 你能夠從汽車?yán)锩嫒〕霭l(fā)動(dòng)機(jī), 建造另外一個(gè)外殼,再使用發(fā)動(dòng)機(jī)一次。 游戲也像那。 游戲引擎被定義為所有的非游戲特有的技術(shù)。 游戲部份是被稱為 '資產(chǎn)' 的所有內(nèi)容 (模型,動(dòng)畫,聲音,人工智能和物理學(xué))和為了使游戲運(yùn)行或者控制如何運(yùn)行而特別需要的程序代碼, 比如說(shuō)AI--人工智能。

              對(duì)于曾經(jīng)看過(guò) Quake 游戲結(jié)構(gòu)的人來(lái)說(shuō), 游戲引擎就是 Quake。exe ,而游戲部分則是 QAGame。dll 和 CGame。dll 。 如果你不知道這是什么意思, 也沒(méi)有什么關(guān)系;在有人向我解釋它以前, 我也不知道是什么意思。 但是你將會(huì)完全明白它的意思。 這篇游戲引擎指導(dǎo)分為十一個(gè)部份。 是的, 從數(shù)量上來(lái)說(shuō),總共是十一個(gè)部份! 每個(gè)部分大概3000字左右。現(xiàn)在就從第一部分開(kāi)始我們的探索吧,深入我們所玩游戲的內(nèi)核,在這里我們將了解一些基本的東西, 為后面的章節(jié)作鋪墊。。。


            渲染器
              讓我們從渲染器來(lái)開(kāi)始游戲引擎設(shè)計(jì)的探討吧, 我們將從游戲開(kāi)發(fā)者(本文作者的背景)的角度來(lái)探討這些問(wèn)題。事實(shí)上,在本文的各個(gè)段落,我們將常常從游戲開(kāi)發(fā)者的角度探討, 也讓您像我們一樣思考問(wèn)題!

              什么是渲染器,為什么它又這么重要呢?好吧,如果沒(méi)有它,你將什么也看不到。它讓游戲場(chǎng)景可視化,讓玩家/觀眾可以看見(jiàn)場(chǎng)景,從而讓玩家能夠根據(jù)屏幕上所看到的東西作出適當(dāng)?shù)臎Q斷。 盡管我們下面的探討可能讓新手感到有些恐懼,先別去理會(huì)它。 渲染器做些什么?為什么它是必須的?我們將會(huì)解釋這些重要問(wèn)題。

              當(dāng)構(gòu)造一個(gè)游戲引擎的時(shí)候, 你通常想做的第一件事情就是建造渲染器。 因?yàn)槿绻床灰?jiàn)任何東西 – 那么你又如何知道你的程序代碼在工作呢? 超過(guò) 50% 的 CPU 處理時(shí)間花費(fèi)在渲染器上面; 通常也是在這個(gè)部分,游戲開(kāi)發(fā)者將會(huì)受到最苛刻的評(píng)判。 如果我們?cè)谶@個(gè)部分表現(xiàn)很差,事情將會(huì)變得非常糟糕, 我們的程序技術(shù),我們的游戲和我們的公司將在 10 天之內(nèi)變成業(yè)界的笑話。 它也是我們最依賴于外部廠商和力量的地方,在這里他們將處理最大限度的潛在操作目標(biāo)。 如此說(shuō)來(lái), 建造一個(gè)渲染器確實(shí)不象聽(tīng)起來(lái)那么吸引人(事實(shí)如此), 但如果沒(méi)有一個(gè)好的渲染器, 游戲或許永遠(yuǎn)不會(huì)躋身于排行榜前10 名。

              如今,在屏幕上生成像素,涉及到 3D 加速卡, API ,三維空間數(shù)學(xué), 對(duì) 3D 硬件如何工作的理解等等。對(duì)於主機(jī)(游戲機(jī))游戲來(lái)說(shuō),也需要相同類型的知識(shí),但是至少對(duì)于主機(jī), 你不必去嘗試擊中一個(gè)移動(dòng)中的目標(biāo)。 因?yàn)橐慌_(tái)主機(jī)的硬件配置是固定的 "時(shí)間快照", 和PC(個(gè)人計(jì)算機(jī))不同, 在一臺(tái)主機(jī)的生命期中,它的硬件配置不會(huì)改變。

              在一般意義上,渲染器的工作就是要?jiǎng)?chuàng)造出游戲的視覺(jué)閃光點(diǎn),實(shí)際上達(dá)到這個(gè)目標(biāo)需要大量的技巧。3D圖形本質(zhì)上是用最少的努力創(chuàng)造出最大效果的一門藝術(shù), 因?yàn)轭~外的 3D 處理在處理器時(shí)間和和內(nèi)存帶寬方面都是極為昂貴的。 它也是一種預(yù)算, 要弄清楚你想在什么地方花費(fèi)處理器時(shí)間,而你寧愿在什么地方節(jié)省一些從而達(dá)到最好的整體效果。 接下來(lái)我們將會(huì)介紹一些這方面的工具,以及怎樣更好的用它們讓游戲引擎工作。


            建造3D世界
              最近,當(dāng)我和一位從事計(jì)算機(jī)圖形方面工作長(zhǎng)達(dá)數(shù)年之久的人會(huì)談時(shí),她向我吐露道, 當(dāng)她第一次看到實(shí)時(shí)操縱計(jì)算機(jī) 3D 圖象時(shí), 她不知道這是怎么實(shí)現(xiàn)的, 也不知道計(jì)算機(jī)如何能夠存儲(chǔ) 3D 圖象。 今天這對(duì)于在大街上的普通人來(lái)說(shuō)或許是真實(shí)的,即使他們時(shí)常玩 PC 游戲, 游戲機(jī)游戲, 或街機(jī)游戲。

              下面我們將從游戲設(shè)計(jì)者的角度討論創(chuàng)造 3D 世界的一些細(xì)節(jié),你也應(yīng)該看一看 Dave Salvator 所寫的“3D 管線導(dǎo)論“,以便對(duì)3D 圖象生成的主要過(guò)程有一個(gè)整體的了解。

              3D 物體(對(duì)象)被儲(chǔ)存成 3D 世界中的一系列點(diǎn)(被稱為頂點(diǎn)), 彼此之間有相互關(guān)系,所以計(jì)算機(jī)知道如何在世界中的這些點(diǎn)之間畫線或者是填充表面。 一個(gè)立方體由8個(gè)點(diǎn)組成,每個(gè)角一個(gè)點(diǎn)。立方體有6個(gè)表面, 分別代表它的每一個(gè)面。 這就是 3D 對(duì)象儲(chǔ)存的基礎(chǔ)。 對(duì)于一些比較復(fù)雜的 3D 物體, 比如說(shuō)一個(gè) Quake 的關(guān)卡,將有數(shù)以千計(jì)(有時(shí)數(shù)以十萬(wàn)計(jì))的頂點(diǎn), 和數(shù)以千計(jì)的多邊形表面。

              參見(jiàn)上圖的線框表示(注:原文在這里有一幅圖)。 本質(zhì)上與上面的立方體例子類似, 它僅僅是由許許多多的小多邊形組成的一些復(fù)雜場(chǎng)景。模型和世界如何儲(chǔ)存是渲染器的一部份功能, 而不屬于應(yīng)用程序/游戲部份。 游戲邏輯不需要知道對(duì)象在內(nèi)存中如何表示, 也不需要知道渲染器將怎樣把他們顯示出來(lái)。 游戲只是需要知道渲染器將使用正確的視野去表示對(duì)象, 并將在正確的動(dòng)畫幀中把正確的模型顯示出來(lái)。

              在一個(gè)好的引擎中,渲染器應(yīng)該是可以完全被一個(gè)新的渲染器替換掉, 并且不需要去改動(dòng)游戲的一行代碼。許多跨平臺(tái)引擎, 而且許多自行開(kāi)發(fā)的游戲機(jī)引擎就是這樣的,如 Unreal 引擎, --舉例來(lái)說(shuō), 這個(gè)游戲 GameCube 版本的渲染器就可以被你任意的替換掉。

              讓我們?cè)倏纯磧?nèi)部的表示方法—除了使用坐標(biāo)系統(tǒng),還有其他方法可以在計(jì)算機(jī)內(nèi)存里表示空間的點(diǎn)。在數(shù)學(xué)上,你可以使用一個(gè)方程式來(lái)描述直線或曲線, 并得到多邊形, 而幾乎所有的 3D 顯示卡都使用多邊形來(lái)作為它們的最終渲染圖元。 一個(gè)圖元就是你在任何顯示卡上面所能使用的最低級(jí)的繪制(渲染)單位,幾乎所有的硬件都是使用三個(gè)頂點(diǎn)的多邊形(三角形)。 新一代的 nVidia 和 ATI 顯卡可以允許你以數(shù)學(xué)方式渲染(被稱為高次表面), 但因?yàn)檫@不是所有圖形卡的標(biāo)準(zhǔn), 你還不能靠它作為渲染策略。

              從計(jì)算的角度來(lái)看,這通常有些昂貴,但它時(shí)常是新的實(shí)驗(yàn)技術(shù)的基礎(chǔ),例如,地表的渲染,或者對(duì)物件銳利的邊緣進(jìn)行柔化。 我們將會(huì)在下面的曲面片小節(jié)中更進(jìn)一步介紹這些高次表面。


            剔除概觀
              問(wèn)題來(lái)了。 我現(xiàn)在有一個(gè)由幾十萬(wàn)個(gè)頂點(diǎn)/多邊形描述的世界。 我以第一人稱視角位于我們這個(gè) 3D 世界的一邊。 在視野中可以看見(jiàn)世界的一些多邊形, 而另外一些則不可見(jiàn), 因?yàn)橐恍┪矬w, 比如一面看得見(jiàn)的墻壁, 遮擋住了它們。 即使是最好的游戲編碼人員, 在目前的 3D 顯卡上, 在一個(gè)視野中也不能處理 300,000個(gè)三角形且仍然維持 60fps (一個(gè)主要目標(biāo))。 顯卡不能處理它, 因此我們必須寫一些代碼,在把它們交給顯卡處理之前除去那些看不見(jiàn)的多邊形。 這個(gè)過(guò)程被稱為剔除。

              有許多不同的剔除方法。 在深入了解這些之前,讓我們探討一下為什么圖形顯示卡不能處理超高數(shù)量的多邊形。 我是說(shuō),最新的圖形卡每秒鐘不能處理幾百萬(wàn)個(gè)多邊形嗎?它不應(yīng)該能夠處理嗎? 首先,你必須理解市場(chǎng)銷售宣稱的多邊形生成率和真實(shí)世界的多邊形生成率。 行銷上宣稱的多邊形生成率是圖形顯示卡理論上能夠達(dá)到的多邊形生成率。

              如果全部多邊形都在屏幕上, 相同的紋理,相同的尺寸大小, 正在往顯示卡上傳送多邊形的應(yīng)用程序除了傳送多邊形以外什么也不做, 這時(shí)顯卡能處理多少多邊形數(shù)量, 就是圖形芯片廠商呈現(xiàn)給你的數(shù)字。

              然而,在真實(shí)的游戲情形中,應(yīng)用程序時(shí)常在后臺(tái)做著許多其他的事情 -- 多邊形的 3D 變換, 光照計(jì)算, 拷貝較多的紋理到顯卡內(nèi)存, 等等。 不僅紋理要送到顯示卡, 而且還有每個(gè)多邊形的細(xì)節(jié)。一些比較新的顯卡允許你實(shí)際上在顯卡內(nèi)存本身里面儲(chǔ)存模型/世界幾何細(xì)節(jié), 但這可能是昂貴的,將會(huì)耗光紋理正常可以使用的空間,所以你最好能確定每一幀都在使用這些模型的頂點(diǎn), 否則你只是在浪費(fèi)顯示卡上的存儲(chǔ)空間。 我們就說(shuō)到這里了。 重要的是,在實(shí)際使用顯卡時(shí),并不必然就能達(dá)到你在顯卡包裝盒上所看到的那些指標(biāo),如果你有一個(gè)比較慢速的CPU , 或沒(méi)有足夠的內(nèi)存時(shí),這種差異就尤為真實(shí)。


            基本的剔除方法
              最簡(jiǎn)單的剔除方式就是把世界分成區(qū)域, 每個(gè)區(qū)域有一個(gè)其他可見(jiàn)區(qū)域的列表。 那樣, 你只需要顯示針對(duì)任何給定點(diǎn)的可見(jiàn)部分。 如何生成可見(jiàn)視野區(qū)域的列表是技巧所在。 再者, 有許多方法可以用來(lái)生成可見(jiàn)區(qū)域列表, 如 BSP 樹(shù), 窺孔等等。

              可以肯定,當(dāng)談?wù)?DOOM 或 QUAKE 時(shí),你已經(jīng)聽(tīng)到過(guò)使用 BSP 這個(gè)術(shù)語(yǔ)了。 它表示二叉空間分割。

              BSP 是一種將世界分成小區(qū)域的的方法,通過(guò)組織世界的多邊形,容易確定哪些區(qū)域是可見(jiàn)的而哪些是不可見(jiàn)的 – 從而方便了那些不想做太多繪制工作的基于軟件的渲染器。它同時(shí)也以一種非常有效的方式讓你知道你位于世界中的什么地方。

              在基于窺孔的引擎 ( 最早由 3D Realms 已經(jīng)取消的 Prey 項(xiàng)目引入游戲世界 )里,每個(gè)區(qū)域 ( 或房間) 都建造有自己的模型, 通過(guò)每個(gè)區(qū)域的門 ( 或窺孔 )能夠看見(jiàn)另外的區(qū)段。 渲染器把每個(gè)區(qū)域作為獨(dú)立的場(chǎng)景單獨(dú)繪制。 這就是它的大致原理。 足以說(shuō)這是任何一個(gè)渲染器的必需部份,而且非常重要。

              盡管一些這樣的技術(shù)歸類在 "遮擋剔除"之下,但是他們?nèi)慷加型瑯拥哪康? 盡早消除不必要的工作。 對(duì)於一個(gè)FPS游戲(第一人稱射擊游戲) 來(lái)說(shuō),視野中時(shí)常有許多三角形,而且游戲玩家承擔(dān)視野的控制,丟棄或者剔除不可見(jiàn)的三角形就是絕對(duì)必要的了。 對(duì)空間模擬來(lái)說(shuō)也是這樣的, 你可以看見(jiàn)很遠(yuǎn)很遠(yuǎn)的地方 – 剔除超過(guò)視覺(jué)范圍外面的東西就非常重要。 對(duì)于視野受到限制的游戲來(lái)說(shuō) – 比如 RTS (即時(shí)戰(zhàn)略類游戲)--通常比較容易實(shí)現(xiàn)。 通常渲染器的這個(gè)部份還是由軟件來(lái)完成, 而不是由顯卡完成, 由顯卡來(lái)做這部分工作只是一個(gè)時(shí)間問(wèn)題。


            基本的圖形管線流程
              一個(gè)簡(jiǎn)單的例子,從游戲到多邊形繪制的圖形管線過(guò)程大致是這樣:
                · 游戲決定在游戲中有哪些對(duì)象, 它們的模型, 使用的紋理, 他們可能在什么動(dòng)畫幀,以及它們?cè)谟螒蚴澜缋锏奈恢谩?游戲也決定照相機(jī)的位置和方向。

                · 游戲把這些信息傳遞給渲染器。以模型為例 ,渲染器首先要查看模型的大小 ,照相機(jī)的位置, 然後決定模型在屏幕上是否全部可見(jiàn), 或者在觀察者 (照相機(jī)視野) 的左邊,在觀察者的后面,或距離很遠(yuǎn)而不可見(jiàn)。它甚至?xí)褂靡恍┦澜鐪y(cè)定方式來(lái)計(jì)算出模型是否是可見(jiàn)的。 (參見(jiàn)下面這條)

                · 世界可視化系統(tǒng)決定照相機(jī)在世界中的位置,并根據(jù)照相機(jī)視野決定世界的哪些區(qū)域 / 多邊形是可見(jiàn)的。有許多方法可以完成這個(gè)任務(wù), 包括把世界分割成許多區(qū)域的暴力方法,每個(gè)區(qū)域直接為"我能從區(qū)域 D 看見(jiàn)區(qū)域 AB & C", 到更精致的 BSP(二叉空間分割)世界。 所有通過(guò)這些剔除測(cè)試的多邊形被傳遞給多邊形渲染器進(jìn)行繪制。

                · 對(duì)於每一個(gè)被傳遞給渲染器的多邊形, 渲染器依照局部數(shù)學(xué) ( 也就是模型動(dòng)畫) 和世界數(shù)學(xué)(相對(duì)于照相機(jī)的位置?)對(duì)多邊形進(jìn)行變換,并檢查決定多邊形是不是背對(duì)相機(jī) (也就是遠(yuǎn)離照相機(jī))。背面的多邊形被丟棄。 非背面的多邊形由渲染器根據(jù)發(fā)現(xiàn)的附近燈光照亮。然后渲染器要看多邊形使用的紋理,并且確定 API/ 圖形卡正在使用那種紋理作為它的渲染基礎(chǔ)。 在這里,多邊形被送到渲染 API,然后再送給顯卡。

              很明顯這有些過(guò)分簡(jiǎn)單化了,但你大概理解了。 下面的圖表摘自Dave Salvator's 3D 管線一文,可以給你多一些具體細(xì)節(jié):

              3D 管線
              - 高層的概觀
               1. 應(yīng)用程序/ 場(chǎng)景
              ·場(chǎng)景/ 幾何數(shù)據(jù)庫(kù)遍歷
              ·對(duì)象的運(yùn)動(dòng),觀察相機(jī)的運(yùn)動(dòng)和瞄準(zhǔn)
              ·對(duì)象模型的動(dòng)畫運(yùn)動(dòng)
              ·3D 世界內(nèi)容的描述
              ·對(duì)象的可見(jiàn)性檢查,包括可能的遮擋剔除
              ·細(xì)節(jié)層次的選擇 (LOD)

              2. 幾何
              ·變換 (旋轉(zhuǎn),平移, 縮放)
              ·從模型空間到世界空間的變換 (Direct3D)
              ·從世界空間到觀察空間變換
              ·觀察投影
              ·細(xì)節(jié)接受/ 拒絕 剔除
              ·背面剔除 (也可以在后面的屏幕空間中做)
              光照
              ·透視分割 - 變換到裁剪空間
              ·裁剪
              ·變換到屏幕空間

              3. 三角形生成
              ·背面剔除 ( 或者在光照計(jì)算之前的觀察空間中完成)
              ·斜率/ 角度計(jì)算
              ·掃瞄線變換

              4. 渲染 / 光柵化
              ·著色
              ·紋理
              ·霧
              ·Alpha 透明測(cè)試
              ·深度緩沖
              ·抗鋸齒 (可選擇的)
              ·顯示

              通常你會(huì)把所有的多邊形放到一些列表內(nèi), 然後根據(jù)紋理對(duì)這個(gè)列表排序(這樣你只需要對(duì)顯卡傳送一次紋理, 而不是每個(gè)多邊形都傳送一次), 等等。在過(guò)去,會(huì)把多邊形按照它們到相機(jī)的距離進(jìn)行排序,首先繪制那些距離相機(jī)最遠(yuǎn)的多邊形, 但現(xiàn)在由于 Z 緩沖的出現(xiàn),這種方法就不是那么重要了。 當(dāng)然那些透明的多邊形要除外,它們要在所有的非半透明多邊形繪制之后才能夠繪制 ,這樣一來(lái),所有在它們后面的多邊形就能正確地在場(chǎng)景中顯現(xiàn)出來(lái)。 當(dāng)然,象那樣,實(shí)際上你必須得從后到前地繪制那些多邊形。 但時(shí)常在任何給定的 FPS 游戲場(chǎng)景中, 通常沒(méi)有太多透明的多邊形。 它可能看起來(lái)像有,但實(shí)際上與那些不透明的多邊形相比,其比率是相當(dāng)?shù)偷摹?

              一旦應(yīng)用程序?qū)?chǎng)景傳遞到 API, API 就能利用硬件加速的變換和光照處理 (T&L), 這在如今的 3D 顯卡中是很平常的事情。 這里不討論涉及到的矩陣數(shù)學(xué)(參見(jiàn)Dave的 3D 管線導(dǎo)論),幾何變換允許 3D 顯卡按照你的嘗試,根據(jù)相機(jī)在任何時(shí)間的位置和方向,在世界的正確角度和位置繪制多邊形。

              對(duì)于每個(gè)點(diǎn)或頂點(diǎn)都有大量的計(jì)算, 包括裁剪運(yùn)算,決定任何給定的多邊形實(shí)際上是否可見(jiàn),在屏幕上完全不可見(jiàn)或部分可見(jiàn)。 光照運(yùn)算,計(jì)算紋理色彩明亮程度,這取決于世界的燈光從什么角度如何投射到頂點(diǎn)上。 過(guò)去,處理器處理這些計(jì)算,但現(xiàn)在,當(dāng)代圖形硬件就能為你做這些事情, 這意謂著你的處理器可以去做其他的事情了。很明顯這是件好事情 (tm) ,由于不能指望市面上所有的 3D 顯卡板上都有T & L, 所以無(wú)論如何你自己將必須寫所有的這些例程 (再一次從游戲開(kāi)發(fā)者角度來(lái)說(shuō))。 你將在本文各處的不同段落看到 "好事情 ( tm)" 這個(gè)詞匯。 我認(rèn)為,這些特征為使游戲看起來(lái)更好作出了非常有用的貢獻(xiàn)。 毫不令人吃驚,你也將會(huì)看見(jiàn)它的對(duì)立面;你猜到了,那就是“壞事情 (tm)”。 我正在嘗試爭(zhēng)取這些詞匯的版權(quán), 你要使用他們就得支付一筆小小的費(fèi)用喲。


            曲面片(高次表面)
              除了三角形,曲面片的使用現(xiàn)在正變得更普遍。 因?yàn)樗麄兡苡脭?shù)學(xué)表達(dá)式來(lái)描述幾何 ( 通常涉及某種曲線的幾何形體) ,而不僅僅只是列出大量的多邊形以及在游戲世界中的位置, 所以曲面片 ( 高次表面的另一個(gè)名稱) 非常好。 這樣,你實(shí)際上就能夠動(dòng)態(tài)地根據(jù)方程式來(lái)建立( 和變形 )多邊形網(wǎng)格, 并決定你實(shí)際想要從曲面片上看到的多邊形數(shù)量。 因此,舉例來(lái)說(shuō),你可以描述一個(gè)管道, 然后在世界中就可以有這種管道的許多樣例。 在一些房間中, 你已經(jīng)顯示了 10,000個(gè)多邊形,你可以說(shuō),"因?yàn)槲覀円呀?jīng)顯示了大量的多邊形,而且任何更多的多邊形將會(huì)使幀速率下降, 所以這個(gè)管道應(yīng)該只有 100 個(gè)多邊形"。 但在另外一個(gè)房間中, 視野中只有 5,000個(gè)可見(jiàn)的多邊形,你可以說(shuō),"因?yàn)槲覀冞€沒(méi)有達(dá)到預(yù)算可以顯示的多邊形數(shù)量 , 所以,現(xiàn)在這個(gè)管道能有 500 個(gè)多邊形"。 非常美妙的東西 --但你必須首先知道所有這些,并建立網(wǎng)格,這不是無(wú)足輕重的。 通過(guò) AGP 傳送同一個(gè)對(duì)象的曲面方程確實(shí)要比傳送其大量頂點(diǎn)節(jié)省成本。 SOF2 就使用了這個(gè)方法的一種變體來(lái)建立它的地表系統(tǒng)。

              事實(shí)上現(xiàn)在的 ATI 顯卡具有 TruForm, 它能帶一個(gè)以三角形為基礎(chǔ)的模型,并將該模型轉(zhuǎn)換為基于高次表面的模型,使其平滑 — 接著再用十倍三角形數(shù)量把模型轉(zhuǎn)換回基于大量三角形的模型 (被稱為retesselation)。然后模型送往管線做進(jìn)一步的處理。 實(shí)際上 ATI 僅僅在 T & L 引擎之前增加了一個(gè)階段來(lái)處理這個(gè)過(guò)程。這里的缺點(diǎn)是,要控制哪些模型需要被平滑處理而哪些又不需要。你常常想要一些邊緣比較尖銳, 比如鼻子,但它卻被不恰當(dāng)?shù)钠交^(guò)了。 這仍然是一種很好的技術(shù),而且我能預(yù)見(jiàn)它在將來(lái)會(huì)被更多的應(yīng)用。

              這就是第一部份 -- 我們將會(huì)在第二部分繼續(xù)介紹光照和紋理,下面的章節(jié)會(huì)更加深入。












            第2部份: 3D環(huán)境的光照和紋理


            世界的燈光
              在變換過(guò)程中, 通常是在稱為觀察空間的坐標(biāo)空間中, 我們遇到了最重要的運(yùn)算之一: 光照計(jì)算。 它是一種這樣的事情, 當(dāng)它工作時(shí),你不關(guān)注它,但當(dāng)它不工作時(shí), 你就非常關(guān)注它了。有很多不同的光照方法,從簡(jiǎn)單的計(jì)算多邊形對(duì)于燈光的朝向,并根據(jù)燈光到多邊形的方向和距離加上燈光顏色的百分比值,一直到產(chǎn)生邊緣平滑的燈光貼圖疊加基本紋理。而且一些 API 實(shí)際上提供預(yù)先建造的光照方法。舉例來(lái)說(shuō),OpenGL 提供了每多邊形,每頂點(diǎn),和每像素的光照計(jì)算。

              在頂點(diǎn)光照中,你要決定一個(gè)頂點(diǎn)被多少個(gè)多邊形共享,并計(jì)算出共享該頂點(diǎn)的所有多邊形法向量的均值(稱為法向量),并將該法向量賦頂點(diǎn)。一個(gè)給定多邊形的每個(gè)頂點(diǎn)會(huì)有不同的法向量,所以你需要漸變或插值多邊形頂點(diǎn)的光照顏色以便得到平滑的光照效果。 你沒(méi)有必要用這種光照方式查看每個(gè)單獨(dú)的多邊形。 這種方式的優(yōu)點(diǎn)是時(shí)常可以使用硬件轉(zhuǎn)換與光照(T & L)來(lái)幫助快速完成。 不足之處是它不能產(chǎn)生陰影。 舉例來(lái)說(shuō),即使燈光是在模型的右側(cè),左手臂應(yīng)該在被身體投影的陰影中,而實(shí)際上模型的雙臂卻以同樣的方式被照明了。

              這些簡(jiǎn)單的方法使用著色來(lái)達(dá)到它們的目標(biāo)。 當(dāng)用平面光照繪制一個(gè)多邊形時(shí), 你讓渲染(繪制)引擎把整個(gè)多邊形都著上一種指定的顏色。這叫做平面著色光照。 (該方法中,多邊形均對(duì)應(yīng)一個(gè)光強(qiáng)度,表面上所有點(diǎn)都用相同的強(qiáng)度值顯示,渲染繪制時(shí)得到一種平面效果,多邊形的邊緣不能精確的顯示出來(lái)) 。

              對(duì)于頂點(diǎn)著色 ( Gouraud 著色) ,你讓渲染引擎給每個(gè)頂點(diǎn)賦予特定的顏色。 在繪制多邊形上各點(diǎn)投影所對(duì)應(yīng)的像素時(shí),根據(jù)它們與各頂點(diǎn)的距離,對(duì)這些頂點(diǎn)的顏色進(jìn)行插值計(jì)算。 (實(shí)際上Quake III 模型使用的就是這種方法, 效果好的令人驚奇)。

              還有就是 Phong 著色。如同 Gouraud 著色,通過(guò)紋理工作,但不對(duì)每個(gè)頂點(diǎn)顏色進(jìn)行插值決定像素顏色值, 它對(duì)每個(gè)頂點(diǎn)的法向量進(jìn)行插值,會(huì)為每個(gè)頂點(diǎn)投影的像素做相同的工作。對(duì)于 Gouraud 著色,你需要知道哪些光投射在每個(gè)頂點(diǎn)上。對(duì)于 Phong 著色,你對(duì)每個(gè)像素也要知道這么多。

              一點(diǎn)也不令人驚訝, Phong 著色可以得到更加平滑的效果,因?yàn)槊總€(gè)像素都需要進(jìn)行光照計(jì)算,其繪制非常耗費(fèi)時(shí)間。平面光照處理方法很快速, 但比較粗糙。Phong 著色比 Gouraud 著色計(jì)算更昂貴,但效果最好,可以達(dá)到鏡面高光效果("高亮")。 這些都需要你在游戲開(kāi)發(fā)中折衷權(quán)衡。


            不同的燈光
              接著是生成照明映射,你用第二個(gè)紋理映射(照明映射)與已有的紋理混合來(lái)產(chǎn)生照明效果。這樣工作得很好, 但這本質(zhì)上是在渲染之前預(yù)先生成的一種罐裝效果。如果你使用動(dòng)態(tài)照明 (即,燈光移動(dòng), 或者沒(méi)有程序的干預(yù)而打開(kāi)和關(guān)閉),你得必須在每一幀重新生成照明映射,按照動(dòng)態(tài)燈光的運(yùn)動(dòng)方式修改這些照明映射。燈光映射能夠快速的渲染,但對(duì)存儲(chǔ)這些燈光紋理所需的內(nèi)存消耗非常昂貴。你可以使用一些壓縮技巧使它們占用較少的的內(nèi)存空間,或減少其尺寸大小, 甚至使它們是單色的 (這樣做就不會(huì)有彩色燈光了),等等。 如果你確實(shí)在場(chǎng)景中有多個(gè)動(dòng)態(tài)燈光, 重新生成照明映射將以昂貴的CPU周期而告終。

              許多游戲通常使用某種混合照明方式。 以Quake III為例,場(chǎng)景使用照明映射, 動(dòng)畫模型使用頂點(diǎn)照明。 預(yù)先處理的燈光不會(huì)對(duì)動(dòng)畫模型產(chǎn)生正確的效果 -- 整個(gè)多邊形模型得到燈光的全部光照值 -- 而動(dòng)態(tài)照明將被用來(lái)產(chǎn)生正確的效果。 使用混合照明方式是多數(shù)的人們沒(méi)有注意到的一個(gè)折衷,它通常讓效果看起來(lái)"正確"。 這就是游戲的全部 – 做一切必要的工作讓效果看起來(lái)"正確",但不必真的是正確的。

              當(dāng)然,所有這些在新的Doom引擎里面都不復(fù)存在了,但要看到所有的效果,至少需要 1GHZ CPU 和 GeForce 2 顯卡。是進(jìn)步了,但一切都是有代價(jià)的。

              一旦場(chǎng)景經(jīng)過(guò)轉(zhuǎn)換和照明, 我們就進(jìn)行裁剪運(yùn)算。 不進(jìn)入血淋淋的細(xì)節(jié)而,剪斷運(yùn)算決定哪些三角形完全在場(chǎng)景 (被稱為觀察平截頭體) 之內(nèi)或部份地在場(chǎng)景之內(nèi)。完全在場(chǎng)景之內(nèi)的三角形被稱為細(xì)節(jié)接受,它們被處理。對(duì)于只是部分在場(chǎng)景之內(nèi)的三角形, 位于平截頭體外面的部分將被裁剪掉,余下位于平截頭體內(nèi)部的多邊形部分將需要重新閉合,以便其完全位于可見(jiàn)場(chǎng)景之內(nèi)。 (更多的細(xì)節(jié)請(qǐng)參考我們的 3D 流水線指導(dǎo)一文)。

              場(chǎng)景經(jīng)過(guò)裁剪以后,流水線中的下一個(gè)階段就是三角形生成階段(也叫做掃描 線轉(zhuǎn)換),場(chǎng)景被映射到2D 屏幕坐標(biāo)。到這里,就是渲染(繪制)運(yùn)算了。


            紋理與MIP映射
              紋理在使3D場(chǎng)景看起來(lái)真實(shí)方面異常重要,它們是你應(yīng)用到場(chǎng)景區(qū)域或?qū)ο蟮囊恍┓纸獬啥噙呅蔚男D片。多重紋理耗費(fèi)大量的內(nèi)存,有不同的技術(shù)來(lái)幫助管理它們的尺寸大小。紋理壓縮是在保持圖片信息的情況下,讓紋理數(shù)據(jù)更小的一種方法。紋理壓縮占用較少的游戲CD空間,更重要的是,占用較少內(nèi)存和3D 顯卡存儲(chǔ)空間。另外,在你第一次要求顯卡顯示紋理的時(shí)候,壓縮的(較小的) 版本經(jīng)過(guò) AGP 接口從 PC 主存送到3D 顯卡, 會(huì)更快一些。紋理壓縮是件好事情。 在下面我們將會(huì)更多的討論紋理壓縮。


            MIP 映射(多紋理映射)
              游戲引擎用來(lái)減少紋理內(nèi)存和帶寬需求的另外一個(gè)技術(shù)就是 MIP 映射。 MIP 映射技術(shù)通過(guò)預(yù)先處理紋理,產(chǎn)生它的多個(gè)拷貝紋理,每個(gè)相繼的拷貝是上一個(gè)拷貝的一半大小。為什么要這樣做?要回答這個(gè)問(wèn)題,你需要了解 3D 顯卡是如何顯示紋理的。最壞情況,你選擇一個(gè)紋理,貼到一個(gè)多邊形上,然后輸出到屏幕。我們說(shuō)這是一對(duì)一的關(guān)系,最初紋理映射圖的一個(gè)紋素 (紋理元素) 對(duì)應(yīng)到紋理映射對(duì)象多邊形的一個(gè)像素。如果你顯示的多邊形被縮小一半,紋理的紋素就每間隔一個(gè)被顯示。這樣通常沒(méi)有什么問(wèn)題 -- 但在某些情況下會(huì)導(dǎo)致一些視覺(jué)上的怪異現(xiàn)象。讓我們看看磚塊墻壁。 假設(shè)最初的紋理是一面磚墻,有許多磚塊,磚塊之間的泥漿寬度只有一個(gè)像素。如果你把多邊形縮小一半, 紋素只是每間隔一個(gè)被應(yīng)用,這時(shí)候,所有的泥漿會(huì)突然消失,因?yàn)樗鼈儽豢s掉了。你只會(huì)看到一些奇怪的圖像。

              使用 MIP 映射,你可以在顯示卡應(yīng)用紋理之前,自己縮放圖像,因?yàn)榭梢灶A(yù)先處理紋理,你做得更好一些,讓泥漿不被縮掉。當(dāng) 3D 顯卡用紋理繪制多邊形時(shí),它檢測(cè)到縮放因子,說(shuō),"你知道,我要使用小一些的紋理,而不是縮小最大的紋理,這樣看起來(lái)會(huì)更好一些。" 在這里, MIP 映射為了一切,一切也為了 MIP 映射。


            多重紋理與凹凸映射
              單一紋理映射給整個(gè)3D 真實(shí)感圖形帶來(lái)很大的不同, 但使用多重紋理甚至可以達(dá)到一些更加令人難忘的效果。過(guò)去這一直需要多遍渲染(繪制),嚴(yán)重影響了像素填充率。 但許多具有多流水線的3D 加速卡,如ATI's Radeon 和 nVidia's GeForce 2及更高級(jí)的顯卡,多重紋理可以在一遍渲染(繪制)過(guò)程中完成。 產(chǎn)生多重紋理效果時(shí), 你先用一個(gè)紋理繪制多邊形,然后再用另外一個(gè)紋理透明地繪制在多邊形上面。這讓你可以使紋理看上去在移動(dòng),或脈動(dòng), 甚至產(chǎn)生陰影效果 (我們?cè)谡彰饕还?jié)中描述過(guò))。繪制第一個(gè)紋理映射,然后在上面繪制帶透明的全黑紋理,引起一種是所有的織法黑色的但是有一個(gè)透明分層堆積過(guò)它的頂端 , 這就是 -- 即時(shí)陰影。 該技術(shù)被稱為照明映射 ( 有時(shí)也稱為 暗映射),直至新的Doom ,一直是Id引擎里關(guān)卡照明的傳統(tǒng)方法。

              凹凸貼圖是最近涌現(xiàn)出來(lái)的一種古老技術(shù)。幾年以前 Matrox 第一個(gè)在流行的 3D 游戲中發(fā)起使用各種不同形式的凹凸貼圖。就是生成紋理來(lái)表現(xiàn)燈光在表面的投射,表現(xiàn)表面的凹凸或表面的裂縫。 凹凸貼圖并不隨著燈光一起移動(dòng) -- 它被設(shè)計(jì)用來(lái)表現(xiàn)一個(gè)表面上的細(xì)小瑕疵,而不是大的凹凸。 比如說(shuō),在飛行模擬器中,你可以使用凹凸貼圖來(lái)產(chǎn)生像是隨機(jī)的地表細(xì)節(jié),而不是重復(fù)地使用相同的紋理,看上去一點(diǎn)趣味也沒(méi)有。

              凹凸貼圖產(chǎn)生相當(dāng)明顯的表面細(xì)節(jié),盡管是很高明的戲法,但嚴(yán)格意義上講,凹凸貼圖并不隨著你的觀察角度而變化。比較新的 ATI 和 nVidia 顯卡片能執(zhí)行每像素運(yùn)算,這種缺省觀察角度的不足就真的不再是有力而快速的法則了。 無(wú)論是哪一種方法, 到目前為止,沒(méi)有游戲開(kāi)發(fā)者太多的使用; 更多的游戲能夠且應(yīng)該使用凹凸貼圖。


            高速緩存抖動(dòng) = 糟糕的事物
              紋理高速緩存的管理游戲引擎的速度至關(guān)重要。 和任何高速緩存一樣,緩存命中很好,而不命中將很糟糕。如果遇到紋理在圖形顯示卡內(nèi)存被頻繁地?fù)Q入換出的情況,這就是紋理高速緩存抖動(dòng)。發(fā)生這種情況時(shí),通常API將會(huì)廢棄每個(gè)紋理,結(jié)果是所有的紋理在下一幀將被重新加載,這非常耗時(shí)和浪費(fèi)。對(duì)游戲玩家來(lái)說(shuō),當(dāng)API重新加載紋理高速緩存時(shí),會(huì)導(dǎo)致幀速率遲鈍。

              在紋理高速緩存管理中,有各種不同的技術(shù)將紋理高速緩存抖動(dòng)減到最少 – 這是確保任何 3D 游戲引擎速度的一個(gè)決定性因素。 紋理管理是件好事情 – 這意味著只要求顯卡使用紋理一次,而不是重復(fù)使用。這聽(tīng)起來(lái)有點(diǎn)自相矛盾,但效果是它意謂著對(duì)顯卡說(shuō),"看, 所有這些多邊形全部使用這一個(gè)紋理,我們能夠僅僅加載這個(gè)紋理一次而不是許多次嗎?" 這阻止API ( 或圖形驅(qū)動(dòng)軟件) 上傳多次向顯卡加載紋理。象OpenGL這樣的API實(shí)際上通常處理紋理高速緩存管理,意謂著,根據(jù)一些規(guī)則,比如紋理存取的頻率,API決定哪些紋理儲(chǔ)存在顯卡上,哪些紋理存儲(chǔ)在主存。 真正的問(wèn)題來(lái)了:a) 你時(shí)常無(wú)法知道API正在使用的準(zhǔn)確規(guī)則。 b)你時(shí)常要求在一幀中繪制更多的紋理,以致超出了顯卡內(nèi)存空間所能容納的紋理。

              另外一種紋理高速緩存管理技術(shù)是我們?cè)缦扔懻摰募y理壓縮。很象聲音波形文件被壓縮成 MP3 文件,盡管無(wú)法達(dá)到那樣的壓縮比率,但紋理可以被壓縮。 從聲音波形文件到MP3的壓縮可以達(dá)到 11:1的壓縮比率,而絕大多數(shù)硬件支持的紋理壓縮運(yùn)算法則只有 4:1 的壓縮比率,盡管如此,這樣能產(chǎn)生很大的差別。 除此之外,在渲染(繪制)過(guò)程中,只有在需要時(shí),硬件才動(dòng)態(tài)地對(duì)紋理進(jìn)行解壓縮。這一點(diǎn)非常棒,我們僅僅擦除即將可能用到的表面。

              如上所述,另外一種技術(shù)確保渲染器要求顯卡對(duì)每個(gè)紋理只繪制一次。確定你想要渲染(繪制)的使用相同紋理的所有多邊形同時(shí)送到顯卡,而不是一個(gè)模型在這里,另一個(gè)模型在那里,然后又回到最初的紋理論。僅僅繪制一次,你也就通過(guò)AGP接口傳送一次。Quake III 在其陰影系統(tǒng)就是這么做的。處理多邊形時(shí),把它們加入到一個(gè)內(nèi)部的陰影列表,一旦所有的多邊形處理完畢,渲染器遍歷紋理列表,就將紋理及所有使用這些紋理的多邊形同時(shí)傳送出去。

              上述過(guò)程在使用顯卡的硬件 T & L(如果支持的話)時(shí),并不怎么有效。你面臨的結(jié)局是,滿屏幕都是使用相同紋理的大量的多邊形小群組,所有多邊形都使用不同的變換矩陣。這意謂著更多的時(shí)間花在建立顯卡的硬件 T & L 引擎 ,更多的時(shí)間被浪費(fèi)了。 無(wú)論如何,因?yàn)樗麄冇兄趯?duì)整個(gè)模型使用統(tǒng)一的紋理,所以它對(duì)實(shí)際屏幕上的模型可以有效地工作。但是因?yàn)樵S多多邊形傾向使用相同的墻壁紋理,所以對(duì)于世界場(chǎng)景的渲染,它常常就是地獄。通常它沒(méi)有這么嚴(yán)重,因?yàn)榇篌w而言,世界的紋理不會(huì)有那么大,這樣一來(lái)API的紋理緩存系統(tǒng)將會(huì)替你處理這些,并把紋理保留在顯卡以備再次使用。

              在游戲機(jī)上,通常沒(méi)有紋理高速緩存系統(tǒng)(除非你寫一個(gè))。在 PS2 上面,你最好是遠(yuǎn)離"一次紋理" 的方法。在 Xbox 上面, 這是不重要的,因?yàn)樗旧頉](méi)有圖形內(nèi)存(它是 UMA 體系結(jié)構(gòu)),且所有的紋理無(wú)論如何始終保留在主存之中。

              事實(shí)上,在今天的現(xiàn)代PC FPS 游戲中,試圖通過(guò)AGP接口傳送大量紋理是第二個(gè)最通常的瓶頸。最大的瓶頸是實(shí)際幾何處理,它要使東西出現(xiàn)在它應(yīng)該出現(xiàn)的地方。在如今的3D FPS 游戲中,最耗費(fèi)時(shí)間的工作,顯然是那些計(jì)算模型中每個(gè)頂點(diǎn)正確的世界位置的數(shù)學(xué)運(yùn)算。如果你不把場(chǎng)景的紋理保持在預(yù)算之內(nèi),僅居其次的就是通過(guò)AGP接口傳送大量的紋理了。然而,你確實(shí)有能力影響這些。 通過(guò)降低頂層的 MIP 級(jí)別(還記得系統(tǒng)在哪里不斷地為你細(xì)分紋理嗎?), 你就能夠把系統(tǒng)正在嘗試送到顯卡的紋理大小減少一半。你的視覺(jué)質(zhì)量會(huì)有所下降-- 尤其是在引人注目的電影片斷中--但是你的幀速率上升了。這種方式對(duì)網(wǎng)絡(luò)游戲尤其有幫助。實(shí)際上,Soldier of Fortune II和Jedi Knight II: Outcast這兩款游戲在設(shè)計(jì)時(shí)針對(duì)的顯卡還不是市場(chǎng)上的大眾主流顯卡。為了以最大大小觀看他們的紋理,你的3D 顯卡至少需要有128MB的內(nèi)存。這兩種產(chǎn)品在思想上都是給未來(lái)設(shè)計(jì)的。

              上面就是第 2 部份。在下面章節(jié)中,我們將介紹許多主題,包括內(nèi)存管理,霧效果,深度測(cè)試, 抗鋸齒,頂點(diǎn)著色,API等。










            第3部份: 內(nèi)存使用,特效和API


            關(guān)于內(nèi)存使用的思考
              讓我們想一想,在今天實(shí)際上是如何使用3D 顯卡內(nèi)存的以及在將來(lái)又會(huì)如何使用。 如今絕大多數(shù)3D顯卡處理32位像素顏色,8位紅色, 8位藍(lán)色,8 位綠色,和 8 位透明度。這些組合的紅,藍(lán)和綠256個(gè)色度,可以組成 16。7 百萬(wàn)種顏色-- 那是你我可以在一個(gè)監(jiān)視器上看見(jiàn)的所有顏色。

              那么,游戲設(shè)計(jì)大師John Carmack 為什么要求 64 位顏色分辨率呢? 如果我們看不出區(qū)別,又有什么意義呢? 意義是: 比如說(shuō), 有十幾個(gè)燈光照射模型上的點(diǎn),顏色顏色各不相同。 我們?nèi)∧P偷淖畛躅伾缓笥?jì)算一個(gè)燈光的照射,模型顏色值將改變。 然后我們計(jì)算另外的一個(gè)燈光, 模型顏色值進(jìn)一步改變。 這里的問(wèn)題是,因?yàn)轭伾抵挥?位,在計(jì)算了4個(gè)燈光之后,8位的顏色值將不足以給我們最后的顏色較好的分辨率和表現(xiàn)。分辨率的不足是由量化誤差導(dǎo)致的,本質(zhì)原因是由于位數(shù)不足引起的舍入誤差。

              你能很快地用盡位數(shù),而且同樣地,所有的顏色被清掉。每顏色16 或 32 位,你有一個(gè)更高分辨率,因此你能夠反復(fù)著色以適當(dāng)?shù)乇憩F(xiàn)最后的顏色。這樣的顏色深度很快就能消耗大量的存儲(chǔ)空間。我們也應(yīng)提到整個(gè)顯卡內(nèi)存與紋理內(nèi)存。這里所要說(shuō)的是,每個(gè)3D 顯卡實(shí)際只有有限的內(nèi)存,而這些內(nèi)存要存儲(chǔ)前端和后端緩沖區(qū),Z 緩沖區(qū),還有所有的令人驚奇的紋理。最初的 Voodoo1 顯卡只有2MB顯存,后來(lái) Riva TNT提高到16MB顯存。然后 GeForce 和 ATI Rage有32MB顯存, 現(xiàn)在一些 GeForce 2 到 4的顯卡和 Radeons 帶有 64MB 到128MB 的顯存。 這為什么重要? 好吧,讓我們看一些數(shù)字…

              比如你想讓你的游戲看起來(lái)最好,所以你想要讓它以32位屏幕, 1280x1024分辨率和32位 Z- 緩沖跑起來(lái)。 好,屏幕上每個(gè)像素4個(gè)字節(jié),外加每個(gè)像素4字節(jié)的Z-緩沖,因?yàn)槎际敲肯袼?2位。我們有1280x1024 個(gè)像素 – 也就是 1,310,720個(gè)像素。基于前端緩沖區(qū)和Z-緩沖區(qū)的字節(jié)數(shù),這個(gè)數(shù)字乘以8,是 10,485,760字節(jié)。包括一個(gè)后端緩沖區(qū),這樣是 1280x1024x12, 也就是 15,728,640 字節(jié), 或 15MB。 在一個(gè) 16MB 顯存的顯卡上,就只給我們剩下1MB 來(lái)存儲(chǔ)所有的紋理。 現(xiàn)在如果最初的紋理是真32 位或 4字節(jié)寬,那么我們每幀能在顯卡上存儲(chǔ) 1MB/4字節(jié)每像素 = 262,144個(gè)像素。這大約是4 個(gè) 256x256 的紋理頁(yè)面。

              很清楚,上述例子表明,舊的16MB 顯卡沒(méi)有現(xiàn)代游戲表現(xiàn)其絢麗畫面所需要的足夠內(nèi)存。很明顯,在它繪制畫面的時(shí)候,我們每幀都必須重新把紋理裝載到顯卡。實(shí)際上,設(shè)計(jì)AGP總線的目的就是完成這個(gè)任務(wù),不過(guò), AGP 還是要比 3D 掀卡的幀緩沖區(qū)慢,所以你會(huì)受到性能上的一些損失。很明顯,如果紋理由32位降低到16位,你就能夠通過(guò)AGP以較低的分辨率傳送兩倍數(shù)量的紋理。如果你的游戲以每個(gè)像素比較低的色彩分辨率跑, 那么就可以有更多的顯示內(nèi)存用來(lái)保存常用的紋理 (稱為高速緩存紋理) 。 但實(shí)際上你永遠(yuǎn)不可能預(yù)知使用者將如何設(shè)置他們的系統(tǒng)。如果他們有一個(gè)在高分辨率和顏色深度跑的顯卡,那么他們將會(huì)更可能那樣設(shè)定他們的顯卡。



              我們現(xiàn)在開(kāi)始講霧,它是某種視覺(jué)上的效果。如今絕大多數(shù)的引擎都能處理霧, 因?yàn)殪F非常方便地讓遠(yuǎn)處的世界淡出視野,所以當(dāng)模型和場(chǎng)景地理越過(guò)觀察體后平面進(jìn)入視覺(jué)范圍內(nèi)時(shí),你就不會(huì)看見(jiàn)它們突然從遠(yuǎn)處跳出來(lái)了。 也有一種稱為體霧的技術(shù)。這種霧不是隨物體離照相機(jī)的距離而定,它實(shí)際上是一個(gè)你能看見(jiàn)的真實(shí)對(duì)象,并且可以穿越它,從另外一側(cè)出去 -- 當(dāng)你在穿越對(duì)象的時(shí)候,視覺(jué)上霧的可見(jiàn)程度隨著變化。想象一下穿過(guò)云團(tuán) -- 這是體霧的一個(gè)完美例子。體霧的一些好的實(shí)現(xiàn)例子是Quake III一些關(guān)卡中的紅色霧,或新的Rogue Squadron II 之 Lucas Arts的 GameCube 版本。其中有一些是我曾經(jīng)見(jiàn)過(guò)的最好的云--大約與你能看見(jiàn)的一樣真實(shí)。

              在我們討論霧化的時(shí)候,可能是簡(jiǎn)短介紹一下 Alpha 測(cè)試和紋理Alpha混合的好時(shí)機(jī)。當(dāng)渲染器往屏幕上畫一個(gè)特定像素時(shí),假定它已經(jīng)通過(guò) Z- 緩沖測(cè)試 (在下面定義),我們可能最后做一些Alpha測(cè)試。我們可能發(fā)現(xiàn)為了顯示像素后面的某些東西,像素需要透明繪制。這意味著我們必須取得像素的已有值,和我們新的像素值進(jìn)行混和,并把混合結(jié)果的像素值放回原處。這稱為讀-修改-寫操作,遠(yuǎn)比正常的像素寫操作費(fèi)時(shí)。

              你可以用不同類型的混合,這些不同的效果被稱為混合模式。直接Alpha混合只是把背景像素的一些百分比值加到新像素的相反百分比值上面。還有加法混合,將舊像素的一些百分比,和特定數(shù)量(而不是百分比)的新像素相加。 這樣效果會(huì)更加鮮明。 (Kyle's Lightsaber在 Jedi Knight II 中的效果)。

              每當(dāng)廠商提供新的顯卡時(shí),我們可以得到硬件支持的更新更復(fù)雜的混合模式,從而制作出更多更眩目的效果。GF3+4和最近的Radeon顯卡提供的像素操作,已經(jīng)到了極限。


            模板陰影與深度測(cè)試
              用模板產(chǎn)生陰影效果,事情就變得復(fù)雜而昂貴了。這里不討論太多細(xì)節(jié)(可以寫成一篇單獨(dú)的文章了),其思想是,從光源視角繪制模型視圖,然后用這個(gè)把多邊形紋理形狀產(chǎn)生或投射到受影響的物體表面。

              實(shí)際上你是在視野中投射將會(huì)“落”在其他多邊形上面的光體。最后你得到看似真實(shí)的光照,甚至帶有視角在里面。因?yàn)橐獎(jiǎng)討B(tài)創(chuàng)建紋理,并對(duì)同一場(chǎng)景進(jìn)行多遍繪制,所以這很昂貴。

              你能用眾多不同方法產(chǎn)生陰影,情形時(shí)常是這樣一來(lái),渲染質(zhì)量與產(chǎn)生效果所需要的渲染工作成比例。有所謂的硬陰影或軟陰影之分,而后者較好,因?yàn)樗鼈兏訙?zhǔn)確地模仿陰影通常在真實(shí)世界的行為。 通常有一些被游戲開(kāi)發(fā)者偏愛(ài)的“足夠好”的方法。如要更多的了解陰影,請(qǐng)參考 Dave Salvator的 3D 流水線一文。


            深度測(cè)試
              現(xiàn)在我們開(kāi)始討論深度測(cè)試, 深度測(cè)試丟棄隱藏的像素,過(guò)度繪制開(kāi)始起作用。過(guò)度繪制非常簡(jiǎn)單 – 在一幀中,你數(shù)次繪制一個(gè)像素位置。它以3D場(chǎng)景中Z(深度)方向上存在的元素?cái)?shù)量為基礎(chǔ),也被稱為深度復(fù)雜度。如果你常常太多的過(guò)度繪制, -- 舉例來(lái)說(shuō), 符咒的眩目視覺(jué)特效,就象Heretic II,能讓你的幀速率變得很糟糕。當(dāng)屏幕上的一些人們彼此施放符咒時(shí),Heretic II設(shè)計(jì)的一些最初效果造成的情形是,他們?cè)谝粠袑?duì)屏幕上每個(gè)相同的像素畫了40次! 不用說(shuō),這必須調(diào)整,尤其是軟件渲染器,除了將游戲降低到象是滑雪表演外,它根本不能處理這樣的負(fù)荷。深度測(cè)試是一種用來(lái)決定在相同的像素位置上哪些對(duì)象在其它對(duì)象前面的技術(shù),這樣我們就能夠避免繪制那些隱藏的對(duì)象。

              看著場(chǎng)景并想想你所看不見(jiàn)的。 換句話說(shuō),是什么在其他場(chǎng)景對(duì)象前面,或者隱藏了其他場(chǎng)景對(duì)象? 是深度測(cè)試作出的這個(gè)決定。

              我將進(jìn)一步解釋深度深度如何幫助提高幀速率。想像一個(gè)很瑣細(xì)的場(chǎng)景,大量的多邊形 (或像素)位于彼此的后面,在渲染器獲得他們之間沒(méi)有一個(gè)快速的方法丟棄他們。對(duì)非Alpha混合的多邊形分類排序( 在Z- 方向上),首先渲染離你最近的那些多邊形,優(yōu)先使用距離最近的像素填充屏幕。所以當(dāng)你要渲染它們后面的像素(由Z或者深度測(cè)試決定)時(shí),這些像素很快被丟棄,從而避免了混合步驟并節(jié)省了時(shí)間。如果你從后到前繪制,所有隱藏的對(duì)象將被完全繪制,然后又被其他對(duì)象完全重寫覆蓋。場(chǎng)景越復(fù)雜,這種情況就越糟糕,所以深度測(cè)試是個(gè)好東西。


            抗鋸齒
              讓我們快速的看一下抗鋸齒。當(dāng)渲染單個(gè)多邊形時(shí),3D 顯卡仔細(xì)檢查已經(jīng)渲染的,并對(duì)新的多邊形的邊緣進(jìn)行柔化,這樣你就不會(huì)得到明顯可見(jiàn)的鋸齒形的像素邊緣。兩種技術(shù)方法之一通常被用來(lái)處理。 第一種方法是單個(gè)多邊形層次,需要你從視野后面到前面渲染多邊形,這樣每個(gè)多邊形都能和它后面的進(jìn)行適當(dāng)?shù)幕旌稀H绻话葱蜻M(jìn)行渲染,最后你會(huì)看見(jiàn)各種奇怪的效果。在第二種方法中,使用比實(shí)際顯示更大的分辯率來(lái)渲染整幅幀畫面,然后在你縮小圖像時(shí),尖銳的鋸齒形邊緣就混合消失了。這第二種方法的結(jié)果不錯(cuò),但因?yàn)轱@卡需要渲染比實(shí)際結(jié)果幀更多的像素,所以需要大量的內(nèi)存資源和很高的內(nèi)存帶寬。

              多數(shù)新的顯卡能很好地處理這些,但仍然有多種抗鋸齒模式可以供你選擇,因此你可以在性能和質(zhì)量之間作出折衷。對(duì)於當(dāng)今流行的各種不同抗鋸齒技術(shù)的更詳細(xì)討論請(qǐng)參見(jiàn)Dave Salvator 的3D 流水線一文。


            頂點(diǎn)與像素著色
              在結(jié)束討論渲染技術(shù)之前,我們快速的說(shuō)一下頂點(diǎn)和像素著色,最近它們正引起很多關(guān)注。頂點(diǎn)著色是一種直接使用顯卡硬件特征的方式,不使用API。舉例來(lái)說(shuō),如果顯卡支持硬件 T & L ,你可以用DirectX或OpenGL編程,并希望你的頂點(diǎn)通過(guò) T & L 單元 (因?yàn)檫@完全由驅(qū)動(dòng)程序處理,所以沒(méi)有辦法確信),或者你直接利用顯卡硬件使用頂點(diǎn)著色。它們?cè)试S你根據(jù)顯卡自身特征進(jìn)行特別編碼,你自己特殊的編碼使用T & L 引擎,以及為了發(fā)揮你的最大優(yōu)勢(shì),顯卡必須提供的其他別的特征。 事實(shí)上,現(xiàn)在nVidia 和ATI 在他們大量的顯卡上都提供了這個(gè)特征。

              不幸的是,顯卡之間表示頂點(diǎn)著色的方法并不一致。你不能象使用DirectX或者OpenGL 那樣,為頂點(diǎn)著色編寫一次代碼就可以在任何顯卡上運(yùn)行,這可是個(gè)壞消息。然而,因?yàn)槟阒苯雍惋@卡硬件交流,它為快速渲染頂點(diǎn)著色可能生成的效果提供最大的承諾。( 如同創(chuàng)造很不錯(cuò)的特效 -- 你能夠使用頂點(diǎn)著色以API沒(méi)有提供的方式影響事物)。事實(shí)上,頂點(diǎn)著色正在真的將3D 圖形顯示卡帶回到游戲機(jī)的編碼方式,直接存取硬件,最大限度利用系統(tǒng)的必須知識(shí),而不是依靠API來(lái)為你做一切。對(duì)一些程序員來(lái)說(shuō),會(huì)對(duì)這種編碼方式感到吃驚,但這是進(jìn)步代價(jià)。

              進(jìn)一步闡述,頂點(diǎn)著色是一些在頂點(diǎn)被送到顯卡渲染之前計(jì)算和運(yùn)行頂點(diǎn)效果程序或者例程。你可以在主CPU上面用軟件來(lái)做這些事情,或者使用顯卡上的頂點(diǎn)著色。 為動(dòng)畫模型變換網(wǎng)格是頂點(diǎn)程序的主選。

              像素著色是那些你寫的例程,當(dāng)繪制紋理時(shí),這些例程就逐個(gè)像素被執(zhí)行。你有效地用這些新的例程推翻了顯卡硬件正常情況做的混合模式運(yùn)算。這允許你做一些很不錯(cuò)的像素效果, 比如,使遠(yuǎn)處的紋理模糊,添加炮火煙霧, 產(chǎn)生水中的反射效果等。一旦 ATI 和 nVidia 能實(shí)際上就像素著色版本達(dá)成一致( DX9's 新的高級(jí)陰影語(yǔ)言將會(huì)幫助促進(jìn)這一目標(biāo)), 我一點(diǎn)不驚訝DirectX 和OpenGL采用Glide的方式-- 有幫助開(kāi)始, 但最終不是把任何顯卡發(fā)揮到極限的最好方法。我認(rèn)為我會(huì)有興趣觀望將來(lái)。


            最后(In Closing...)
              最終,渲染器是游戲程序員最受評(píng)判的地方。在這個(gè)行業(yè),視覺(jué)上的華麗非常重要,因此它為知道你正在做的買單。對(duì)于渲染器程序員,最壞的因素之一就是3D 顯卡工業(yè)界變化的速度。一天,你正在嘗試使透明圖像正確地工作;第二天 nVidia 正在做頂點(diǎn)著色編程的展示。而且發(fā)展非常快,大致上,四年以前為那個(gè)時(shí)代的 3D 顯卡寫的代碼現(xiàn)在已經(jīng)過(guò)時(shí)了,需要全部重寫。 甚至John Carmack 這樣描述過(guò),他知道四年以前為充分發(fā)揮那個(gè)時(shí)期顯卡的性能所寫的不錯(cuò)的代碼,如今很平凡 -- 因此他產(chǎn)生了為每個(gè)新的id項(xiàng)目完全重寫渲染器的欲望。Epic 的Tim Sweeney贊同 -- 這里是去年他給我的評(píng)論:

              我們已經(jīng)足足花費(fèi)了9個(gè)月時(shí)間來(lái)更換所有的渲染代碼。最初的 Unreal 被設(shè)計(jì)為軟件渲染和后來(lái)擴(kuò)展為硬件渲染。下一代引擎被設(shè)計(jì)為 GeForce 及更好的圖形顯示卡,且多邊形吞吐量是Unreal Tournament的100倍。

              這需要全部替換渲染器。很幸運(yùn),該引擎模塊化程度足夠好,我們可以保持引擎的其余部分—編輯器,物理學(xué),人工智能,網(wǎng)絡(luò)--不改動(dòng),盡管我們一直在以許多方式改進(jìn)這些部分。

              搭配長(zhǎng)篇文章的短篇報(bào)導(dǎo)(Sidebar):API -- 祝福和詛咒
              那么什么是API? 它是應(yīng)用程序編程接口,將不一致的后端用一致的前端呈現(xiàn)出來(lái)。舉例來(lái)說(shuō),很大程度上每種3D顯示卡的3D實(shí)現(xiàn)方式都有所差別。然而,他們?nèi)慷汲尸F(xiàn)一個(gè)一致的前端給最終使用者或者程序員,所以他們知道他們?yōu)閄 3D顯示卡寫的代碼將會(huì)在Y 3D顯示卡上面有相同的結(jié)果。好吧,不管怎樣理論上是那樣。 大約在三年以前這可能是相當(dāng)真實(shí)的陳述,但自那以后,在nVidia 公司的引領(lǐng)下,3D顯卡行業(yè)的事情發(fā)生了變化。

              如今在PC領(lǐng)域,除非你正計(jì)劃建造自己的軟件光柵引擎,使用CPU來(lái)繪制你所有的精靈,多邊形和粒子 -- 而且人們?nèi)匀辉谶@樣做。跟Unreal一樣,Age of Empires II: Age of Kings有一個(gè)優(yōu)秀的軟件渲染器 – 否則你將使用兩種可能的圖形API,OpenGL或者 DirectX 之一。OpenGL是一種真正的跨平臺(tái)API (使用這種API寫的軟件可以在Linux,Windows和MacOS上運(yùn)行。), 而且有多年的歷史了,為人所熟知,但也開(kāi)始慢慢地顯示出它的古老。 大約在四年以前,定義OpenGL驅(qū)動(dòng)特征集一直是所有顯示卡廠商工作的方向。

              然而,一旦在目標(biāo)達(dá)成以后,沒(méi)有預(yù)先制定特征工作方向的路線圖,這時(shí)候,所有的顯卡開(kāi)發(fā)商開(kāi)始在特征集上分道揚(yáng)鑣,使用OpenGL擴(kuò)展。

              3dfx 創(chuàng)造了T- 緩沖。 nVidia 努力尋求硬件變換和光照計(jì)算。Matrox努力獲取凹凸貼圖。等等。 我以前說(shuō)過(guò)的一句話,"過(guò)去幾年以來(lái),3D顯示卡領(lǐng)域的事情發(fā)生了變化。"委婉地說(shuō)明了這一切。

              無(wú)論如何,另一個(gè)可以選擇的API是 DirectX。這受Microsoft公司控制,且在PC 和 Xbox 上被完美地支持。由于明顯的原因,DirectX 沒(méi)有Apple或者 Linux 版本。因?yàn)镸icrosoft控制著 DirectX,大體上它容易更好地集成在Windows里面。

              OpenGL和DirectX之間的基本差別是前者由‘社區(qū)’擁有,而后者由Microsoft擁有。如果你想要 DirectX 為你的 3D 顯示卡支持一個(gè)新的特征,那么你需要游說(shuō)微軟,希望采納你的愿望,并等待新的 DirectX發(fā)行版本。對(duì)于OpenGL,由于顯示卡制造商為3D顯示卡提供驅(qū)動(dòng)程序,你能夠通過(guò)OpenGL擴(kuò)展立即獲得顯示卡的新特征。這是好,但作為游戲開(kāi)發(fā)者,當(dāng)你為游戲編碼的時(shí)候,你不能指望它們很普遍。它們可能讓你的游戲速度提升50%,但你不能要求別人有一塊GeForce 3 來(lái)跑你的游戲。好吧,你可以這么做,但如果你想來(lái)年還在這個(gè)行業(yè)的話,這是個(gè)相當(dāng)愚蠢的主意。

              這是對(duì)這個(gè)問(wèn)題極大的簡(jiǎn)單化,對(duì)我所有描述的也有各種例外情況,但這里一般的思想是很確實(shí)的。對(duì)于DirectX ,在任何既定時(shí)間你容易確切地知道你能從顯示卡獲得的特征,如果一個(gè)特征不能獲得,DirectX 將會(huì)用軟件模擬它(也不總是一件好事情,因?yàn)檫@樣有時(shí)侯非常的慢,但那是另外一回事)。對(duì)于OpenGL,你可以更加貼近顯示卡的特征,但代價(jià)是不能確定將會(huì)獲得的準(zhǔn)確特征。










            第4部份: 模型與動(dòng)畫,細(xì)節(jié)級(jí)別


            角色建模與動(dòng)畫
              你的角色模型在屏幕上看起來(lái)怎么樣,怎樣容易創(chuàng)建它們,紋理,以及動(dòng)畫對(duì)于現(xiàn)代游戲試圖完成的`消除不可信`因素來(lái)說(shuō)至關(guān)重要。角色模型系統(tǒng)逐漸變得復(fù)雜起來(lái), 包括較高的多邊形數(shù)量模型, 和讓模型在屏幕上移動(dòng)的更好方式。

              如今你需要一個(gè)骨骼模型系統(tǒng),有骨架和網(wǎng)格細(xì)節(jié)層次,單個(gè)頂點(diǎn)骨架的評(píng)估,骨架動(dòng)畫忽略,以及比賽中停留的角度忽略。而這些甚至還沒(méi)有開(kāi)始涉及一些你能做的很好的事情,像動(dòng)畫混合,骨架反向運(yùn)動(dòng)學(xué)(IK),和單個(gè)骨架限制,以及相片真實(shí)感的紋理。這個(gè)清單還能夠繼續(xù)列下去。但是真的,在用專業(yè)行話說(shuō)了所有這些以后,我們?cè)谶@里真正談?wù)摰氖鞘裁茨兀孔屛覀兛纯础?

              讓我們定義一個(gè)基于網(wǎng)格的系統(tǒng)和一個(gè)骨骼動(dòng)畫系統(tǒng)作為開(kāi)始。在基于網(wǎng)格的系統(tǒng),對(duì)于每一個(gè)動(dòng)畫幀,你要定義模型網(wǎng)格的每個(gè)點(diǎn)在世界中的位置。舉例來(lái)說(shuō),你有一個(gè)包含200 個(gè)多邊形的手的模型,有 300 個(gè)頂點(diǎn)(注意,在頂點(diǎn)和多邊形之間通常并不是3個(gè)對(duì)1個(gè)的關(guān)系,因?yàn)榇罅慷噙呅螘r(shí)常共享頂點(diǎn) – 使用條形和扇形,你能大幅減少頂點(diǎn)數(shù)量)。如果動(dòng)畫有 10 幀,那么你就需要在內(nèi)存中有300個(gè)頂點(diǎn)位置的數(shù)據(jù)。 總共有300 x 10 = 3000 頂點(diǎn),每個(gè)頂點(diǎn)由x,y,z和顏色/alpha信息組成。你能看見(jiàn)這個(gè)增長(zhǎng)起來(lái)是多么的快。Quake I,II和 III 都使用了這種系統(tǒng),這種系統(tǒng)確實(shí)有動(dòng)態(tài)變形網(wǎng)格的能力,比如使裙子擺動(dòng),或者讓頭發(fā)飄動(dòng)。

              相比之下,在骨骼動(dòng)畫系統(tǒng),網(wǎng)格是由骨架組成的骨骼( 骨架是你運(yùn)動(dòng)的對(duì)象)。 網(wǎng)格頂點(diǎn)和骨架本身相關(guān),所以它們?cè)谀P椭械奈恢枚际窍鄬?duì)于骨架,而不是網(wǎng)格代表每個(gè)頂點(diǎn)在世界中的位置。因此,如果你移動(dòng)骨架,組成多邊形的頂點(diǎn)的位置也相應(yīng)改變。這意謂著你只必須使骨骼運(yùn)動(dòng),典型情況大約有 50 個(gè)左右的骨架—很明顯極大地節(jié)省了內(nèi)存。


            骨骼動(dòng)畫附加的好處
              骨骼動(dòng)畫的另一個(gè)優(yōu)點(diǎn)是能夠根據(jù)影響頂點(diǎn)的一些骨架來(lái)分別“估價(jià)” 每個(gè)頂點(diǎn)。例如,雙臂的骨架運(yùn)動(dòng),肩,脖子而且甚至軀干都能在肩中影響網(wǎng)格。當(dāng)你移動(dòng)軀干的時(shí)候,網(wǎng)格就活像一個(gè)角色一樣移動(dòng)。總的效果是3D角色能夠?qū)崿F(xiàn)的動(dòng)畫更加流暢和可信,且需要更少的內(nèi)存。每個(gè)人都贏了。

              當(dāng)然這里的缺點(diǎn)是,如果你想要使有機(jī)的東西運(yùn)動(dòng)且很好,比如說(shuō)頭發(fā),或者披肩,為了讓它看起來(lái)自然,你最后不得不在里面放置數(shù)量驚人的骨架,這會(huì)抬高一些處理時(shí)間。

              基于骨骼的系統(tǒng)能帶給你的一些其他事情是‘忽略’特定層次骨架的能力 -- 說(shuō),"我不關(guān)心動(dòng)畫想要對(duì)這塊骨架所做的事情,我想要讓它指向世界中的一個(gè)特定點(diǎn)"。這很棒。你能讓模型著眼于世界中的事件,或者使他們的腳在他們站著的地面保持水平。這一切非常微妙,但它可以幫助帶給場(chǎng)景附加的真實(shí)感。

              在骨骼系統(tǒng),你甚至可以指定"我需要把這個(gè)特別的動(dòng)畫用於模型的腿,而一個(gè)不同的攜槍或射擊動(dòng)畫在模型軀干上播放,且那家伙(角色)叫喊的不同動(dòng)畫效果在模型的頭部播放"。非常妙。Ghoul2 ( 在Soldier of Fortune II: Double Helix and Jedi Knight I: Outcast中使用了Raven的動(dòng)畫系統(tǒng) ) 擁有所有這些好東西,且特別被設(shè)計(jì)為允許程序員使用所有這些忽略能力。這對(duì)動(dòng)畫的節(jié)省像你一樣難以相信。像你一樣的動(dòng)畫上的這次救援不相信. Raven有一個(gè)角色行走的動(dòng)畫和一個(gè)站立開(kāi)火的動(dòng)畫,并在它同時(shí)行走和開(kāi)火形下把這兩個(gè)動(dòng)畫合并,而不是需要一個(gè)動(dòng)畫表示角色行走并開(kāi)火。


            More Skeletons in the Closet
              先前描述的效果可以通過(guò)具有層次的骨骼系統(tǒng)來(lái)完成。這是什么意思呢?意思是每塊骨架實(shí)際上的位置相對(duì)于它的父親,而不是每個(gè)骨架直接位于空間中的地方。這意謂著如果你移動(dòng)父親骨架,那么它所有的子孫骨架也跟著移動(dòng),在代碼上不需要任何額外的努力。這是讓你能夠在任何骨架層次改變動(dòng)畫,而且通過(guò)骨骼其余部分向下傳遞的東西。

              創(chuàng)建一個(gè)沒(méi)有層次的骨骼系統(tǒng)是可能的 -- 但那時(shí)你不能忽略一個(gè)骨架并且預(yù)期它工作。你所看到的只是身體上的一個(gè)骨架開(kāi)始了新動(dòng)畫,除非你實(shí)現(xiàn)了某種‘向下傳遞信息’的系統(tǒng),否則在該骨架下面的其它骨架保持原來(lái)的動(dòng)畫。首先由一個(gè)層次系統(tǒng)開(kāi)始,你就自動(dòng)地獲得這些效果。

              許多今天的動(dòng)畫系統(tǒng)中正開(kāi)始出現(xiàn)一些比較新的特征,如動(dòng)畫混合,從一個(gè)正在播放的動(dòng)畫轉(zhuǎn)變到另外一個(gè)動(dòng)畫需要經(jīng)過(guò)一小段時(shí)間,而不是立即從一個(gè)動(dòng)畫突然轉(zhuǎn)變到另外一個(gè)。舉例來(lái)說(shuō),你有個(gè)角色在行走,然后他停了下來(lái)。你不是僅僅突然地轉(zhuǎn)變動(dòng)畫,讓他的腿和腳停在無(wú)效位置,而是一秒鐘混合一半,這樣腳似乎自然地移到了新的動(dòng)畫。不能夠過(guò)高的評(píng)價(jià)這種效果 -- 混合是一個(gè)微妙的事情,但如果正確的運(yùn)用,它真的有些差別。


            反向運(yùn)動(dòng)學(xué)
              反向運(yùn)動(dòng)學(xué) (IK) 是被許多人們丟棄的一個(gè)專業(yè)術(shù)語(yǔ),對(duì)它的真實(shí)含義沒(méi)有多少概念。IK 是如今游戲里面一個(gè)相對(duì)比較新的系統(tǒng)。使用 IK ,程序員能夠移動(dòng)一只手,或一條腿, 模型的其余關(guān)節(jié)自動(dòng)重新定位,因此模型被正確定向。而且有模型的關(guān)節(jié)新位置的其馀者他們自己,因此模型正確的被定向。比如,你將會(huì)說(shuō),"好,手 , 去拾起桌子上的那個(gè)杯子"并指出杯子在世界中的位置。手就會(huì)移動(dòng)到那里,且它后面的身體會(huì)調(diào)節(jié)其自身以便雙臂移動(dòng),身體適當(dāng)彎曲,等等。

              也有和IK相反的事情,叫做前向運(yùn)動(dòng)學(xué),本質(zhì)上與 IK 工作的次序相反。想像一只手,手附著在手臂上,手臂附著在身體上。現(xiàn)在想像你重重地?fù)糁辛松眢w。通常手臂像連迦般抽動(dòng),且手臂末梢的手隨之振動(dòng)。 IK 能夠移動(dòng)身體,并讓其余的四肢自己以真實(shí)的方式移動(dòng)。基本上它需要?jiǎng)赢嫀熢O(shè)定每種工作的大量信息 -- 像關(guān)節(jié)所能通過(guò)的運(yùn)動(dòng)范圍,如果一塊骨架前面的骨架移動(dòng),那么這塊骨架將移動(dòng)多少百分比,等等。

              和它現(xiàn)在一樣,盡管很好,它是一個(gè)很大的處理問(wèn)題,不用它你可以有不同的動(dòng)畫組合而脫身。值得注意的是,真正的 IK 解決辦法需要一個(gè)層次骨骼系統(tǒng)而不是一個(gè)模型空間系統(tǒng) -- 否則它們都耗時(shí)太多以致無(wú)法恰當(dāng)?shù)赜?jì)算每個(gè)骨架。


            LOD幾何系統(tǒng)
              最后,我們應(yīng)當(dāng)快速討論一下與縮放模型幾何復(fù)雜度相關(guān)的細(xì)節(jié)級(jí)別(LOD)系統(tǒng)(與討論MIP映射時(shí)使用的LOD相對(duì)照)。假定如今絕大多數(shù)PC游戲支持的處理器速度的巨大范圍,以及你可能渲染的任何給定可視場(chǎng)景的動(dòng)態(tài)性質(zhì)(在屏幕上有一個(gè)角色還是12個(gè)?), 你通常需要一些系統(tǒng)來(lái)處理這樣的情況,比如,當(dāng)系統(tǒng)接近極限試圖同時(shí)在屏幕上繪制出12個(gè)角色,每個(gè)角色有3,000個(gè)多邊形,并維持現(xiàn)實(shí)的幀速率。 LOD 被設(shè)計(jì)來(lái)協(xié)助這樣的情景中。最基本的情況,它是在任何給定時(shí)間動(dòng)態(tài)地改變你在屏幕上繪制的角色的多邊形數(shù)量的能力。面對(duì)現(xiàn)實(shí)吧,當(dāng)一個(gè)角色走遠(yuǎn),也許只有十個(gè)屏幕像素高度,你真的不需要3000個(gè)多邊形來(lái)渲染這個(gè)角色 -- 或許300個(gè)就夠了,而且你很難分辨出差別。

              一些 LOD 系統(tǒng)將會(huì)需要你建立模型的多個(gè)版本,而且他們將會(huì)依靠模型離觀察者的接近程度來(lái)改變屏幕上的LOD級(jí)別, 以及多少個(gè)多邊形正被同時(shí)顯示。更加復(fù)雜的系統(tǒng)實(shí)際上將會(huì)動(dòng)態(tài)地減少屏幕上的多邊形數(shù)量,在任何給定時(shí)間,任何給定的角色,動(dòng)態(tài)地 -- Messiah和Sacrifice包括了這種風(fēng)格的技術(shù),盡管在CPU方面并不便宜。你必須確信,與首先簡(jiǎn)單地渲染整個(gè)事物相比,你的 LOD 系統(tǒng)沒(méi)有花較多的時(shí)間計(jì)算出要渲染那些多邊形(或不渲染)。 任一方式都將會(huì)工作,由于如今我們?cè)噲D要在屏幕上繪制的多邊形數(shù)量,這是件非常必要的事情。注意, DX9 將會(huì)支持硬件執(zhí)行的自適應(yīng)幾何縮放(tessellation)。

              歸結(jié)起來(lái)是,得到一個(gè)運(yùn)動(dòng)流暢,其表現(xiàn)和移動(dòng)在視覺(jué)上可信,屏幕上看起來(lái)逼真的模型。流暢的動(dòng)畫時(shí)常是通過(guò)手工建造動(dòng)畫和運(yùn)動(dòng)捕捉動(dòng)畫的組合得到。有時(shí)你僅僅手工建立了一個(gè)給定的動(dòng)畫 -- 當(dāng)你在為一個(gè)模型做一些你在現(xiàn)實(shí)生活中不能做到的事情的動(dòng)畫時(shí), 你傾向于這樣做 -- 舉例來(lái)說(shuō),你確實(shí)不能向后彎腰,或像Mortal Kombat 4中的Lui Kang那樣在行進(jìn)的腳踏車上踢腿,通常運(yùn)動(dòng)捕捉這時(shí)候就出局了! 通常運(yùn)動(dòng)捕捉動(dòng)畫 -- 實(shí)際上視頻捕捉活生生的演員貫穿于你想在屏幕上所看到的動(dòng)畫 -- 是得到逼真的東西的方式。真實(shí)感的東西能使一款普通游戲看起來(lái)很棒,而且能掩飾許多事情。比如 NFL Blitz,屏幕上的模型大約有 200 個(gè)多邊形。它們?cè)陟o止站立時(shí)看起來(lái)可怕的斑駁,一旦這些模型跑動(dòng)起來(lái)它們就有快速流暢的動(dòng)畫,模型自身的許多丑陋消失了。眼睛容易看見(jiàn)的是 '逼真的' 動(dòng)畫而不是模型自身的結(jié)構(gòu)。 一個(gè)不錯(cuò)的模型設(shè)計(jì)師能夠掩飾大多數(shù)模型缺陷。

              我希望這些帶給你對(duì)模型和動(dòng)畫問(wèn)題的洞察力。在第五部份中,我們將會(huì)更加深入3D世界的建造,討論一些物理,運(yùn)動(dòng)和效果系統(tǒng)的東西。












            第5部分: 物理,運(yùn)動(dòng),效果


            世界建造
              常常在建立一個(gè)含有任何3D成分的游戲時(shí),你最終要試圖建立一個(gè)將會(huì)在里面產(chǎn)生游戲動(dòng)作的3D環(huán)境。 不知怎么的游戲開(kāi)發(fā)者提供了一個(gè)建立這種環(huán)境的方,它容易修改,有效率,有較低的多邊形數(shù)量,對(duì)于游戲既容易渲染又容易運(yùn)用物理學(xué)。很簡(jiǎn)單,對(duì)嗎?當(dāng)做這個(gè)的時(shí)候我用左手在做什么?當(dāng)做這的時(shí)候 , 我對(duì)我的左手做什么? 是的。不錯(cuò)。

              雖然那里有許多3D結(jié)構(gòu)程序,從CAD/CAM程序到3D Studio Max,建造游戲世界是不同于建造內(nèi)部或外部世界的模型的尷尬。你有三角形數(shù)量問(wèn)題 -- 任何給定的渲染器一次只能渲染這么多的多邊形,這對(duì)于天才的關(guān)卡設(shè)計(jì)師來(lái)說(shuō)永遠(yuǎn)都不夠。不知這些,你也只能每個(gè)關(guān)卡存儲(chǔ)預(yù)定數(shù)量的多邊形,所以即使你的渲染器能夠在視野中處理250,000個(gè)多邊形,即使你只能在合理數(shù)量的空間中存儲(chǔ)500,000個(gè)多邊形,那么取決于你怎么處理它,最后你的關(guān)卡價(jià)值像兩個(gè)房間那么小。不好。

              任何方法,開(kāi)發(fā)者需要提出一個(gè)創(chuàng)作工具 -- 最好足夠靈活,允許游戲引擎需要的各種事物 – 比如,在世界中放置對(duì)象,在進(jìn)入游戲以前對(duì)關(guān)卡的適當(dāng)預(yù)覽,以及準(zhǔn)確的光照預(yù)覽。在他們花三個(gè)小時(shí)預(yù)先處理關(guān)卡來(lái)產(chǎn)生一個(gè) '引擎可消化的' 格式之前 , 這些能力允許游戲開(kāi)發(fā)者看到關(guān)卡將在游戲中看起來(lái)怎么樣。 開(kāi)發(fā)者需要關(guān)于關(guān)卡,多邊形數(shù)量,網(wǎng)格數(shù)量等等的相應(yīng)數(shù)據(jù)。 他們需要一個(gè)合宜而友好的方式能夠讓世界有紋理背景圖,容易存取多邊形數(shù)量縮減工具,如此等等。這個(gè)清單可以繼續(xù)列下去。

              在先前已經(jīng)存在的工具中找到這個(gè)功能是可能的。許多開(kāi)發(fā)者使用Max或者M(jìn)aya建造他們的關(guān)卡, 但即使3D Max需要對(duì)它的功能有一些任務(wù)特定的擴(kuò)展來(lái)有效率地完成關(guān)卡建造工作。甚至可能使用關(guān)卡建造工具,像QERadient(見(jiàn)下圖),而且把它的輸出重新處理成你的引擎能夠解釋的格式。


            不能看見(jiàn)它? 別煩擾…
              回想一下我們?cè)诘谝徊糠钟懻摰腂SP (二叉空間分割) 樹(shù),你也可能聽(tīng)說(shuō)過(guò)潛在可視集合(PVS)這個(gè)術(shù)語(yǔ)正被四處談?wù)摗烧叨加邢嗤哪繕?biāo),不去探究涉及到的繁雜的數(shù)學(xué),它是一種把世界分解為你能從世界任何給定位置看見(jiàn)的墻壁的最小子集的方式。在實(shí)現(xiàn)時(shí),它們僅僅返回你能看見(jiàn)的那些,而不是那些隱藏在可能被遮擋的墻壁后面的。你能想象出這給軟件渲染器帶來(lái)的好處,渲染的每個(gè)像素(可能是這樣的情形)極為重要。它們也按從后到前的順序返回那些墻壁,在渲染時(shí)這是很方便的,因?yàn)槟隳軌蛟阡秩敬涡蛑写_定一個(gè)對(duì)象的實(shí)際位置。

              大體而言,BSP 樹(shù)最近正不受歡迎,由于它們的一些古怪,而且因?yàn)槲覀儚漠?dāng)今3D顯示卡獲得的像素吞吐量,再加上Z緩沖像素測(cè)試,BSP 常常成了一個(gè)多余的過(guò)程。它們?cè)谟?jì)算出你在世界的確切位置和正在你周圍的幾何物體方面是便利的,但常常有比BSP樹(shù)更好而且更直觀的方式來(lái)存儲(chǔ)這些信息。

              潛在可視集像它聽(tīng)上去一樣非常好。它是這么一個(gè)方法,在任何給定時(shí)間,給定你在世界的位置,它決定世界的哪些表面,哪些對(duì)象實(shí)際上可以看得見(jiàn)。這時(shí)常用來(lái)在渲染之前剔除對(duì)象,也剔除它們來(lái)減少AI和動(dòng)畫處理。畢竟,如果你實(shí)際上不能看見(jiàn)它們,為什么還要費(fèi)腦筋處理呢。多半這真的是不重要的,如果一個(gè)非玩家角色(NPC)正在播放動(dòng)畫,或者甚至在運(yùn)行它的AI思考。


            游戲物理學(xué)
              既然我們已經(jīng)在內(nèi)存中得到了世界的結(jié)構(gòu),我們必須防止我們的角色從里面掉落出去,并處理地板,斜坡,墻壁,門,以及移動(dòng)平臺(tái)。加之,我們必須正確地處理地心引力,速度變化,慣性,和放置在世界里面的其它對(duì)象的碰撞。這被看作是游戲物理學(xué)。而且在我們進(jìn)一步深入討論之前,我想現(xiàn)在就在這里消除一個(gè)神話。任何時(shí)候你在世界中看見(jiàn)物理,或者任何人在一個(gè)復(fù)雜的游戲環(huán)境中宣稱“真實(shí)的物理”,很好,它是BS。超過(guò)80%的建造一個(gè)有效率游戲物理系統(tǒng)的精力花在簡(jiǎn)化用來(lái)處理世界中對(duì)象的真實(shí)方程式上面。甚至那時(shí),你時(shí)常忽略什么是‘真實(shí)的’,并創(chuàng)造一些‘有趣的’東西,畢竟,這是目標(biāo)所在。

              經(jīng)常地游戲者將會(huì)忽視真實(shí)世界的牛頓物理學(xué),并扮演他們自己的,更有趣的真實(shí)版本。例如,在QuakeII里面,你能夠立即從0加速到35MPH,并快速停下來(lái)。沒(méi)有摩擦力,而且斜坡不提供真實(shí)斜坡提供的相同類型的重力問(wèn)題。身體沒(méi)有它們應(yīng)該的作用在所有關(guān)節(jié)上的地心引力 -- 你看不見(jiàn)身體像真實(shí)生活中那樣倒在桌子上面或者邊緣 -- 而且地心引力它本身甚至可能是可變的。 面對(duì)現(xiàn)實(shí)吧,在真正的世界中,空間中的飛船不像二戰(zhàn)飛行戰(zhàn)斗員在它們的表面操作那樣實(shí)行。在空中,全部是力和反作用力,力在重量點(diǎn)周圍作用,等等。不像 X-Wing中的Luke Skywalker那樣嘯叫。盡管那樣做更加有趣!

              作為游戲開(kāi)發(fā)者來(lái)說(shuō),無(wú)論我們做什么,我們需要能夠檢測(cè)墻壁,檢測(cè)地板,在世界中處理和其他對(duì)象的碰撞。這些是現(xiàn)代游戲引擎的必備 – 我們決定對(duì)它們進(jìn)一步要做的取決于我們和我們的游戲需要。


            效果系統(tǒng)
              如今絕大多數(shù)的游戲引擎建造有某種效果產(chǎn)生器,這允許我們表現(xiàn)出有洞察力的游戲者期盼的所有可愛(ài)的吸引眼球的東西。然而,效果系統(tǒng)幕后所進(jìn)行的東西能夠急劇影響幀速率,所以這是我們需要特別關(guān)心的地方。如今我們有很棒的3D顯示卡,我們能夠傳送大量的三角形給它們,而且他們?nèi)匀灰蟾嗟娜切巍2⒉豢偸悄菢印?在Heretic II,使用它的可愛(ài)的軟件渲染模式,由于他們漂亮的符咒效果,Raven遇到了相當(dāng)嚴(yán)重的過(guò)度繪制問(wèn)題。回想當(dāng)你在屏幕上繪制相同的像素超過(guò)一次時(shí),過(guò)度繪制就發(fā)生了。當(dāng)你有許多效果正在進(jìn)行,按其性質(zhì)你有許多三角形,多個(gè)三角形可能相互堆疊在彼此上面。結(jié)果是你有許多重復(fù)繪制的像素。加上Alpha,這意味著在重新繪制之前你必須讀取舊像素并和新的像素混合,這會(huì)消耗更多的CPU時(shí)間。

              Heretic II的一些效果能說(shuō)明這點(diǎn),我們?cè)谝粠飳?duì)整個(gè)屏幕重復(fù)繪制了四十遍。很驚訝,是嗎?因此他們?cè)谛Ч到y(tǒng)里面實(shí)現(xiàn)了一個(gè)系統(tǒng)采樣在過(guò)去30幀的幀速率,如果速度開(kāi)始減慢,它就自動(dòng)地縮減任何給定效果繪制的三角形數(shù)量。這樣使主要工作完成了,幀速率保持住了,但一些效果看上去很丑陋。

              無(wú)論如何,因?yàn)槿缃窠^大多數(shù)效果傾向使用大量很小的粒子模擬火和煙等等,結(jié)果你在效果代碼里面每幀要處理許多的三角形。你必須把它們從一幀移動(dòng)到下一幀,決定它們是否完成了,甚至還要在它們身上運(yùn)用一些物理學(xué)以便讓它們?cè)诘匕迳厦孢m當(dāng)?shù)姆磸棥_@在PC上面都是相當(dāng)昂貴的,因此甚至現(xiàn)在你必須對(duì)你所能夠做的有一些實(shí)際限制。舉例來(lái)說(shuō),用一個(gè)像素粒子產(chǎn)生火的效果可能會(huì)很好,但當(dāng)你這么做的時(shí)候就別期望在屏幕上做更多別的事情。

              粒子被定義為擁有它們自己的世界位置和速度的非常小的可繪制的物體。它們不同于有方向的精靈,大的粒子使用這些精靈 -- 比如噴出的一團(tuán)團(tuán)煙霧。它們面向照相機(jī)自動(dòng)而典型地旋轉(zhuǎn),縮放,改變它們的透明級(jí)別,因此它們能夠隨著時(shí)間淡出。我們?nèi)菀卓吹酱罅康牧W樱覀儏s限制精靈的數(shù)量—盡管兩者之間的真正不同如今正在模糊。將來(lái),特別是在 DX9 和更加高級(jí)的圖形硬件表面以后,我們可能看到更多的人們使用過(guò)程shader來(lái)產(chǎn)生跟粒子系統(tǒng)相似或者更好的效果,創(chuàng)造非常棒的動(dòng)畫效果。

              當(dāng)談?wù)撔Ч到y(tǒng)時(shí),你可能聽(tīng)說(shuō)過(guò)‘圖原’這個(gè)詞。一個(gè)圖原是你的效果系統(tǒng)將處理的效果的最低級(jí)別的物理表現(xiàn)。更進(jìn)一步解釋,一個(gè)三角形是一個(gè)圖原。那是絕大多數(shù)引擎最終在底層繪制的 -- 大量的三角形。當(dāng)你沿著系統(tǒng)向上時(shí),你對(duì)圖原的定義隨著變化。比如說(shuō),頂層的游戲程序員不想考慮處理個(gè)別的三角形。他僅僅想說(shuō),"這個(gè)效果在這里發(fā)生" 并讓系統(tǒng)以一種黑盒方式處理它。因此對(duì)于他來(lái)說(shuō),一個(gè)效果圖原就是‘讓我們?cè)谑澜绲倪@點(diǎn)持續(xù)這么長(zhǎng)時(shí)間用這樣的引力產(chǎn)生一束粒子’。在效果系統(tǒng)內(nèi)部,它可能認(rèn)為一個(gè)效果圖原是它那時(shí)正在產(chǎn)生的每個(gè)單獨(dú)的效果,像一組遵循同樣的物理學(xué)規(guī)則的三角形—然后它傳送所有這些單獨(dú)的三角形到渲染器進(jìn)行渲染,因此在渲染器層次,圖原就是一個(gè)單獨(dú)的三角形。有一點(diǎn)困惑,但你知道總的思想了。

              以上就是第五部分,下一個(gè)部分是關(guān)于聲音系統(tǒng),和各種不同的音頻APIs,3D音頻效果,處理閉塞和障礙,各種不同材料對(duì)聲音的影響,音頻混合等等。













            第6部分: 聲音系統(tǒng),音頻APIs


            聲音系統(tǒng)
              由于人們玩的游戲在種類和技術(shù)上的進(jìn)步,聲音和音樂(lè)近幾年來(lái)在游戲中正逐漸變得重要起來(lái)(聲音是一個(gè)實(shí)際游戲的可玩特點(diǎn),比如在Thief和其它同類游戲中的聽(tīng)覺(jué)提示)。現(xiàn)在四聲道環(huán)繞系統(tǒng)在游戲玩家的寶庫(kù)中是負(fù)擔(dān)得起的和平常的事。給定空間的聲音,噪音的障礙和閉塞,和動(dòng)態(tài)的音樂(lè),如今許多游戲使用這些提高玩家情緒上的反應(yīng),更多的關(guān)注投入到這個(gè)領(lǐng)域就不足為奇了。

              現(xiàn)在在PC競(jìng)技場(chǎng)中,游戲玩家實(shí)際上只有一種聲音卡可以選擇 -- PC聲卡制造商創(chuàng)新公司(Creative Labs)的Sound Blaster Live! 從舊的時(shí)間個(gè)人計(jì)算機(jī)聲音卡片制造業(yè)者有創(chuàng)造力的中心. 多年來(lái)創(chuàng)新公司已經(jīng)為DirectX提供了他們的EAX聲音擴(kuò)展,并且他們是發(fā)起新的OpenAL(開(kāi)放音頻庫(kù)Open Audio Library)的創(chuàng)立者。就如同OpenGL是一個(gè)圖形API一樣,OpenAL,像它起來(lái)聽(tīng)一樣,是一個(gè)聲音系統(tǒng)的API。OpenAL 被設(shè)計(jì)為支持大多數(shù)通常聲卡的許多特征,而且在一個(gè)特定的硬件特征不可得時(shí)提供一個(gè)軟件替代。

              為了更好的定義 OpenAL,我向創(chuàng)新公司的Garin Hiebert詢問(wèn)了其定義:

              "這里借用我們的 " OpenAL 規(guī)格和叁考" 的一個(gè)定義:

              OpenAL 是對(duì)音頻硬件的一個(gè)軟件接口,給程序員提供一個(gè)產(chǎn)生高質(zhì)量多通道輸出的能力。OpenAL 是在模擬的三維環(huán)境里產(chǎn)生聲音的一種重要方法。它想要跨平臺(tái)并容易使用,在風(fēng)格和規(guī)范上與OpenGL相似。任何已經(jīng)熟悉OpenGL的程序員將發(fā)現(xiàn)OpenAL非常熟悉。

              OpenAL API能容易地被擴(kuò)展適應(yīng)插件技術(shù).創(chuàng)新公司已經(jīng)把EAX支持加入到這套API了,程序員可以用來(lái)給他們的聲音環(huán)境增加復(fù)雜的反響,比賽和障礙效果。

              如同Jedi Knight II: Outcast 一樣,連同Eagle 世界/聲音特征編輯器,Soldier of Fortune II 以這個(gè)新系統(tǒng)為特征。什么是Eagle? 在介紹這個(gè)以前,讓我們討論一些其他的系統(tǒng),并定義一些聲音術(shù)語(yǔ)。


              另外的一個(gè)系統(tǒng)是Miles聲音系統(tǒng)。Miles是一家公司,它為你的代碼生產(chǎn)插件,在充分利用每塊聲卡時(shí)處理所有必須的到特定聲音卡的說(shuō)話(比如Sound Blaster Live!系列,或者老的A3D聲卡)。它非常像一個(gè)API前端,捆綁了一些額外的特征在里面。 在其他事物當(dāng)中Miles讓你存取一些事物像MP3解壓縮。 它是很好的解決方案,但像任何事一樣,它花費(fèi)金錢并是你的代碼和硬件之間的額外一層。雖然對(duì)於快速的聲音系統(tǒng)制造,它非常有用,而且他們有段時(shí)間了,因此他們的確精通自己的業(yè)務(wù)。


            聲音術(shù)語(yǔ)
              讓我們開(kāi)始障礙和閉塞。它們聽(tīng)起來(lái)一樣,但不是這樣。閉塞基本上意謂著一個(gè)聲音在播放時(shí)聽(tīng)者在他們之間有一些閉合的障礙物。

              比如說(shuō),在NOLF2的一個(gè)屏幕鏡頭上你聽(tīng)到房子里面壞蛋的聲音。你能聽(tīng)到他們,但是他們的聲音相當(dāng)?shù)统炼硢 U系K是相似的,但是你和聲音之間的障礙物并不是閉合的。一個(gè)好的例子就是在你和聲源之間有一根柱子。由于房間中的回聲你仍然聽(tīng)得到這個(gè)聲音,但是它和聲音直接傳遞到你的耳朵里是不同的。當(dāng)然這確實(shí)依賴于知道在你的耳朵和聲源之間的直線上是什么。而且根據(jù)房間的大小,聲源到你的距離等等,需要的處理能變得相當(dāng)耗時(shí)。后面我們將會(huì)談到跟蹤--足可以說(shuō)它時(shí)常是比較慢的幀速率的原因。Quake III 里面的A3D 代碼做了這些事情,關(guān)閉這些選項(xiàng)通常能夠提高幀速率。Tribe 2 是這種弊病的另外一個(gè)受害者。關(guān)閉3D聲音選項(xiàng)則你的幀速率立即好轉(zhuǎn),這在你考慮Tribes世界有多大和你能看見(jiàn)多遠(yuǎn)時(shí)有意義。

              接著是聲音物質(zhì)的特征。大部分聲卡可以讓你能夠用可定義的過(guò)濾器作用于聲音從而修正播放的聲音。例如,在水下,或者在一個(gè)布料遮蓋的房間中,或者在一個(gè)長(zhǎng)的走廊中,或者在歌劇院,聽(tīng)到的聲音有著很大的不同。能夠根據(jù)你所處的環(huán)境改變你聽(tīng)到聲音的方式是相當(dāng)不錯(cuò)的。

              我們回到Eagle… 這是一個(gè)編輯器,允許多數(shù)第一人稱射擊游戲地圖設(shè)計(jì)者將他們的地圖導(dǎo)入到這個(gè)工具,然后構(gòu)造簡(jiǎn)化的幾何形體來(lái)為實(shí)際游戲引擎中的EAX代碼產(chǎn)生一個(gè)聲音地圖。其思想是你不需要一個(gè)真實(shí)的圖形地圖的復(fù)雜幾何形體來(lái)模擬聲音環(huán)境。你也能夠給產(chǎn)生的簡(jiǎn)化地圖分配聲音物質(zhì),這樣聲音環(huán)境就能夠動(dòng)態(tài)地改變。我親眼目睹了這在Soldier of Fortune和Unreal Tournament上的示范,確實(shí)相當(dāng)引人注目。 我這在財(cái)富和 Unreal 巡回賽和它的軍人上真的對(duì)示范是證人相當(dāng)醒目. 當(dāng)你跳入水中時(shí),聽(tīng)到所有的聲音改變,這是一個(gè)非常令人沉浸的經(jīng)歷。

              好,讓我們繼續(xù)吧。

              對(duì)于游戲機(jī),由于靜態(tài)的硬件,你的各種可能性會(huì)更受限制 — 盡管在PlayStation 2和Xbox上,硬件相當(dāng)不錯(cuò)。我說(shuō)的限制,僅僅是指擴(kuò)展,而不是它所能夠做的。我一點(diǎn)也不會(huì)感到驚訝看到這些游戲機(jī)上的游戲很快支持杜比數(shù)字5.1(Dolby Digital 5.1)輸出。Xbox ,由于它的 MCP 音頻處理器,能夠?qū)⑷魏斡螒蛞纛l編碼為5.1,并且游戲不需要特別編碼就能利用這個(gè)特征。杜比(Dolby)把ProLogic II 帶到了 PS2 上,并與Factor 5合作為GameCube游戲?qū)崿F(xiàn)了ProLogic II。在 Xbox 之上,Halo, Madden 2002 和 Project Gotham Racing等游戲都有5.1杜比數(shù)字音頻內(nèi)容。DTS最近也為 PS2 游戲開(kāi)發(fā)者發(fā)布了SDK,為這個(gè)平臺(tái)上的游戲帶來(lái)了降低了比特率的DTS音頻版本。


            位置的聲音--一個(gè)復(fù)雜的世界
              現(xiàn)在有一些很少有處理的聲音空間化問(wèn)題。我說(shuō)的是把聲音放在一個(gè)真實(shí)的3D世界中。有四個(gè)揚(yáng)聲器在你周圍是一個(gè)很棒的開(kāi)始,但這仍然只是在二維方向。在你的上方和下方?jīng)]有揚(yáng)聲器,你沒(méi)有真正獲得3D聲音。有一些聲音調(diào)制過(guò)濾器試圖解決這個(gè)問(wèn)題,但實(shí)際上沒(méi)有真實(shí)東西的代替物。當(dāng)然真實(shí)地大多數(shù)游戲多半只是在二維方向上,因此這仍然不是太大的問(wèn)題。

              實(shí)際上任何聲音系統(tǒng)最重要的特征之一是把聲音混合在一起。根據(jù)你所處的位置,空間中聲音的位置,每個(gè)聲音的音量大小,一旦你決定了實(shí)際上你能夠聽(tīng)到的聲音,然后你必須混合這些聲音。通常聲音卡自己處理這些,這首先是聲音卡存在的主要原因。然而,外面有一些引擎決定首先用軟件做一次‘預(yù)混合’。直到你著眼于一點(diǎn)點(diǎn)歷史以前,這并沒(méi)有真正地帶來(lái)多大的意義。

              當(dāng)聲音卡最初問(wèn)世的時(shí)候,有許多不同的混合方法。一些聲卡可以混合8種聲音,一些單位16種,一些32種,等等。 如果你總想聽(tīng)到16種可能的聲音,但你不知道聲音卡是否能夠處理,那么你回到了嘗試和試驗(yàn)的道路上 — 就是你自己用軟件混合。這實(shí)際上是Quake III聲音系統(tǒng)的工作方式,但提一個(gè)問(wèn)題:"Quake III是為A3D和Sound Blaster Live!聲卡世界發(fā)布的,這比以前更加標(biāo)準(zhǔn)化,為什么還這樣做?" 這是個(gè)好問(wèn)題。實(shí)際上Quake III的聲音系統(tǒng)幾乎每行代碼都和Quake II中的聲音系統(tǒng)一樣。而且Quake I,甚至Doom也是這樣。你想一想,向上直到 A3D 聲卡和 SB Live! 聲卡,許多年來(lái)聲音系統(tǒng)的需求沒(méi)有真正地改變過(guò)。兩個(gè)揚(yáng)聲器,二維方向,音量簡(jiǎn)單地隨著距離減小。從Doom一直到Quake III沒(méi)有發(fā)生太大變化。而且在游戲行業(yè)中,如果不是迫不得已,別理會(huì)它。

              通常你會(huì)僅僅使用DirectSound為你做聲音混合,因?yàn)樗鼤?huì)可以使用的聲音硬件,或者轉(zhuǎn)而依靠軟件,很多地方就像DirectX為3D顯示卡所做的一樣。在 90% 的聲音情形中,依靠軟件混合對(duì)你的幀速率沒(méi)有真正發(fā)生太多不同。當(dāng)DirectSound在一些狂熱的編碼者眼中甚至還不是一絲光線時(shí),Doom引擎就已經(jīng)產(chǎn)生了。它從來(lái)沒(méi)有得到更新過(guò),因?yàn)樗鼜膩?lái)就沒(méi)有真的需要更新。

              當(dāng)然,你可以使用 SoundBlaster Live!聲卡的一些聰明特征,例如房間的回聲特性: 一塊石窟,或一個(gè)禮堂,一個(gè)巨穴, 一個(gè)足球體育館等。而且你真的應(yīng)該使用由硬件提供的混合器,畢竟,那是它存在的目的。這種方法的一個(gè)不足之處是程序本身時(shí)常無(wú)法獲得混合結(jié)果,因?yàn)榛旌鲜窃诼暱▋?nèi)部完成而不是在主存。如果由于某種原因你需要看到產(chǎn)生的音量,你是運(yùn)氣不好。


            Music Tracks in Games(游戲中的音軌)
              我們沒(méi)有過(guò)多的談到游戲中的音樂(lè)生成。傳統(tǒng)的有兩種方法,一種是簡(jiǎn)單的音樂(lè) .wav 文件(或同等物)。它被預(yù)先制作做好,準(zhǔn)備運(yùn)行,和最小忙亂。然而,這些在內(nèi)存和回放時(shí)間方面很昂貴。第二種方式用預(yù)設(shè)的樣本編碼MIDI音軌。這時(shí)常比較節(jié)省內(nèi)存,但缺點(diǎn)是必須同時(shí)把一些聲音混合在一起,因而會(huì)把聲音通道用光。

              動(dòng)態(tài)音樂(lè)就是根據(jù)在游戲中目睹的行動(dòng)改變你的音樂(lè)的能力,比如探險(xiǎn)用慢節(jié)奏的音樂(lè),戰(zhàn)斗用快節(jié)奏的音樂(lè)。預(yù)先制作的音樂(lè)的一個(gè)困難之處是要合拍,因此你可以從一段音樂(lè)漸弱到另一段音樂(lè),這對(duì)于MIDI音軌比較容易。盡管時(shí)常你足夠快速地淡出,或者一段音樂(lè)在播放另一段音樂(lè)之前已經(jīng)消失了,你能僥幸不被察覺(jué)。

              在我們離開(kāi)這個(gè)主題之前,順便說(shuō)一下,值得一提的是存在一些公司專門為你的游戲創(chuàng)作特定意義的音樂(lè)。FatMan(www.fatman.com) 就是一家這樣的公司。音樂(lè)可能比其他別的東西更加容易外包,這是他們存在的方式。

              最后,游戲現(xiàn)在的事情自然是MP3格式,允許巨大的11 :1的聲音樣本壓縮,然而在送到聲音卡之前只花費(fèi)CPU很少的時(shí)間解壓縮。當(dāng)我在Rave Software工作時(shí),在Star Trek Voyager: Elite Force 中,我們?cè)O(shè)法用MP3在一張CD上面完全支持三種語(yǔ)言,仍然為較多的圖形留有空間。主要地,我們 MP3 只用于非玩家角色(NPC)的語(yǔ)音,由于游戲的全部音頻效果MP3流和動(dòng)態(tài)解壓縮超出了硬件的處理能力,雖然在將來(lái)這是肯定可能的。比較新的格式,如來(lái)自 Dolby 的 AAC 和來(lái)自微軟的WMA,以將近兩倍MP3的壓縮率提供了相等或者更高的音頻質(zhì)量(實(shí)際上一半的比特率),可能應(yīng)用到將來(lái)的游戲中。

              以上是這一章節(jié)的內(nèi)容,下面將是網(wǎng)絡(luò)和連線游戲環(huán)境的開(kāi)發(fā)。














            第7部份: 網(wǎng)絡(luò)和連線游戲環(huán)境


            網(wǎng)絡(luò)游戲
              我記得一些年前坐在GDC(游戲開(kāi)發(fā)者大會(huì))聽(tīng)負(fù)責(zé)開(kāi)發(fā)X-Wing Vs TIE Fighter的家伙們題為“淹沒(méi)在Internet” 的演講,全是關(guān)于讓網(wǎng)絡(luò)游戲?qū)崟r(shí)地在Internet上工作的東西。他們選擇那個(gè)題目是多么的正確啊。當(dāng)它開(kāi)始處理數(shù)據(jù)包的丟失,亂序,潛伏(一個(gè)數(shù)據(jù)包發(fā)送到它的目的地所花的時(shí)間)等等時(shí),它確實(shí)淹沒(méi)了。然而它是可能的。對(duì)于Internet需要一些聰明和經(jīng)驗(yàn),但它是肯定可能的。看看今天大量的連線游戲,從Quake III,Unreal Tournament,Counter Strike一直到EverQuest和Ultima Online。

              如今大多數(shù)真正有長(zhǎng)久生命力的游戲都至少有一些連線成分。最純粹的單人游戲容易玩一次,也許兩次,或者甚至三次如果它是非常好的游戲,但一旦游戲結(jié)束,就被束之高閣了。如果你想要有任何長(zhǎng)久生命力,那么多人連線游戲就是形勢(shì)的核心所在,并且那意味著和Internet打交道,為編碼者打開(kāi)了那個(gè)潘多拉的盒子。

              那么跟Internet打交道包括些什么呢?首先是要理解Internet是怎么工作的,和點(diǎn)對(duì)點(diǎn)與客戶機(jī)/服務(wù)器體系結(jié)構(gòu)的快速討論。點(diǎn)對(duì)點(diǎn)就是你在兩臺(tái)機(jī)器上運(yùn)行游戲,并簡(jiǎn)單地在它們之間共享輸入。每個(gè)單獨(dú)的游戲假定它是正確的,并僅僅在它一幀接一幀的刷新中合并來(lái)自另外一臺(tái)機(jī)器的輸入。客戶機(jī)/服務(wù)器是一臺(tái)機(jī)器有效地運(yùn)行游戲,別的機(jī)器僅僅是一個(gè)終端,接受來(lái)自玩家的輸入,并渲染服務(wù)器讓它渲染的任何東西。

              客戶機(jī)/服務(wù)器的優(yōu)點(diǎn)是每臺(tái)機(jī)器都將會(huì)展現(xiàn)相同的游戲,因?yàn)樗械奶幚矶荚谝粋€(gè)地方完成,沒(méi)有跨越多臺(tái)機(jī)器,你可以不用考慮每臺(tái)機(jī)器相互之間的同步問(wèn)題。不足之處是,服務(wù)器本身需要有一些重要的CPU可用時(shí)間來(lái)處理每一個(gè)連接的客戶機(jī),和一個(gè)合適的網(wǎng)絡(luò)連接來(lái)確保每一個(gè)客戶機(jī)及時(shí)地接收到它的更新。


            了解IP
              我們都已經(jīng)聽(tīng)說(shuō)過(guò)TCP/IP(傳輸控制協(xié)議/網(wǎng)間協(xié)議)和UDP(用戶數(shù)據(jù)包協(xié)議), 在Web網(wǎng)絡(luò)上有大量關(guān)于這些協(xié)議的深?yuàn)W的技術(shù)資訊。實(shí)際上,在Cisco網(wǎng)站上有一些極好的TCP/IP指導(dǎo)。我們將在較高層面上介紹一些TCP/IP的基本知識(shí),目的是讓你更好地了解使用這些標(biāo)準(zhǔn)協(xié)議的網(wǎng)絡(luò)游戲設(shè)計(jì)者面臨的挑戰(zhàn)。

              TCP/IP和UDP/IP是兩層的通信協(xié)議系統(tǒng)。IP層負(fù)責(zé)網(wǎng)際數(shù)據(jù)包的傳輸。UDP或者TCP層將大的數(shù)據(jù)包傳給IP,IP將數(shù)據(jù)包分割為小的子數(shù)據(jù)包,為每個(gè)數(shù)據(jù)包加上一個(gè)信封,計(jì)算出目的地的IP地址,應(yīng)該如何到達(dá)那里,然后將數(shù)據(jù)包發(fā)送到你的ISP,或者不管怎樣你連接到網(wǎng)絡(luò)。 這實(shí)在象是在一張明信片上寫下你要發(fā)送的,貼上郵票,寫上地址,塞進(jìn)一個(gè)郵箱,它就送走了。

              UDP和TCP是從你編碼者或者游戲接收數(shù)據(jù)包的高層協(xié)議,并決定該如何處理這些數(shù)據(jù)包。UDP和TCP的區(qū)別在于TCP保證數(shù)據(jù)包的傳送和有序,而UDP不保證。UDP是一條直接和IP對(duì)話的小路,而TCP是在你和IP之間的一個(gè)接口。它像是在你和你的郵件之間有一個(gè)管理員助手。使用UDP你會(huì)自己為你的信打字,把它們放進(jìn)一個(gè)信封等等。使用TCP你會(huì)僅僅向你的管理員口授信稿,管理員會(huì)做全部的工作并追蹤確認(rèn)信件送到了。

              然而,所有這些令人驚奇的為你完成的工作伴隨著代價(jià)。為了確定數(shù)據(jù)包通過(guò)Internet完好無(wú)損地送到了目的方,TCP期待從目的方為它發(fā)送的每個(gè)數(shù)據(jù)包發(fā)回一個(gè)應(yīng)答包(網(wǎng)絡(luò)用語(yǔ)是ACK)。如果它在一定時(shí)間內(nèi)沒(méi)有收到ACK,它就停止發(fā)送任何新的數(shù)據(jù)包,重新發(fā)送丟失的數(shù)據(jù)包,并且將繼續(xù)這樣做直到收到目的方的回應(yīng)。當(dāng)你訪問(wèn)一個(gè)網(wǎng)頁(yè)時(shí),我們都已經(jīng)看到了這種情形,在半途中下載停止了一會(huì)然后又重新開(kāi)始了。可能是一個(gè)數(shù)據(jù)包在什么地方丟失了(假定不時(shí)ISP的問(wèn)題),在任何更多的數(shù)據(jù)包被發(fā)送以前TCP要求重新發(fā)送它。

              這一切的問(wèn)題是,在認(rèn)識(shí)到出了差錯(cuò)的發(fā)送者和實(shí)際上正在送達(dá)的數(shù)據(jù)包之間出現(xiàn)了延遲。有時(shí)這能花上數(shù)秒鐘,如果你僅僅只是下載一個(gè)文件或一個(gè)網(wǎng)頁(yè),這不是什么大礙,但如果這是一個(gè)游戲數(shù)據(jù)包而且每秒至少有十次,那么你真的是遇到麻煩了,尤其是因?yàn)樗V沽似渌磺惺虑椤?shí)際上就是這個(gè)問(wèn)題所以幾乎沒(méi)有游戲選擇使用TCP作為它們主要的Internet協(xié)議,除非它不是一個(gè)實(shí)時(shí)動(dòng)作游戲。大多數(shù)游戲使用 UDP--他們不能保證有序或可靠送達(dá),但它確實(shí)很快—或者結(jié)果是至少通常比TCP/IP更快。現(xiàn)在我們了解這些了,接下來(lái)呢?


            客戶端預(yù)測(cè)
              因?yàn)?UDP 明顯的是快速響應(yīng)游戲的方式,我們將必須自己處理數(shù)據(jù)包的丟失和亂序。邊而且這是技巧所在。不用說(shuō)出太多的代碼秘密,我就能說(shuō)有方法。作為開(kāi)始,有客戶端預(yù)言,一個(gè)被談?wù)摰孟喈?dāng)多的詞語(yǔ)。當(dāng)你作為一個(gè)客戶端連接到一個(gè)大的服務(wù)器,但是不能連貫地看見(jiàn)來(lái)自服務(wù)器的更新,客戶端預(yù)言開(kāi)始起作用了。正在你的電腦上運(yùn)行的游戲部分看著你正給它的輸入,并在缺乏來(lái)自服務(wù)器的任何棄絕信息的情況下,對(duì)它認(rèn)為將繼續(xù)進(jìn)行的事情作出‘最好的猜測(cè)’。它將會(huì)顯示被猜測(cè)的數(shù)據(jù),然后當(dāng)它得到來(lái)自服務(wù)器的世界的最新?tīng)顟B(tài)時(shí),改正它自己,如果需要。你可能會(huì)對(duì)這個(gè)方法的效力感到驚訝。大體而言,大部分時(shí)間數(shù)據(jù)包不容易丟失—大多數(shù)時(shí)候是一秒的幾十分之一,這種情況下游戲沒(méi)有太多的時(shí)間偏離服務(wù)器實(shí)際上認(rèn)為正在發(fā)生的事情。偏離確實(shí)會(huì)隨著時(shí)間變的比較大,大多數(shù)游戲里面有一個(gè)超時(shí)功能,當(dāng)出現(xiàn)很長(zhǎng)時(shí)間沒(méi)有來(lái)自服務(wù)器的聯(lián)絡(luò)時(shí)就停止游戲。

              你正在創(chuàng)造的游戲類型在這里有關(guān)系 -- 第一人稱射擊游戲不需要這樣有效的客戶端預(yù)言,因?yàn)樗鄶?shù)情況下僅僅處理“我在哪兒,我是否要射擊?”。在第三人稱游戲中,你必須更加精確,因此你能夠正確地預(yù)測(cè)你的角色正在播放的動(dòng)畫,并且動(dòng)作流暢。在這種情形中流暢的動(dòng)畫是完全必要的。Heretic II在這方面有很大的問(wèn)題,并且是當(dāng)它開(kāi)始網(wǎng)絡(luò)編碼時(shí)Raven一直不得不處理的最困難的事情之一。

              當(dāng)然如果你有一個(gè)很不錯(cuò)的網(wǎng)絡(luò)連接,比如寬帶連接,那么這個(gè)問(wèn)題就遠(yuǎn)沒(méi)有那么重要。對(duì)比較大的數(shù)據(jù)包有一個(gè)更寬的管道,對(duì)你的網(wǎng)絡(luò)連通時(shí)間更快速。事實(shí)上,寬帶對(duì)于游戲的主要優(yōu)點(diǎn)不比較胖的管道多,但大大減少了延遲,特別是你到ISP的第一跳上。對(duì)于56K 調(diào)制解調(diào)器,第一跳典型的延遲是100ms,這已經(jīng)嚴(yán)重地增加了你到網(wǎng)絡(luò)上任意一臺(tái)游戲服務(wù)器的潛在連通時(shí)間。對(duì)于寬帶連接比如像DSL,第一跳的延遲時(shí)間多半是20ms。使用Windows中一個(gè)叫做TraceRoute(TRACERT.EXE)的命令行程序并指定一個(gè)目標(biāo)IP地址或者域名,你能夠找出你的第一跳的連通時(shí)間。仔細(xì)觀察第一跳,因?yàn)檫@幾乎總是你到你的ISP的網(wǎng)絡(luò)連通時(shí)間。并且觀察你在你的ISP的網(wǎng)絡(luò)內(nèi)部用了多少跳直到你看見(jiàn)在一個(gè)給定跳上列出的一個(gè)不同的域名。

              請(qǐng)注意,寬帶并不總是能解決延遲問(wèn)題。你仍然受最慢的路由器/服務(wù)器和數(shù)據(jù)包從服務(wù)器穿越網(wǎng)絡(luò)到達(dá)你的跳數(shù)(反之亦然)的支配。有一個(gè)寬帶連接確實(shí)容易緩和這些,但不可能它們最后就消失了。當(dāng)然,如果你打算要運(yùn)行某種服務(wù)器,你將會(huì)需要一個(gè)具有足夠快速的向上游的數(shù)據(jù)速率的帶寬,因?yàn)閮H僅一個(gè)調(diào)制解調(diào)器不能夠處理一個(gè)服務(wù)器產(chǎn)生的負(fù)荷。

              值得一提的是,如果你想要在PS2或者Xbox上面玩網(wǎng)絡(luò)游戲,你將需要一個(gè)寬帶連接,因?yàn)樗鼈儍烧叨疾恢С终{(diào)制解調(diào)器。


            包大小,智能數(shù)據(jù)傳輸,和反作弊
              別的必須被處理的事情是數(shù)據(jù)包的大小。如果你在一個(gè)游戲里面64個(gè)人都在跑來(lái)跑去相互攻擊,從一臺(tái)機(jī)器發(fā)送到另外一臺(tái)機(jī)器的數(shù)據(jù)包能變得相當(dāng)大,達(dá)到了一些調(diào)制解調(diào)器沒(méi)有帶寬處理這些數(shù)據(jù)的程度。這正在變得特別和那些有著很大的地表系統(tǒng)的游戲有關(guān)。這里增加的問(wèn)題是,因?yàn)槟阌羞@個(gè)很好的地表系統(tǒng),你能夠看得很遠(yuǎn),因此能夠看見(jiàn)許多其他游戲玩家,使得你為了精確渲染所需要的來(lái)自服務(wù)器的數(shù)據(jù)數(shù)量以很快的速率增長(zhǎng)。我們能做什么呢?

              好吧,首先必要的是只發(fā)送絕對(duì)必須的東西給任何給定的客戶端,因此他僅僅得到從他的角度觀察游戲所需要的東西。發(fā)送在他視野以外的人們的數(shù)據(jù)沒(méi)有一點(diǎn)意義—他將看不見(jiàn)這些。同時(shí),你最好確保只發(fā)送那些每幀之間實(shí)際上發(fā)生改變的數(shù)據(jù)。如果一個(gè)家伙仍然在播放相同的動(dòng)畫,重新發(fā)送數(shù)據(jù)沒(méi)有意義。當(dāng)然,如果數(shù)據(jù)包丟失時(shí)這確實(shí)帶來(lái)一些問(wèn)題,但這就是為什么好的網(wǎng)絡(luò)程序員被支付很多金錢,來(lái)處理類似這樣的東西。

              還有一些其他的事情也要處理。最近已經(jīng)有大量的令人苦惱的連線作弊正在發(fā)生。這是某些人修改游戲以給他們不正當(dāng)利益的地方。盡管嚴(yán)格意義上這不是網(wǎng)絡(luò)的一部分,但它確實(shí)發(fā)生了。有時(shí)人們會(huì)創(chuàng)作一些模塊,允許他們立即瞄準(zhǔn)進(jìn)入視野的任何人,或者簡(jiǎn)單地允許他們看穿墻壁,或者讓其他游戲玩家看不見(jiàn)他們自己。大部份時(shí)間這些事情可以在網(wǎng)絡(luò)層內(nèi)部或者在服務(wù)器上被處理。任何有100%命中率的人被簡(jiǎn)單地踢出游戲,因?yàn)樵谌肆λ暗姆秶鷥?nèi)那是不可能的。

              游戲開(kāi)發(fā)者必須盡一切可能制止作弊行為,但很不幸,人做的東西可以被人突破。所有你能做的就是讓作弊變得困難,當(dāng)確實(shí)發(fā)生時(shí)去嘗試發(fā)現(xiàn)它。

              好吧,現(xiàn)在就到這里了。在第8部分中,我們將會(huì)看看游戲腳本系統(tǒng)的趣味世界,根據(jù)游戲過(guò)程中出現(xiàn)的事件來(lái)渲染或使能預(yù)先定義的場(chǎng)景和行為,協(xié)助故事敘述。












            第8部份: 腳本系統(tǒng)


            腳本系統(tǒng)
              我們從第七部分的游戲網(wǎng)絡(luò)問(wèn)題來(lái)到了腳本系統(tǒng),因?yàn)槠涑尸F(xiàn)的故事敘述機(jī)會(huì),最近已經(jīng)形成一種很大的游戲元素。在一個(gè)需要以受控制的方式解釋的情景,預(yù)先編制的電影腳本是解決問(wèn)題的方法。在電影中,這通常用來(lái)處理或者由主角向一個(gè)伙伴解釋情形,或者敵人對(duì)英雄解釋。當(dāng)然,有其它的方法來(lái)做這件事情 -- 敘事者,倒敘,等等 – 但通常是使用實(shí)時(shí)情景的人們和事件來(lái)完成。當(dāng)然,游戲是不同的,游戲開(kāi)發(fā)者在他們平常的FPS中不應(yīng)該做太多的倒敘,因?yàn)橥ǔ?huì)需要載入新的環(huán)境或者關(guān)卡,以及新的紋理和/或模型。所有這些額外的處理和渲染能影響到主要的游戲序列的性能。你可以重用已經(jīng)存儲(chǔ)在內(nèi)存里面的場(chǎng)景元素來(lái)倒敘,但那樣會(huì)看上去明顯比較粗陋。

              RavenSoft 的Star Trek Voyager: Elite Force廣泛利用了腳本序列產(chǎn)生游戲中的事件和使用游戲引擎本身的剪輯場(chǎng)景。

              在游戲中設(shè)計(jì)腳本情節(jié)的一個(gè)有趣趨勢(shì)是使用當(dāng)前極大改進(jìn)了的3D游戲引擎自己產(chǎn)生剪輯場(chǎng)景。現(xiàn)在這可能像是相當(dāng)?shù)孛黠@,但是數(shù)年以前,當(dāng) 3D 圖形卡還比較簡(jiǎn)單的時(shí)候,剪輯場(chǎng)景通常使用高端3D工作站制作,得到的3D動(dòng)畫然后被記錄為一個(gè)數(shù)字視頻文件,以流式文件存儲(chǔ)在CD-ROM。你從剪輯場(chǎng)景的漂亮圖形畫面回到真實(shí)游戲的相對(duì)粗陋的3D畫面,這是相當(dāng)令人不愉快的失望的事情。但像Half-Life 和 Star Trek Voyager : Elite Force這樣的游戲很好地利用了它們自己的引擎產(chǎn)生所有的剪輯場(chǎng)景,結(jié)果是剪輯場(chǎng)景和游戲之間的過(guò)渡更加平滑。

              把腳本和人工智能區(qū)分開(kāi)來(lái)可能是個(gè)很好的主意。腳本是你完全控制著一個(gè)給定場(chǎng)景,建立玩家?guī)缀蹩偸菦](méi)有控制的事件,游戲者‘沿著軌道’移動(dòng)到一個(gè)給定地點(diǎn),或者建立一個(gè)游戲玩家需要解決的情形。一個(gè)好的例子可能是巨石掉在走廊上,需要游戲玩家找到一個(gè)新的逃脫方法。

              如今有一些不同類型的腳本系統(tǒng)可供程序員或者美術(shù)師使用,而且它用非常有條理和邏輯的思想恰當(dāng)?shù)刈鲞@些。第一種是簡(jiǎn)單的基于文本的,單線索的風(fēng)格,就像我們程序員習(xí)慣的編碼。在許多情況,它實(shí)際上基於 C,盡管以一種非常簡(jiǎn)單的形式。 大量這種類似“if this,then do that”的東西。大部分腳本傾向在范圍內(nèi)是相當(dāng)線性的—意味著它通常由許多在次序上彼此相接的命令組成。在世界中移動(dòng)角色A指向B。當(dāng)完成以后,讓他講話,完成以后,移動(dòng)他指向C。相當(dāng)簡(jiǎn)單的事情。

              然后有復(fù)雜的東西--允許多重線索,和實(shí)際上允許可變情形。可變情形是當(dāng)腳本開(kāi)始時(shí)你實(shí)際上不能確知誰(shuí)會(huì)出現(xiàn)在附近,但是你必須按這樣的方式編寫腳本以便任何人出現(xiàn)在附近它都將會(huì)工作。舉例來(lái)說(shuō)--一個(gè)正常的簡(jiǎn)單腳本會(huì)有三個(gè)家伙,全部被預(yù)先定義,全部有一組他們將會(huì)討論的情形。一個(gè)可變的腳本將會(huì)有三個(gè)人,你不能保證是某一個(gè)特定的人,并必須按相同的方式工作。或者在一個(gè)極端的情形中,也許只有二個(gè),或者甚至一個(gè)家伙將會(huì)在那里,使得三方交談?dòng)幸稽c(diǎn)困難。

              Raven在Star Trek Voyager: Elite Force中面臨的一個(gè)很大的問(wèn)題是這樣的情形,使用者可能會(huì)想要把一個(gè)角色從一條船的某個(gè)地方帶到另外一個(gè)地方,但是從A點(diǎn)到B點(diǎn)的路徑可能會(huì)隨著每次游戲根本地改變。舉例來(lái)說(shuō),他們需要讓Munro(你所扮演的游戲主要角色)從發(fā)動(dòng)機(jī)艙室到輸送艙。 不幸的是由于游戲的非直線性,在事件到達(dá)這一點(diǎn)以前你可能已經(jīng)破壞了渦輪升降機(jī),或者也許 Jeffries 管被損害不能通過(guò)。假定當(dāng)腳本開(kāi)始的時(shí)候我們不知道世界的狀態(tài),我們不得不為幾乎各種可能發(fā)生的事情編寫腳本以便適用于這些‘如果。。。怎么辦’的情形。而且它僅僅從那里變得更加糟糕。我們能建立的一些情形提供了如此多可能的組合情形,以致于為了一個(gè)滿意的結(jié)論而準(zhǔn)確測(cè)試每一個(gè)可能發(fā)生的事情幾乎是不可能的。請(qǐng)和在SiN, Star Trek Voyager : Elite Force or Deus Ex中工作的任何人談?wù)劇A部門傳統(tǒng)地憎恨這些類型游戲,因?yàn)檫@已經(jīng)使他們的工作比以前更加困難了 50 倍。

              你能夠想象為這些情形編寫腳本是何等的困難。但那是今天的非線性游戲路徑要求的事情,而且它為何博得了較多的開(kāi)發(fā)支持從而能夠努力實(shí)現(xiàn)它。


            Jim Dose關(guān)于腳本系統(tǒng)的論述
              去年底我訪談了Jim Dose--Ritual的前任開(kāi)發(fā)者,現(xiàn)在是Id Software的一個(gè)開(kāi)發(fā)者,Doom3腳本系統(tǒng)(和其他一些事情)的設(shè)計(jì)者。盡管這次訪談?dòng)行┚昧耍匀皇呛苡卸床炝Α?

              Jim談了腳本系統(tǒng)和創(chuàng)建一個(gè)易用且健壯的系統(tǒng)( 與包含設(shè)計(jì)者傳統(tǒng)想要使用的所有特征相反):

              設(shè)計(jì)一個(gè)腳本系統(tǒng)最難的部份是知道何時(shí)該停止。一旦你完成了并開(kāi)始運(yùn)行,你發(fā)現(xiàn)有許多能夠利用它的系統(tǒng)。對(duì)于Sin,最初的主意只是要有一個(gè)比較容易的方法讓關(guān)卡設(shè)計(jì)者描述對(duì)象怎樣動(dòng)態(tài)的在環(huán)境中移動(dòng)。在項(xiàng)目的后期,我們也使用它來(lái)讓聲音和游戲事件與動(dòng)畫同步,在多個(gè)關(guān)卡跟蹤任務(wù)目標(biāo),控制HUD的布局和游戲內(nèi)部電腦控制臺(tái)用戶接口,描述人工智能如何對(duì)不同的情形產(chǎn)生反應(yīng),以及粒子系統(tǒng)。

              控制復(fù)雜度可能也是相當(dāng)?shù)睦щy。當(dāng)你把腳本的力量放進(jìn)有創(chuàng)造力的人們手中時(shí),他們開(kāi)始探究他們所能做的界限。時(shí)常,他們受啟發(fā)做一些剛好輕微超出系統(tǒng)能力范圍的事情。很容易陷入到這種增加‘僅僅再多一個(gè)特征’就允許他們做他們想做的事情之中。隨著語(yǔ)言增長(zhǎng),一個(gè)可能對(duì)最初的規(guī)格有意義的語(yǔ)言結(jié)構(gòu)變得嚴(yán)重過(guò)度擴(kuò)充了。在一些時(shí)候,重新思考系統(tǒng)變得有意義,但在那時(shí),你可能已經(jīng)積累了數(shù)量巨大的必須重新編寫的腳本。和FAKK2一樣,Sin遭受了這樣的損失。我沒(méi)有得到對(duì)腳本系統(tǒng)進(jìn)行大規(guī)模徹底檢查的機(jī)會(huì)直到我為Rogue's 'Alice'.重寫了腳本系統(tǒng)。

              阿們,吉姆。-- Raven已經(jīng)看到這個(gè)恰好在他們的ICARUS系統(tǒng)中出現(xiàn)了。ICARUS 實(shí)際上是一種與Jim在上面描述的相同種類的腳本系統(tǒng),而且負(fù)責(zé)在Star Trek: Voyager: Elite Force中的所有腳本事件。它在Soldier of Fortune II和Jedi Knight II : Outcast中被重復(fù)使用。為了解決系統(tǒng)需要處理的新問(wèn)題,這些問(wèn)題在最初的實(shí)現(xiàn)中沒(méi)有被預(yù)見(jiàn)/不需要,腳本系統(tǒng)的很多部分已經(jīng)被重新編寫了。


            可視化腳本系統(tǒng)
              第二種類型的腳本是可視化腳本系統(tǒng)。使用這種方法,而不是文本文件的編碼方式,實(shí)際上你能夠在真實(shí)的游戲環(huán)境中使用真實(shí)的角色建立你的腳本。你能夠追蹤角色在世界中行走的路徑,定義使用的動(dòng)畫,并且通常得到關(guān)于你的腳本實(shí)際上將看起來(lái)如何的更好的主意。它對(duì)我們已經(jīng)討論的非線性問(wèn)題沒(méi)有太大的真正的幫助,但它確實(shí)可以很快速地生成最初的腳本。

              其次,Jim談?wù)摿丝梢暬_本系統(tǒng)。

              可視化腳本系統(tǒng)確實(shí)有它們的用處,但往往實(shí)現(xiàn)更加困難,如果設(shè)計(jì)得很差,當(dāng)復(fù)雜度上升時(shí)就容易讓開(kāi)發(fā)者感到困惑。舉例來(lái)說(shuō),人工智能可以用一個(gè)流程圖似的結(jié)構(gòu)來(lái)進(jìn)行可視化的設(shè)計(jì)。你能非常容易地可視化地表現(xiàn)人的行為舉止方式,用盒子代表狀態(tài),箭頭代表轉(zhuǎn)化到其它狀態(tài),指示角色能夠從一個(gè)狀態(tài)轉(zhuǎn)換到另外一個(gè)狀態(tài)的方式。

              腳本的一種通常使用是在游戲世界中控制物體,指示他們他們?nèi)绾卧谑澜缰幸苿?dòng)。在一個(gè)編輯器中可視化地移動(dòng)物體到關(guān)鍵位置并播放整個(gè)運(yùn)動(dòng)的能力對(duì)一個(gè)設(shè)計(jì)者可能會(huì)更加直觀。然而,它確實(shí)有它的極限,因?yàn)閷⑿枰硗庖粋€(gè)接口來(lái)設(shè)計(jì)物體在它的移動(dòng)中必須作出的任何決定。那種能力是把腳本動(dòng)畫片斷和類似3DS Max或者M(jìn)aya 這樣的程序產(chǎn)生的動(dòng)畫區(qū)分開(kāi)來(lái)。

              在一些時(shí)候,使用者可能需要一些方法決定一個(gè)腳本為何沒(méi)有做他們所期望的事情。一些形式的除錯(cuò)工具能使這件工作非常容易。至少,決定哪些腳本正在運(yùn)行和腳本當(dāng)前位置的一些方法必需的。在腳本中檢查變量,開(kāi)始,停止,和單步執(zhí)行的能力也是有幫助的。通常,一個(gè)程序師能夠在他們的調(diào)試器中進(jìn)行除錯(cuò),但這個(gè)過(guò)程要比如果有一些內(nèi)建的腳本調(diào)試器可用時(shí)花費(fèi)的時(shí)間更長(zhǎng)。


              以上就是第8部份,在接下來(lái)的章節(jié)中我們將討論使用現(xiàn)成產(chǎn)品和定制的游戲引擎設(shè)計(jì)工具的功過(guò)得失,然后探究游戲控制機(jī)制,開(kāi)發(fā)游戲?qū)ο螅鸵恍┐碳び腥さ氖虑?(武器系統(tǒng))。










            第9部分: 現(xiàn)成產(chǎn)品與定做的游戲引擎設(shè)計(jì)工具,游戲特定主題


            現(xiàn)成產(chǎn)品與定做的設(shè)計(jì)工具
              我們從第8部份的腳本引擎來(lái)到這一章節(jié)中的許多主題,我們認(rèn)為那些鐵桿游戲玩家和有志成為游戲開(kāi)發(fā)者的那些人將會(huì)發(fā)現(xiàn)它們相當(dāng)有趣。我們將開(kāi)始討論現(xiàn)成產(chǎn)品與定制的設(shè)計(jì)工具。

              你的工具的選擇是你引擎設(shè)計(jì)的一個(gè)非常重要的部份,因?yàn)檫@是你將用來(lái)給你的游戲產(chǎn)生內(nèi)容的東西,是最耗時(shí)的部份。在這個(gè)過(guò)程中有助于節(jié)省時(shí)間和資源的任何東西都是好的。那些不能的東西就是糟糕的。在那里,那是容易的。

              當(dāng)然沒(méi)有那么容易。有比這更多的事情可能會(huì)立刻被注意到。你的工具集的選擇,和從工具到游戲的資產(chǎn)路徑比它聽(tīng)起來(lái)更有技巧得多,并受到很多因素的影響,比如,是否適宜手邊的工作,費(fèi)用,內(nèi)容生產(chǎn)者的熟悉,市場(chǎng)滲透,工具支持等等。當(dāng)考慮選擇現(xiàn)貨成品工具,或者即使當(dāng)開(kāi)發(fā)你自己的工具時(shí),記得開(kāi)發(fā)者實(shí)際在做工作,最好能夠做需要借助工具做的。一些現(xiàn)貨成品工具能在價(jià)格上達(dá)到那里,當(dāng)你陷入多個(gè)拷貝許可時(shí),費(fèi)用猛漲。

              然后就有誘人的可能性從頭制造你自己的工具,為你游戲和引擎的需要而設(shè)計(jì)。這當(dāng)然需要時(shí)間,和程序員大量的努力來(lái)產(chǎn)生在開(kāi)發(fā)者友好方式中所需要的東西。快速打造基于窗口的文件轉(zhuǎn)換器是一回事情,從頭建造一個(gè)完整的關(guān)卡設(shè)計(jì)工具又是另外一回事情。另一方面,如果你確實(shí)選擇這條道路,最后你會(huì)有游戲開(kāi)發(fā)者地帶其他人沒(méi)有的工具,因此你的東西將會(huì)看起來(lái)是獨(dú)特的。如今與眾不同是一件非常值得想望的事情,而且從群眾這些天起突出是一件非常令人想要的事物,產(chǎn)生所有的競(jìng)爭(zhēng)。

              當(dāng)然由于內(nèi)部的工具開(kāi)發(fā),你需要某人來(lái)做所有那些不可避免的小的改變和修正。但這里真正的意義是這是可能的。使用現(xiàn)成的工具,工具開(kāi)發(fā)者會(huì)很少因?yàn)槟阈枰囊恍┨卣鞫淖兯麄兊妮敵鑫募袷健_@樣你的東西最后看起來(lái)更加通用一些,否則你必須采用額外的步驟使用另外的工具來(lái)得到想要的結(jié)果,當(dāng)然會(huì)花費(fèi)開(kāi)發(fā)者更多的時(shí)間。

              值得記住的是如今許多有名的3D工具已經(jīng)有一段時(shí)間的歷史了,并且正在產(chǎn)生簡(jiǎn)直沒(méi)有錯(cuò)誤的產(chǎn)品,更重要的是,對(duì)他們所做的已經(jīng)有一定程度的經(jīng)驗(yàn)了。

              如果你選擇建造你自己的工具,多半你是,a) 重新創(chuàng)造車輪到某種程度 b) 陷入那些建造現(xiàn)成工具的人們已經(jīng)遇到過(guò)的相同的問(wèn)題之中,只是他們已經(jīng)解決了這些問(wèn)題。時(shí)常人們建造一個(gè)單一特定的工具花費(fèi)了相當(dāng)?shù)臅r(shí)間和努力,并產(chǎn)生了一個(gè)遠(yuǎn)遠(yuǎn)超出你自己的個(gè)人需求的工具。還有,他們有代表性地收編了一些你或者認(rèn)為是沒(méi)有用的,或者沒(méi)有時(shí)間自己實(shí)現(xiàn)的特征。加上他們典型地有吸收特征你或會(huì)沒(méi)有想有用,或沒(méi)有時(shí)間實(shí)現(xiàn)你自己. 這是第三方軟件無(wú)法爭(zhēng)辯的。


            插件和目的建造工具
              通常大多數(shù)的游戲開(kāi)發(fā)過(guò)程最終都是這樣的混合,自己開(kāi)發(fā)的文件轉(zhuǎn)換器工具,現(xiàn)成的內(nèi)容創(chuàng)造工具,和通常那些要增加一些必須的特殊功能的工具的一些附加插件。現(xiàn)成工具在提供你不可避免會(huì)需要的功能方面有很長(zhǎng)一段時(shí)間了,但是正如不可避免,總有一些很有用的,有幫助的,或者完全必須的東西你不能得到。一個(gè)小的插件可能是一個(gè)很好的替代品,而且時(shí)常那就是所走過(guò)的路。為特定目的建造的預(yù)處理程序也是可用的,比如把TGA文件轉(zhuǎn)換為一個(gè)對(duì)PS2友好的格式,或者那些相關(guān)的東西。

              如果你或你的公司打算建造某種類型游戲的工具,那么這些工具一般是從一個(gè)項(xiàng)目到一個(gè)項(xiàng)目地演變發(fā)展,而不是每次都從頭重新建造。如果你變換游戲類型,很好,那些產(chǎn)生具有每個(gè)多邊形命中能力的高分辨率模型的工具明顯地不是一款RTS(即時(shí)戰(zhàn)略)風(fēng)格游戲所必須的。

              Gil Gribb,Rave Software的技術(shù)帶頭人,對(duì)‘現(xiàn)成的工具’和‘自己動(dòng)手建造’的問(wèn)題是這么說(shuō)的:

              "自己開(kāi)發(fā)的工具有能夠根據(jù)自己產(chǎn)品的需要進(jìn)行定制的優(yōu)勢(shì),你擁有代碼,可以修正任何錯(cuò)誤或者增加任何的改進(jìn)。

              自制工具的缺點(diǎn)是建造和維護(hù)它們是非常昂貴的,通常成本要比現(xiàn)成工具高很多。在許多情況下,由于應(yīng)用程序范圍的緣故,建立自己的工具是完全不可能的,比如說(shuō)3D建模和動(dòng)畫軟件包或者位圖編輯軟件。"

              當(dāng)然,如果你想要游戲玩家能夠修改你的游戲,而且你自己建立了所有的工具,那么你就必須要向世界發(fā)布這些工具。這可能會(huì)引起一點(diǎn)點(diǎn)疑惑,記住建立你自己的工具的部分原因是你可以領(lǐng)先你的競(jìng)爭(zhēng)者。有時(shí)侯發(fā)布這些工具的源代碼甚至可能讓你獲益匪淺,這確實(shí)提供了一種創(chuàng)造內(nèi)容的方法。再次,Gil Gribb闡述這個(gè)主題:

              "我是支持發(fā)布幾乎所有的源代碼。我認(rèn)為我們沒(méi)有任何來(lái)自我們的競(jìng)爭(zhēng)者的害怕的事情,合法的業(yè)務(wù)不會(huì)想到竊取知識(shí)產(chǎn)權(quán)。游戲迷,業(yè)余游戲制作者,以及游戲的普及都能夠從發(fā)布的源代碼獲益。"

              好,我們的游戲引擎剖析系列到這里,當(dāng)然我們已經(jīng)特別討論了許多和引擎相關(guān)的主題,下面讓我們繼續(xù)討論一些與游戲特定相關(guān)的部分。


            游戲控制機(jī)制
              控制機(jī)制能夠?qū)﹂_(kāi)發(fā)中的游戲帶來(lái)巨大的差別,有時(shí)甚至表明你正在建立的游戲的種類或者風(fēng)格。

              嘗試在某個(gè)時(shí)候用gamepad玩一個(gè)即時(shí)戰(zhàn)略類游戲--它不只沒(méi)有樂(lè)趣。有時(shí)當(dāng)你被限制在一個(gè)特定的輸入裝置的時(shí)候,例如鼠標(biāo)和鍵盤,為你的游戲發(fā)明新的控制方法會(huì)是一個(gè)令人筋疲力盡的過(guò)程。當(dāng)Raven開(kāi)始開(kāi)發(fā)Heretic II時(shí)他們決定做的第一件事情之一就是為用鼠標(biāo)使用第三人稱照相機(jī)嘗試和找出一個(gè)直觀的方法。在這以前,大多數(shù)游戲采用的是Tomb Raider風(fēng)格的照相機(jī)(第三人稱預(yù)兆的追逐)他們發(fā)現(xiàn)這時(shí)常不能正確地工作,在很多情形下會(huì)給玩家?guī)?lái)挫折。照相機(jī)時(shí)常會(huì)得到任意的視角,如果可能的話移動(dòng)相機(jī),而且有時(shí)改變玩家的方向。

              假定他們的目標(biāo)對(duì)象是FPS游戲人群,Raven需要找到一個(gè)對(duì)FPS游戲玩家來(lái)說(shuō)直觀的控制烏鴉座(Corvus)的方式。他們這樣做了,但確實(shí)花費(fèi)了一些時(shí)間,和一些不同的方式—他們應(yīng)當(dāng)讓照相機(jī)固定在一個(gè)方向嗎,或者讓它是浮動(dòng)的嗎?大多數(shù)游戲開(kāi)發(fā)努力—除非一個(gè)確定類型游戲的一個(gè)沒(méi)有虛飾的實(shí)現(xiàn)—傾向于花費(fèi)一些研發(fā)找出物理控制裝置和游戲需要的內(nèi)部控制機(jī)制的最直接的合并。這里是一個(gè)暗示—一旦你發(fā)現(xiàn)一個(gè)方式很起作用,就堅(jiān)持下去。用這種方式控制游戲內(nèi)在的東西能把視野,直覺(jué),甚至游戲的焦點(diǎn)完全改變成你從未想要過(guò)的東西。發(fā)現(xiàn)起作用的東西,證明它起作用,然后就別管它。過(guò)分設(shè)計(jì)控制會(huì)導(dǎo)致特征偏離和可察覺(jué)的游戲概念問(wèn)題。

              像這類特征偏離的一個(gè)很好的例子可以在Independence War中看到。這款游戲有著如此多的模式,按鍵,等等,僅僅熟悉和操縱游戲都不可能。

              很明確這里的關(guān)鍵是簡(jiǎn)單。一個(gè)好的經(jīng)驗(yàn)法則是,在正常的游戲中,如果你的游戲需要比在普通的gamepad的按鍵或者你手上的手指更多的按鍵,那么一些事情需要被重做。注意, 我不是說(shuō)一款游戲不應(yīng)該有靈活性—Soldier of Fortune必定有許多可能的按鍵設(shè)定。但通常,當(dāng)你認(rèn)為它們大多數(shù)實(shí)際上都是不需要的時(shí)候Quake引擎有一個(gè)很好的方式。是的,你可以選擇你想要使用什么武器,但你不是必須這樣。游戲?qū)?huì)自動(dòng)地為你那樣做。這就是靈活性和過(guò)度設(shè)計(jì)之間的不同。如果游戲需要你按下某個(gè)鍵來(lái)選擇一個(gè)武器,那將會(huì)有問(wèn)題。你理解這個(gè)了嗎?

              控制機(jī)制不能被過(guò)高估價(jià) -- 一款游戲時(shí)常將會(huì)根據(jù)玩家覺(jué)得他們對(duì)事件或者主要角色有多少控制而獲得成功或失敗。如果控制被改變,重新定向,或僅僅簡(jiǎn)單地從他們哪兒移除,它能導(dǎo)致游戲自身缺乏參與,不用說(shuō),那是一件很糟糕的事情。在這上面花費(fèi)時(shí)間并讓它保持簡(jiǎn)單,將會(huì)有巨大的幫助。


            實(shí)體和照相機(jī)
              現(xiàn)在我們來(lái)到了引擎不太令人愉快的部份,也是定義得最少的部分。當(dāng)游戲運(yùn)行的時(shí)候,游戲在這個(gè)部分能變得極端地多出錯(cuò),耗時(shí)間,或僅徹底的極限。

              在這里我們所談?wù)摰氖怯螒蛞娴?"游戲" 部份。這個(gè)部分使用所有的其它技術(shù)讓一些事物顯示在屏幕上,到處移動(dòng),讓它對(duì)你產(chǎn)生反應(yīng)并且讓你對(duì)一些事物產(chǎn)生反應(yīng)。這個(gè)系統(tǒng)有許多方法,但現(xiàn)在我將緊扣Quake的方法因?yàn)槟鞘俏易钍煜さ摹?br>
              讓我們從實(shí)體開(kāi)始。這些可以被定義為‘游戲?qū)ο?#8217;。現(xiàn)在那不僅僅意謂你在屏幕上看見(jiàn)的模型,雖然實(shí)體確定地控制這些 -- 實(shí)體也可能是其他的事物。基本上它是游戲在任何給定時(shí)間需要知道的任何事物,例如讓事情繼續(xù)進(jìn)行的定時(shí)器,模型的碰撞檢測(cè)盒,特效,模型,游戲玩家,等等。

              甚至照相機(jī)都可能是實(shí)體(在幾乎所有Raven的產(chǎn)品中都是這樣)。照相機(jī)在世界中被分配一個(gè)有角度的原點(diǎn),它們每幀都被刷新并告知渲染器應(yīng)該從哪里得到它的視野數(shù)據(jù),and off we go。典型地實(shí)體是為了返回到游戲早先的狀態(tài)而被存儲(chǔ)和裝載的那些東西。通常在裝載過(guò)程中使用的方法是把游戲地圖裝載進(jìn)來(lái),好像你正在重新開(kāi)始一個(gè)關(guān)卡一樣,然后裝載所有存儲(chǔ)的實(shí)體,這樣他們就返回到游戲存儲(chǔ)時(shí)它們的狀態(tài)。Voila,即刻返回一個(gè)存儲(chǔ)的游戲。當(dāng)我理解Heretic II的方法時(shí)這并不是那么的容易—裝載/存儲(chǔ)幾乎比其他任何事情帶給我的問(wèn)題還多,特別是在協(xié)作模式。

            照相機(jī)有許多形式:

              自由形式:照相機(jī)能去任何地方
              腳本:照相機(jī)可以沿著一條設(shè)定的路徑前進(jìn)
              游戲時(shí)間:照相機(jī)有必須要遵循的定義的行為

              僅僅說(shuō)"嗯,我將僅僅跟隨主要的角色"是不夠的。這意謂你也可能需要讓照相機(jī)穿過(guò)墻壁,或讓它按一些方式移動(dòng)以致甚至引起一些胃的惡心。讓它沿著一些定義的上下運(yùn)動(dòng)路徑前進(jìn)也有益處,如同任何玩Descent游戲超過(guò)一小時(shí)的人可以告訴你的一樣。身體和頭部習(xí)慣于上下是一個(gè)靜態(tài)的變量,并當(dāng)它不是時(shí),他們不喜歡它。制作Quake 1的 Mike Abrash,曾經(jīng)告訴我即使當(dāng)它被定義,他仍然處理 的麥可 Abrash 地震 1,曾經(jīng)告訴我即使當(dāng)它被定義,他仍然從他們正制作的游戲感到運(yùn)動(dòng)惡心。他提到,對(duì)于他來(lái)說(shuō),離開(kāi)制作Quake 1一年時(shí)間才讓他的胃安定下來(lái)。啊哈,我們所作出的犧牲。


            武器系統(tǒng)
              游戲模塊的另外一個(gè)部份是武器系統(tǒng)。大多數(shù)的游戲有武器系統(tǒng)或類似的東西。 這是在世界中影響其他的物體,而且使他們對(duì)給定情形產(chǎn)生反應(yīng)的東西,--比如說(shuō)被射擊。通常武器系統(tǒng)由許多不同的類型組成;攻擊掃描,基于飛彈的,以及范圍形式。

              攻擊掃描是直接攻擊武器。在屏幕上他們產(chǎn)生的效果只是那樣,一個(gè)效果。當(dāng)使用它的時(shí)候,和武器的實(shí)際操作沒(méi)有任何關(guān)系。當(dāng)你用手槍開(kāi)火時(shí),子彈被認(rèn)為立即穿過(guò)世界并直接擊中在它運(yùn)動(dòng)軌跡上的任何人/事物。

              基于飛彈的武器有一個(gè)占用有限時(shí)間穿越世界的真實(shí)射彈,從而帶給對(duì)方一些可以躲避的時(shí)間。

              基于范圍的武器像手榴彈和炸彈一樣的東西,不必?fù)糁芯涂梢詡Φ侥悖荒阒皇潜仨毺幱诒ǚ秶鷥?nèi)。處在那種爆炸范圍內(nèi)的玩家受到飛濺損害。熔巖是另外一種形式的基于范圍的武器。

              那么你如何決定什么被擊中而什么沒(méi)有被擊中呢?很好,這個(gè)問(wèn)題把我們帶到了追蹤,我們將在接下來(lái)的物理學(xué)和人工智能章節(jié)更多的接觸追蹤。這是一組函數(shù)例程,當(dāng)給定世界中一條從A點(diǎn)到B點(diǎn)的直線時(shí),比如從槍的末端到預(yù)先定義的距離,它告訴游戲什么被擊中。追蹤很棒,但很昂貴,因?yàn)樗麄儽仨殞?duì)那條線上的所有多邊形進(jìn)行‘碰撞檢測(cè)’來(lái)看是否有什么地方被擊中,更不用說(shuō)模型和其它對(duì)象了。這也是一些物理學(xué)的工作方式,從一個(gè)給定的角色做一個(gè)筆直向下的跟蹤可以知道地板位于什么地方。肆意的濫用追蹤 — 如,在游戲的一幀中多次使用它們 -- 對(duì)于今天許多游戲的速度下降是有責(zé)任的。在Jedi Knight II:Outcast,他們的光刀戰(zhàn)斗已經(jīng)遇到了這個(gè)問(wèn)題,因?yàn)樗麄儾粌H需要知道光刀是否擊中了某處的什么和它現(xiàn)在的位置,而且對(duì)于它們之間的所有點(diǎn)都得這樣,他們對(duì)光刀做了多次追蹤。


              好吧,又一個(gè)章節(jié)結(jié)束了,僅僅剩下兩個(gè)章節(jié)了。下面我們介紹人工智能和搜索的更多細(xì)節(jié)。














            第10部分: 人工智能和導(dǎo)航(路徑發(fā)現(xiàn))


            人工智能(AI)
              我們上面已經(jīng)用了其他九個(gè)章節(jié)介紹了游戲引擎,現(xiàn)在讓我們深入到非常有趣和重要的人工智能主題。人工智能如今正在變成被談?wù)摰米疃嗟膬H次于游戲引擎渲染能力的游戲開(kāi)發(fā)領(lǐng)域之一,確實(shí)如此。直到大約兩年半以前,游戲似乎主要是在考慮你能夠渲染多少個(gè)多邊形,眼睛是多么的漂亮,和… 好…勞拉的胸部是多么的有彈性...既然我們現(xiàn)在已經(jīng)能夠渲染出非常真實(shí)的乳房,中心就開(kāi)始轉(zhuǎn)移到我們實(shí)際上用那些多邊形做什么了(即玩游戲)。因?yàn)樗o你提供實(shí)際玩游戲的刺激作用和參與游戲世界中正在進(jìn)行的事情,所以人工智能在這個(gè)領(lǐng)域非常關(guān)鍵。

              人工智能包括了全部的東西,從在Tetris中決定哪一塊新磚頭掉落(這很大程度上知識(shí)一個(gè)隨即數(shù)產(chǎn)生器), 一直到創(chuàng)造基于小組的策略游戲,這些游戲和你交互,并且實(shí)際上在你玩的時(shí)候向你學(xué)習(xí)。人工智能包含了許多規(guī)則,如果你(作為一個(gè)游戲開(kāi)發(fā)者)沒(méi)有花費(fèi)足夠多的時(shí)間讓它正確地工作,它會(huì)反過(guò)來(lái)在你屁股上咬一口。所以讓我們談?wù)撘恍┠男┮?guī)則?這樣你能更好地理解人工智能系統(tǒng)會(huì)確實(shí)是多么的復(fù)雜。為了避免法律上的糾紛,我們將使用一個(gè)假設(shè)的游戲而不是一個(gè)真實(shí)的游戲作為例子。

              假設(shè)我們的游戲中有壞份子生活在3D世界中,干著他們的事情,而且如果你打攪了他們的正常次序他們就會(huì)反抗你(玩家)。你必須決定的第一件事情就是他們正在從事的到底是什么事情呢?他們正在守衛(wèi)什么東西嗎?在巡查?在計(jì)劃一個(gè)聚會(huì)?在購(gòu)買食品雜貨?在整理床鋪?建立行為的基線是游戲開(kāi)發(fā)者的工作之一。一旦有了這個(gè),你就總有NPC(非玩家角色)或計(jì)算機(jī)控制的‘人’能夠恢復(fù)去做的事情,玩家與他們的交互就應(yīng)當(dāng)能被完成。

              一旦我們知道一個(gè)NPC角色需要做什么 — 比如它在守衛(wèi)一扇門,并且在這個(gè)區(qū)域小巡邏,NPC也必須有‘世界意識(shí)’。游戲設(shè)計(jì)者需要決定NPC的人工智能將如何看見(jiàn)世界,和它的知識(shí)范圍。你將會(huì)僅僅說(shuō)“計(jì)算機(jī)知道正在進(jìn)行的每件事情” 嗎?這通常被認(rèn)為是一件糟糕的事情,因?yàn)榉浅C黠@計(jì)算機(jī)能夠看見(jiàn)和聽(tīng)見(jiàn)你不能看見(jiàn)和聽(tīng)見(jiàn)的事情,這被當(dāng)成是在作弊。不是一種有趣的經(jīng)歷。或者你將模擬他的視野,這樣他只能夠?qū)λ芸匆?jiàn)的事物作出反應(yīng)嗎?當(dāng)有墻壁出現(xiàn)時(shí)這里就有問(wèn)題了,因?yàn)槟汩_(kāi)始進(jìn)入那些我在第九部分提到的‘追蹤’例程,看看NPC是否試圖對(duì)被墻壁擋住的人作出反應(yīng)。這是一個(gè)很明顯的人工智能問(wèn)題,但是當(dāng)涉及到門和窗戶時(shí),這個(gè)甚至變得更加復(fù)雜了。

              當(dāng)你開(kāi)始為AI刺激例程增加聽(tīng)覺(jué)意識(shí)時(shí),這依然變得更加復(fù)雜了。但是,這個(gè)意識(shí)是那些關(guān)鍵的“小事情”之一,這些使得假想的游戲世界似乎更加真實(shí),或者能夠去除懷疑的懸念。如果你碰到過(guò)這樣的事情,請(qǐng)舉手:你在槍戰(zhàn)中跟一個(gè)NPC交戰(zhàn),免除了一個(gè)NPC,你繞著角落行走并遇到了另外一個(gè)NPC依然保持他的缺省行為模式,沒(méi)有意識(shí)到剛剛發(fā)生的事情。現(xiàn)在,槍是嘈雜的事物,槍戰(zhàn)可能已經(jīng)明顯地提醒了一個(gè)“傾聽(tīng)”的NPC有些事情正在進(jìn)行。避免這種事情的技巧在于找到一個(gè)有效的方式來(lái)決定聲源(即你武器的發(fā)射)的距離是否足夠接近到NPC能夠聽(tīng)見(jiàn)。

              接下來(lái)就是決策例程。當(dāng)我們的巡邏NPC角色能夠聽(tīng)到但不能看見(jiàn)某物時(shí),你試圖實(shí)現(xiàn)什么樣的行為呢?他去尋找它嗎?不理睬它?你如何決定什么是重要的聲音他應(yīng)該去或者不去調(diào)查?如同你看見(jiàn)的一樣,這會(huì)很快變得非常的復(fù)雜。有很多方法來(lái)建造處理這些事情的代碼,但通常這樣是一個(gè)好主意,建立一個(gè)不是對(duì)特定的NPC而是對(duì)所有的NPC都起作用的系統(tǒng),該系統(tǒng)基于你能夠在游戲引擎以外的文本文件中建立的屬性。這樣就不需要程序員為一個(gè)給定的角色而改變AI,并且如果你對(duì)游戲代碼做了改動(dòng),它將立即自動(dòng)地應(yīng)用到所有的角色,這在大多數(shù)情況下是一件好事情。

              其他的世界意識(shí)問(wèn)題會(huì)冒出來(lái),比如這樣的情形,兩個(gè)守衛(wèi)彼此緊挨著站立,你用狙擊武器干掉了一個(gè),而另外一個(gè)站在哪兒完全不知已經(jīng)發(fā)生的事情。再者,遵守真實(shí)世界行為的細(xì)節(jié)是一款好游戲和一款偉大游戲的之間的區(qū)別。

              讓我們說(shuō)你已經(jīng)把所有的刺激-響應(yīng)部分準(zhǔn)備好了—你已經(jīng)掃描了世界,決定NPC應(yīng)當(dāng)對(duì)正在進(jìn)行的一些事情作出反應(yīng)—他聽(tīng)到了玩家角色發(fā)出了聲響—并且你(游戲開(kāi)發(fā)者)決定了他應(yīng)當(dāng)對(duì)這個(gè)做些什么—他將去調(diào)查。現(xiàn)在更加復(fù)雜的事情來(lái)了。他如何離開(kāi)現(xiàn)在的位置,到達(dá)他認(rèn)為發(fā)出聲音的地方,而不會(huì)想通常的數(shù)字傻瓜一樣跑到墻壁里面,碰到家具呢?繼續(xù)往下看…


            有關(guān)正確的路徑 --- 世界導(dǎo)航
              快速,準(zhǔn)確的世界導(dǎo)航( 也叫做路徑-發(fā)現(xiàn)) 近來(lái)已經(jīng)成為游戲開(kāi)發(fā)者的圣杯。 讓它看起來(lái)非常信服是一件非常困難的事情。你需要有局部世界的地理知識(shí)—墻壁的位置,臺(tái)階,懸崖和建筑物等的邊緣。你也需要世界中的對(duì)象的知識(shí)—比如家具,汽車,尤其是其他人的位置。真正最后的因素是問(wèn)題所在,一會(huì)兒我們將回到這一點(diǎn)上。

              世界導(dǎo)航通常被分為兩個(gè)領(lǐng)域,世界導(dǎo)航和局部導(dǎo)航。二者實(shí)際上只是范圍上的區(qū)別,但大多數(shù)的程序員分別對(duì)待它們,因?yàn)檫@樣處理起來(lái)容易一些。世界導(dǎo)航例程處理理解房間,門和一般的地理學(xué),并計(jì)算出讓玩家或者角色從世界中的A點(diǎn)到達(dá)B點(diǎn)的一條路徑。“它將讓你從A點(diǎn)到達(dá)B點(diǎn)”,這是一句很容易說(shuō)的話,不是嗎?說(shuō)起來(lái)容易,但做起來(lái)很困難。理解世界是一個(gè)非常復(fù)雜問(wèn)題,我已經(jīng)看到過(guò)許多嘗試過(guò)的解決辦法。QuakeIII的機(jī)器人遵照建造的預(yù)先處理過(guò)的地圖,一般的說(shuō)法,使用原來(lái)地圖的地面。預(yù)處理器檢測(cè)地面元素,由地圖建造者作上標(biāo)記,并自己建造一個(gè)只使用地面的世界簡(jiǎn)化地圖。機(jī)器人并不關(guān)心墻壁,因?yàn)樗麄儚牟唤咏鼈儯拖袼麄冏裾盏孛娴牡貓D一樣,設(shè)計(jì)上已經(jīng)把避免墻壁構(gòu)造在里面了。

              其他方法在地圖本身里面建造一些小的結(jié)點(diǎn),AI可以追隨它們。這些結(jié)點(diǎn)通常被建造在彼此的視線里面,有從一個(gè)結(jié)點(diǎn)到其他所有結(jié)點(diǎn)的連接,角色AI能夠直接‘看見(jiàn)’,所以你就確保了從一個(gè)結(jié)點(diǎn)移動(dòng)到另外一個(gè)結(jié)點(diǎn)時(shí)AI不會(huì)試圖穿越墻壁。如果有門或者降落物,你能夠事先用這些結(jié)點(diǎn)對(duì)路徑的信息編碼,于是NPC能夠采用適當(dāng)?shù)男袨椤群螂娞荩蜷_(kāi)一扇門,或者從一點(diǎn)跳到另外一點(diǎn)。這實(shí)際上是HereticII使用的系統(tǒng),也是Raven在他們其他的大多數(shù)游戲中使用的系統(tǒng)。

              關(guān)于這個(gè)主題,3D Realms的Jess Crable,現(xiàn)在為Duke Nukem Forever工作,如是說(shuō):

              "導(dǎo)航在許多方面是個(gè)巨大的挑戰(zhàn),主要是當(dāng)游戲中有大量正在發(fā)生的事情和一些非計(jì)劃性的東西,比如障礙。為了避免和(或)真實(shí)地對(duì)非計(jì)劃性的障礙物導(dǎo)航(例如像另外的AI),AI需要很好地知道正在它周圍發(fā)生的事情。比較而言另外一個(gè)巨大的挑戰(zhàn)就是真實(shí)感。如果AI正在表現(xiàn)玩家在實(shí)際生活中看到的一些東西,比如說(shuō)一個(gè)人,或者一條狗, 那么讓它看上去真實(shí)可信就更加困難。"

              然后就是局部導(dǎo)航。我們可能有一條路徑讓我們的 NPC 從他在世界中的位置,移動(dòng)到他認(rèn)為聽(tīng)到聲音的地方,但你不能盲目地按照這個(gè)執(zhí)行并期望得到看起來(lái)不錯(cuò)的結(jié)果。這種性質(zhì)的路徑傾向于非常特定于一個(gè)給定的目的。當(dāng)你沿著走廊從一個(gè)房間跑到另外一個(gè)房間時(shí),它很好,但如果你試圖指導(dǎo)他穿越一個(gè)巨大的房間時(shí),路徑結(jié)點(diǎn)方法容易最終得到一些看起來(lái)很奇怪的發(fā)現(xiàn)路徑。這些路徑也不是動(dòng)態(tài)的。因?yàn)樗麄儽活A(yù)先建造,他們不容易考慮到世界的任何動(dòng)態(tài)變化。桌子可能有被移動(dòng)過(guò)了,椅子被破壞了,墻壁被摧殘,當(dāng)然,人們會(huì)移動(dòng)。這就是局部導(dǎo)航不同于世界導(dǎo)航的地方。它必須考慮局部世界并導(dǎo)航NPC在里面穿越。它必須知道周圍的環(huán)境,存在哪些可以選擇的路徑,并決定選擇哪一條。

              在局部導(dǎo)航中最大的問(wèn)題是其他的NPC。給定一個(gè)發(fā)現(xiàn)路徑的具體例程,如果你在相同的一般區(qū)域中有不止一個(gè)NPC,他們都試圖到達(dá)世界的同一地點(diǎn),結(jié)果是他們都非常容易有相同的路徑。然后他們?cè)噲D沿著這個(gè)路徑行進(jìn),結(jié)果彼此遇到一起,然后花費(fèi)他們所有的時(shí)間試圖將彼此分開(kāi),并且一旦成功地分開(kāi)了,他們?cè)俅卧噲D到達(dá)目標(biāo),然后我們又再次看到同樣的事情發(fā)生。這一切看起來(lái)都是非常的愚蠢,這不是大多數(shù)人想要的效果。所以需要一些路徑發(fā)現(xiàn)中的變化來(lái)避免這種情形,需要一些妥善處理避免的代碼。有大量能夠幫助解決這種情形的算法。


            人工智能和角色動(dòng)畫問(wèn)題
              當(dāng)然,當(dāng)角色自己在世界中行走時(shí)你必須完全地決定你想要角色播放什么動(dòng)畫。聽(tīng)起來(lái)無(wú)足輕重?不是的。關(guān)于這個(gè)主題,Raven的 Chris Reed—Soldier of FortuneII使用名為L(zhǎng)ICH的AI系統(tǒng)的現(xiàn)在的負(fù)責(zé)人—如是說(shuō):

              "此刻我能告訴你,我們?cè)谄交苿?dòng)上正有著最大的困難。在一個(gè)多丘陵的長(zhǎng)滿草的叢林中試圖讓五個(gè)角色在彼此附近行走是一個(gè)非常困難的問(wèn)題。讓底層系統(tǒng)完美是重要的,因?yàn)槌墙巧谳^低層次上(避免墻壁,適當(dāng)?shù)膭?dòng)畫)看起來(lái)真實(shí),他們不能夠有效地表達(dá)任何較高層次決定的智能。由于這個(gè)單獨(dú)的原因,動(dòng)畫和底層的移動(dòng)是最重要的和最難實(shí)現(xiàn)的。它確實(shí)需要完美。"

              因此我們已經(jīng)讓我們的角色從A點(diǎn)到達(dá)了B點(diǎn),他自己穿越世界,在途中避免障礙物,正確播放動(dòng)畫,現(xiàn)在到達(dá)了這里。他看見(jiàn)了你。接下來(lái)做什么呢?很明顯更多的是作出決策。他將向你射擊。太棒了。你回應(yīng)射擊。現(xiàn)在干什么?當(dāng)他試著逃走的時(shí)候,現(xiàn)在你再次經(jīng)歷全部同樣的事情。

              為了讓這些情形看起來(lái)令人信服,你看見(jiàn)了這里必須要處理的大量問(wèn)題。如果你建立你的AI使用沒(méi)有動(dòng)畫的行為讓NPC執(zhí)行,這能被混合。一些Soldier of Fortune中的AI就是這樣的例子。他們受到了指責(zé),因?yàn)閴募一餂](méi)有以適當(dāng)?shù)姆绞綄?duì)刺激作出反應(yīng)。當(dāng)他們明顯應(yīng)該這樣做的時(shí)候,敵方NPC不掃射,或者不逃跑。部分問(wèn)題是他們沒(méi)有掃射敵人NPC的動(dòng)畫,或者讓他們往回跑,因?yàn)榭臻g的問(wèn)題。因此世界上所有最偉大的AI代碼都不能夠解決這個(gè)問(wèn)題。這是所有要考慮的重要事情。

              想知道隱藏的難點(diǎn)嗎?看看我前面所有的描述,然后試著將它應(yīng)用到一組NPC上,這些NPC彼此必須說(shuō)話,設(shè)定目標(biāo),彼此溝通,但不妨礙彼此的方式。一旦你這么做了,試試那些代碼,作為玩家的隊(duì)友做上面所描述的這些,然而不要在槍戰(zhàn)中妨礙他。現(xiàn)在這是復(fù)雜的。然后這成為樂(lè)趣。這是最困難的部分。Raven的 Chris Reed關(guān)于AI‘感覺(jué)’的一些評(píng)論:

              "我認(rèn)為反饋是AI的一個(gè)極大的問(wèn)題。如果角色對(duì)于他周圍環(huán)境的變化不產(chǎn)生反應(yīng),游戲的真實(shí)感就被完全打破了。這有許多明顯的例子(聽(tīng)見(jiàn)槍炮聲,看見(jiàn)同伴被擊中...),以及一些更加微妙的事情(當(dāng)兩個(gè)人通過(guò)門廳時(shí)看著彼此并點(diǎn)頭致意)。玩家是樂(lè)意接受一些生硬和可預(yù)測(cè)性的,但是這些事物容易把游戲帶到現(xiàn)實(shí)生活。"

              并且Jess Crable 贊同:

              "平衡是非常重要的… 對(duì)玩家將會(huì)有多大的樂(lè)趣至關(guān)重要,但還有其他的問(wèn)題要平衡。游戲玩家時(shí)常說(shuō)他們想在游戲中看見(jiàn)更加真實(shí)的人工智能。然而,太多的真實(shí)感開(kāi)始把樂(lè)趣帶走。在這兩者之間必須要有一個(gè)好的平衡。變化和隨機(jī)同樣也很重要—行為的變化,和保持在可信范圍內(nèi)的一定程度的不可預(yù)測(cè)性。"


            游戲規(guī)則與自然發(fā)生的游戲
              在我們關(guān)于AI的所有描述中,我們采用的是FPS的方式。有不止一種的AI。我們已經(jīng)描述的是處理3D世界一組規(guī)則。AI遠(yuǎn)遠(yuǎn)不止這些。時(shí)常最好的AI實(shí)際上非常的簡(jiǎn)單。它就是一組規(guī)則,玩家必須響應(yīng)和處理的響應(yīng)(或開(kāi)始)動(dòng)作的規(guī)則。

              這里應(yīng)當(dāng)處理一個(gè)被稱為“自然發(fā)生的游戲”的專業(yè)術(shù)語(yǔ)。 自然發(fā)生的游戲本質(zhì)上創(chuàng)造游戲?qū)⒆袷氐囊?guī)則,那將會(huì)造成游戲程序員不能預(yù)見(jiàn)的情形。

              舉例來(lái)說(shuō),象棋能被認(rèn)為是自然發(fā)生的游戲。有一組規(guī)則,但游戲能夠陷入各種程序員不能夠以個(gè)別方式處理的情形。你不能為每一種可能的棋局情形編碼規(guī)則。很清楚,游戲玩家每次不會(huì)總是面臨相同的游戲情景。一定程度上,進(jìn)行中的游戲情形會(huì)根據(jù)他的行動(dòng)而發(fā)生變化。Black and White是這種情形的一個(gè)完美的例子,和The Sims一樣—游戲有它自己的規(guī)則,但你如何運(yùn)用和調(diào)和他們是你自己的事情。實(shí)際上,你在玩游戲的過(guò)程中創(chuàng)造著游戲,而不是照著游戲設(shè)計(jì)者/程序員已經(jīng)為你定義的路線進(jìn)行。

              有可能把基于規(guī)則的,自然發(fā)生的游戲方式和FPS環(huán)境混合在一起。Half Life中的一些海軍陸戰(zhàn)隊(duì)士兵的行為就是這樣做的—壓制火力和側(cè)翼攻擊從設(shè)定的規(guī)則中動(dòng)態(tài)完成。它看起來(lái)是動(dòng)態(tài)的,而且一定程度上它是這樣。然而,在FPS世界中僅僅有一組規(guī)則時(shí)常是不夠的。幾何和其他AI時(shí)常能夠打敗簡(jiǎn)單的規(guī)則,這讓保持正確并依然有趣變得更加困難。所以對(duì)那些可憐的AI程序員有一些同情心吧。他們的工作不容易。


              好吧,下面還有一個(gè)章節(jié),僅僅還剩下一個(gè)章節(jié)了。在最后的章節(jié)里,我們將討論頭頂顯示,菜單系統(tǒng),游戲定制和配置,游戲引擎版權(quán)與建造,最后是游戲“mods”。











            第11部份: 最后的章節(jié)


            前端
              你已經(jīng)看到了菜單系統(tǒng),你可能理解游戲內(nèi)的頭頂顯示(HUDs)時(shí)常是游戲經(jīng)歷中被忽視和誹謗的部分。最近,這個(gè)領(lǐng)域開(kāi)始被給人印象非常深刻的Black and White所關(guān)注,這款游戲?qū)嶋H上沒(méi)有HUD。在Peter Molyneux經(jīng)歷了Dungeon Keeper以后,它在屏幕上大量的圖標(biāo),他決定游戲的大部分被這些圖標(biāo)占用了,主要的屏幕沒(méi)有被足夠利用。因此他決定廢除所有這些東西。Peter邁了大膽的一步,我們?yōu)槟愫炔省:懿恍遥@種方式適用于B&W這類風(fēng)格的游戲,但它并不總是對(duì)其他種類的游戲有用。

              大體而言HUDs應(yīng)該是不引人注意的,只提供你需要的關(guān)鍵信息;這本身會(huì)在設(shè)計(jì)團(tuán)隊(duì)中引發(fā)爭(zhēng)議。Soldier of Fortune的最初設(shè)計(jì)在屏幕上有一個(gè)圖標(biāo),當(dāng)被擊中時(shí)向你準(zhǔn)確顯示身體的哪個(gè)部位被擊中。當(dāng)他們決定他們不準(zhǔn)備為不同身體部位的傷害而處罰玩家時(shí),最后這個(gè)被丟棄了。在一些早期的Soldier of Fortune的屏幕截圖上,依然能夠在屏幕的右上角看見(jiàn)這個(gè)圖標(biāo)。

              在一個(gè)完美的世界中HUD是可配置的,因此你能決定顯示什么,在哪里顯示,顯示多久。如果你覺(jué)得不需要局部雷達(dá),那么它應(yīng)當(dāng)可以被移除掉。任何顯示的HUD信息應(yīng)當(dāng)有一定程度的alpha(透明度),因此如果需要你能透過(guò)它們看見(jiàn)后面的事物。

              說(shuō)到配置,我是一個(gè)游戲個(gè)人設(shè)定的十足的狂熱者。因?yàn)闆](méi)有即時(shí)存儲(chǔ)設(shè)備存儲(chǔ)配置文件,在游戲機(jī)游戲上不是廣泛地可以獲得配置,這足夠公平。但是隨著PS2和Xbox硬盤驅(qū)動(dòng)器的來(lái)臨,我期待在將來(lái)看見(jiàn)配置被更多地使用。能夠被定制的每件事物都應(yīng)當(dāng)這樣,如同我看見(jiàn)的一樣。很明顯,也應(yīng)當(dāng)為每件事物提供合理的缺省配置,因此玩家不必一屏一屏地進(jìn)行枯燥的選擇過(guò)程---一會(huì)兒我們將更多地討論這個(gè)---玩家應(yīng)當(dāng)能夠根據(jù)個(gè)人的喜好和可獲得的計(jì)算能力定制游戲經(jīng)歷。

              回到缺省事物,保持必需的修改最小化非常重要。作出最少的決定而快速進(jìn)入游戲總是一件好事情。Mortal Kombat,甚至QuakeIII都有一個(gè)非常快速的游戲進(jìn)入系統(tǒng)。少許選擇,然后你就進(jìn)入游戲了。這并不意味著你不能有一個(gè)接一個(gè)的菜單允許你改變每件事物,但它們不應(yīng)當(dāng)是必需的且應(yīng)當(dāng)已經(jīng)有合理的缺省設(shè)置了。如果甚至在你進(jìn)入游戲以前你必須用14個(gè)屏幕設(shè)置一個(gè)角色,可能是第一次你可能沒(méi)有關(guān)于你正在選擇的線索而且僅僅會(huì)做任何事情以通過(guò)屏幕,可能做了一些會(huì)極大影響初始游戲體驗(yàn)的事情。而且有可能它將會(huì)是不利的影響,作為一個(gè)游戲程序員/設(shè)計(jì)者,我在這里告訴你無(wú)論你做任何事情,讓玩家第一次選擇一些愚蠢的事物,無(wú)需讓它更糟糕你就會(huì)有足夠的機(jī)會(huì)制造很差的第一印象。

              藉由關(guān)于配置和HUDs(連同前面十個(gè)章節(jié)的大量信息)的簡(jiǎn)要論述,我們最終結(jié)束了關(guān)于現(xiàn)代游戲引擎的主要建造元素的討論。當(dāng)然,依賴于游戲的類型和誰(shuí)在制作它們,每個(gè)特定的游戲?qū)@個(gè)清單有它自己的添加(或者減少)。然而,有一些對(duì)于游戲引擎實(shí)際上不是引擎設(shè)計(jì)部分的其他元素,但是它們卻需要一些關(guān)注。


            游戲引擎許可與組件
              如今如果你要制作一款游戲,時(shí)常最快的開(kāi)始方式就是購(gòu)買現(xiàn)有的游戲引擎許可證并在此基礎(chǔ)上開(kāi)發(fā)---這就是Raven所做的事情,最近使用Quake3引擎編寫了Star Trek Elite Force。Half Life基于Quake 1引擎,Deus Ex基于Unreal,這個(gè)清單還在繼續(xù)。如今有兩種許可證方式---一個(gè)完全的游戲引擎(或游戲操作系統(tǒng)如Jason Hall授予LithTech),或者一組給定問(wèn)題的部分解決方案。這方面一個(gè)好的例子會(huì)是RenderWare,這是一個(gè)渲染場(chǎng)景的部分解決方案并給你提供一些物理。你不能僅僅拍著一些模型并把它們稱為完成了的游戲---還需要有聲音系統(tǒng),游戲機(jī)制,等等。但它確實(shí)給了你一個(gè)建立游戲的堅(jiān)實(shí)基礎(chǔ)。還記得我在渲染和物理學(xué)章節(jié)提到的所有數(shù)學(xué)知識(shí)嗎?很好,這樣你就避免了所有那些東西。

              藉由LithTech,Unreal和Quake,你確實(shí)得到了完全的解決方案 -- 或至少是創(chuàng)始者為他們的游戲所需要的全部解決方案。記住QuakeIII是可以多人玩的,不時(shí)建立在單人游戲的基礎(chǔ)之上的比如說(shuō)Unreal Tournament。使用QuakeIII,你失去了單人游戲需用的某些系統(tǒng),像讀取/存儲(chǔ),腳本等等。你只是的到了Id公司制作一款游戲需要的東西,而不一定就是你所需要的東西。有時(shí)侯如果系統(tǒng)的一個(gè)局限恰好是你所需要的東西時(shí),這可能是一個(gè)真正的缺點(diǎn)。給Star Trek Voyager加入讀取/存儲(chǔ)和腳本:Elite Force不是野餐,但是必須的。然而,使用Quake3引擎依然是領(lǐng)先的開(kāi)端。

              Unreal有名的Tim Sweeney 對(duì)于今天一些流行的預(yù)先打包的游戲引擎解決方案有一些評(píng)論。

              "我認(rèn)為我能公平地比較游戲引擎 (Quake,Unreal等) 和游戲組件如 RenderWare 和 Karma。游戲引擎是包含游戲開(kāi)發(fā)的所有技術(shù)方面的組織嚴(yán)密的框架:渲染,編輯工具,物理學(xué),人工智能,網(wǎng)絡(luò),等等。

              它們針對(duì)那些想要一個(gè)完全的,現(xiàn)成的解決方案的開(kāi)發(fā)者,以便他們能夠把精力集中在游戲可玩性和內(nèi)容上。像RenderWare這樣的游戲組件針對(duì)那些正在開(kāi)發(fā)他們自己的技術(shù)但不想在一些已經(jīng)很完善的技術(shù)領(lǐng)域做重復(fù)開(kāi)發(fā)的開(kāi)發(fā)者。

              游戲引擎有解決游戲開(kāi)發(fā)中全部技術(shù)問(wèn)題的優(yōu)點(diǎn),有容易把一些包括游戲類型的假設(shè)建立在里面的缺點(diǎn)。舉例來(lái)說(shuō),Unreal已經(jīng)被用來(lái)制作第一人稱射擊游戲,第三人稱動(dòng)作游戲,角色扮演游戲,甚至彈球游戲。但是沒(méi)有人用它制作飛行模擬類游戲—它不是適合這種游戲的技術(shù)。游戲引擎帶著完整的源代碼而來(lái),這是祝福 ( 你能完全看見(jiàn)內(nèi)部正在發(fā)生什么,你可以自由地根據(jù)你的需要擴(kuò)充它),也是詛咒 (如果你改變它,你將必須把變化合并進(jìn)新的版本之內(nèi))。

              游戲組件有解決所關(guān)注領(lǐng)域的技術(shù)問(wèn)題的優(yōu)點(diǎn),如渲染或者物理學(xué),不用花費(fèi)大量的時(shí)間在這方面就可以比典型的開(kāi)發(fā)者做得更好。他們的缺點(diǎn)是把這些組件整合進(jìn)你的引擎其余部分就是你自己的事情了,這有時(shí)候會(huì)相當(dāng)復(fù)雜。游戲組件一般沒(méi)有完整的源代碼伴隨,因此并不總是很清楚他們內(nèi)部做了些什么。"

              謝謝Tim,很精妙的分析。


            建立你自己的游戲引擎?
              你可能建立自己的引擎而不是購(gòu)買許可證。這避免了誰(shuí)擁有什么,版稅等所有的法律糾紛,而且如果你產(chǎn)出了質(zhì)量足夠好的東西,你甚至能夠向別人出售許可證。然而,正如已經(jīng)指出的那樣,這需要時(shí)間和金錢來(lái)完成,更不用說(shuō)絕對(duì)優(yōu)秀的程序員了。LithTech 已經(jīng)發(fā)展了很多年,與Unreal類似。很有趣,主要是因?yàn)樽兓挠布虯PI版本,實(shí)際上Unreal最初的版本花費(fèi)了四年時(shí)間才完成。當(dāng)他們剛開(kāi)始的時(shí)候,軟件渲染是唯一的游戲。當(dāng)開(kāi)發(fā)正在繼續(xù)的時(shí)候,3dfx帶來(lái)了Glide,然后是Nvidia的TNT顯卡(從那時(shí)起硬件和APIs確實(shí)有了更多的進(jìn)步)。這就是它為何支持這么多不同的渲染途徑的原因。當(dāng)然在一個(gè)相同的引擎內(nèi)支持所有這些是一場(chǎng)編碼惡夢(mèng),但那是另外的事。每個(gè)引擎有模塊化的方式, 并且當(dāng)一個(gè)模塊---比如說(shuō),腳本---變得過(guò)時(shí)了或者需求變化了,你只需要把它抽出來(lái)并開(kāi)始做一個(gè)新的模塊。

              Quake引擎經(jīng)歷時(shí)間有更加完整的進(jìn)化發(fā)展。相應(yīng)于Id公司下一個(gè)游戲的一組需求,當(dāng)John Carmack創(chuàng)造了在當(dāng)時(shí)的硬件上運(yùn)行最快的東西時(shí),引擎的每個(gè)版本都經(jīng)過(guò)了完全的重寫。QuakeII完全重寫了不少于四次,我個(gè)人看到了QuakeIII的機(jī)器人代碼的三個(gè)不同的版本。其他的開(kāi)發(fā)者也沒(méi)有能夠避免這種情形。John Scott,建造了Soldier of Fortune II的地表系統(tǒng),曾對(duì)我提到,在動(dòng)態(tài)地表生成上他曾嘗試了許多方法讓物理學(xué)正確地工作。

              建造技術(shù)或者完整的引擎不是件容易的事情。當(dāng)今的游戲引擎需要許多,許多的系統(tǒng),就如同許多人們嘗試創(chuàng)造‘下一個(gè)大的引擎’時(shí)所發(fā)現(xiàn)的那樣,從屏幕上文本的簡(jiǎn)單顯示到高級(jí)人工智能。并且如我前面提到的,不斷發(fā)展的新技術(shù)使得建造一個(gè)快速,高效的引擎是一個(gè)變化的目標(biāo)。事實(shí)上,我見(jiàn)到有人僅僅為了讓一個(gè)帶alpha的紋理正確地顯示而在PS2的混合模式上花了四天時(shí)間。

              值得考慮的其他引擎有Garage Games的Tribes 2引擎---被稱為The Torque Game Engine。我的理解是它可以收取微小數(shù)量的許可費(fèi)用,將來(lái)有一些版稅協(xié)議。這是的確值得考慮的事情。你可以在這里看到這個(gè)引擎的特征細(xì)節(jié)http://www.garagegames.com/index.php?sec=mg&mod=v12&page=features 。 然后就是Serious Sam 引擎。這也是需要許可證的,的確值得看一看。如果你對(duì)它有興趣的話,可以聯(lián)系God Games---他們應(yīng)當(dāng)可以給你指明正確的方向。

              在網(wǎng)絡(luò)上有一些你可以下載的自由引擎---首先想到的是Crystal Space引擎。你可以從這里下載http://sourceforge.net/projects/crystal ,并在你的游戲中隨意使用。這不是一個(gè)專業(yè)的引擎,但看看所有的部分如何結(jié)合在一起時(shí)常是一個(gè)好的學(xué)習(xí)經(jīng)歷。

              還有就是最初的Quake Engine,現(xiàn)在已經(jīng)被Id公司開(kāi)放源代碼。對(duì)于任何有抱負(fù)的游戲程序員來(lái)說(shuō)這是一個(gè)很好的開(kāi)端----下載它,編譯,開(kāi)始調(diào)整。值得記住的是,這個(gè)擎是許多年以前的了,與Quake III或者新的Doom沒(méi)有多少相似性。重復(fù)一遍,它確實(shí)是個(gè)好的開(kāi)始。你能從這里找到發(fā)現(xiàn)好的資源網(wǎng)頁(yè)http://www.inside3d.com/qip/home.shtml

              確實(shí),這一切都是時(shí)間與金錢的事情。如果你沒(méi)有時(shí)間開(kāi)發(fā)一個(gè)新的引擎,就不要介意花錢使用第三方的引擎,去購(gòu)買一個(gè)吧。注意,對(duì)于要求使用他們引擎的團(tuán)隊(duì),如今大多數(shù)引擎許可團(tuán)體有很合理的途徑。盡可能地讓許多人們使用他們的技術(shù),因此這種經(jīng)驗(yàn)變成了工業(yè)標(biāo)準(zhǔn),這對(duì)他們有好處。


            ‘Mod’社區(qū)
              看一眼任何在線游戲服務(wù)器的統(tǒng)計(jì)數(shù)字,顯示出Counter Strike服務(wù)器比任何其他游戲服務(wù)器都要多。和它最近的競(jìng)爭(zhēng)者(Quake III或者Unreal Tournament)相比,幾乎有兩倍的CS服務(wù)器。

              游戲 mods 全部來(lái)自于一些編輯程序,這些程序讓游戲者能夠修改DOOM最初的.WAD文件,提供他們自己自家制造的關(guān)卡設(shè)計(jì)和紋理。人們開(kāi)始玩這些(大致)自家建造的工具,并且也發(fā)現(xiàn)了他們可以產(chǎn)生其他人想玩的關(guān)卡。Id注意了這個(gè)趨勢(shì),而且將Quake系列引擎帶到了一個(gè)新的階段,這樣設(shè)計(jì)游戲,使得游戲是用戶可修改的。他們甚至發(fā)布他們自己的設(shè)計(jì)工具,指令,而且甚至---喘口氣---游戲中的代碼,如此有抱負(fù)的游戲程序員可以在Quake Universe中玩。你可能從這個(gè)創(chuàng)造出自己版本的Quake連線經(jīng)歷。許多今天的業(yè)內(nèi)大師來(lái)自這種早期的修改經(jīng)驗(yàn)。現(xiàn)在有名的設(shè)計(jì)者如LevelLord和CliffyB在這個(gè)行業(yè)中就是這樣開(kāi)始的。最高的榮譽(yù)來(lái)自一位名叫ZOID的紳士,他提出了3Wave CTF,第一個(gè)‘奪取旗幟’的游戲,游戲中需要人們組隊(duì)---連線游戲從純粹的死亡競(jìng)賽以來(lái)的第一次進(jìn)化發(fā)展。

              一些游戲是如此的流行以致于他們每年都有事件發(fā)生。比如說(shuō),Quake有一個(gè)QuakeCon,在Mesquite Texas,Id軟件公司所在地,舉行的一年一次的quake大會(huì)。人們帶著他們的PC來(lái)到這里,或?yàn)榱丝醋钚碌膍ods或是展示的基于Quake引擎的游戲。

              如今你制作的任何游戲需要或者有殺人者可多人玩的經(jīng)驗(yàn),或者有可以非常容易修改的內(nèi)容這樣連線‘修改者’能利用你的游戲并制作出其他游戲來(lái)。這一切延長(zhǎng)了你游戲的生命,有希望賣出更多,人們購(gòu)買它,可以下載mods來(lái)玩最新的Quake III修改版本:The Teachers Strike Back。但你不能僅僅生產(chǎn)一款游戲,發(fā)布你的工具,就袖手旁觀。實(shí)際上你最初必須把代碼設(shè)計(jì)成不需要程序員就可以容易地?cái)U(kuò)充, …好吧, … John Carmack。

              作為一個(gè)開(kāi)發(fā)者,你需要在那里可以見(jiàn)得到,并為那些在家中想利用你的游戲和用它做點(diǎn)別的什么的人們提供經(jīng)驗(yàn)和幫助。這種支持可以有許多形式----一個(gè)親切友好的詞語(yǔ),一段代碼,建議,宣傳或只是金錢。只要有這個(gè)它時(shí)常不介意采用何種形式。

              在這里你選擇哪個(gè)第三方工具用來(lái)建造內(nèi)容可能是至關(guān)重要的。在Raven,過(guò)去我們已經(jīng)做了一些開(kāi)發(fā)決定,在這方面沒(méi)有什么幫助,由于我們?yōu)榇蠖鄶?shù)的建模和所有的動(dòng)畫需求使用了SoftImage。雖然它是制作我們需要的動(dòng)畫的最好工具,對(duì)于家庭業(yè)余愛(ài)好者來(lái)說(shuō)它太過(guò)昂貴了。這就給那些家庭業(yè)余愛(ài)好者在擴(kuò)充我們制作的內(nèi)容時(shí)帶來(lái)了問(wèn)題,因此他們?nèi)菀讙仐壩覀冝D(zhuǎn)而尋求那些比較容易制作內(nèi)容的游戲。在建造或者選擇一個(gè)引擎時(shí)這確實(shí)是值得留意的事情。為了響應(yīng)制作游戲mods,Discreet在市場(chǎng)上發(fā)布了一個(gè)3D Studio Max的‘lite’版本,稱為gmax。最好的是,它是免費(fèi)的。如果你想要試一試,你能從這里抓取它http://www.discreet.com/products/gmax/gmaxconsumer/index.html

              最后在線游戲的成功時(shí)常能追蹤到 mod 社區(qū),因此我認(rèn)為感謝他們做了件好的工作是公平的。我過(guò)去時(shí)常說(shuō),在行業(yè)中到達(dá)一個(gè)‘真正的’工作最快的方式是從一個(gè)mod開(kāi)始,說(shuō)明你有完成它的訓(xùn)練并用它作為一個(gè)面試獲得者。不能說(shuō),"我能做這個(gè)" 就像已經(jīng)完成了一樣。因此去到那里并開(kāi)始吧。你損失什么了嗎?


            有關(guān)作者
              Jake Simpson 是一個(gè)游戲程序員,斷斷續(xù)續(xù)在這個(gè)行業(yè)已經(jīng)有大約20 年了。他在英國(guó)本土從15歲開(kāi)始,在C64的時(shí)代,Sinclair Spectrums和 BBC Micros,經(jīng)歷了 Amiga 和ST,離開(kāi)了一段時(shí)間,然后90年代中期至后期在Mideay Games寫街機(jī)游戲。他最近在Raven Software工作過(guò),制作有Soldier of Fortune, Heretic, Hexen, Star Trek : Voyager : Elite force 和 Jedi Knight II : Outcast,在北加州的Maxis可以找到他,為Will Wright的游戲產(chǎn)品工作。業(yè)余時(shí)間他為GameBoy Color和Advance編寫代碼,因?yàn)?#8220;你能盡可能地遠(yuǎn)離C++編碼,而且,如同John Carmack所說(shuō),底層編程對(duì)程序員的靈魂有好處”。

            Feedback

            # re: 游戲引擎全剖析  回復(fù)  更多評(píng)論   

            2007-12-04 12:44 by 夢(mèng)在天涯
            超好,轉(zhuǎn)了,謝謝!

            先!

            喜歡做游戲,以后多交流哦!

            # re: 游戲引擎全剖析  回復(fù)  更多評(píng)論   

            2007-12-04 12:53 by orlando
            呵呵~
            剛開(kāi)始學(xué)DIRECTX

            # re: 游戲引擎全剖析[未登錄](méi)  回復(fù)  更多評(píng)論   

            2008-12-19 21:03 by 熊哥
            太好了!

            # re: 游戲引擎全剖析  回復(fù)  更多評(píng)論   

            2010-07-30 14:59 by SheppardAVA20
            Set your life time more simple take the <a href="http://bestfinance-blog.com">loans</a> and everything you want.

            # re: 游戲引擎全剖析  回復(fù)  更多評(píng)論   

            2011-08-05 14:03 by dissertation writing
            From time to time it occurs that you are lack of time to finish the the dissertation referring to this good post. Lots of people do a big problem from this, because they don’t get know about thesis writing, but I can show you information about the pfroper ways to find the best dissertation writing service and how to buy your dissertation per good prices.

            # re: 游戲引擎全剖析  回復(fù)  更多評(píng)論   

            2012-07-01 23:16 by Internet site
            Open this link qualityessay.com in order to order essays online and obtain excellent paper writing assistance.

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            posts - 16, comments - 17, trackbacks - 0, articles - 1

            Copyright © orlando

            青青国产成人久久91网| 国内精品综合久久久40p| 久久99国产精品久久| 亚洲色婷婷综合久久| 精品久久久无码人妻中文字幕| 久久久免费观成人影院| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久免费国产精品| 国产69精品久久久久99| 国产成人精品久久亚洲| 一本伊大人香蕉久久网手机| 久久久国产精品网站| 亚洲嫩草影院久久精品| 久久亚洲国产午夜精品理论片| 久久本道伊人久久| 91久久九九无码成人网站| 久久中文字幕一区二区| 国产三级精品久久| 久久亚洲2019中文字幕| 久久精品免费全国观看国产| 久久香蕉国产线看观看猫咪?v| 国产一区二区三精品久久久无广告| 国产精品成人99久久久久91gav| 99久久99久久精品国产| 久久国产影院| 久久伊人精品一区二区三区| 亚洲国产精品成人久久| 99久久婷婷国产综合亚洲| 久久天堂电影网| 久久久久亚洲AV无码去区首| 国产精品久久久久久久久软件| 色播久久人人爽人人爽人人片AV| 亚洲精品高清国产一线久久| 成人资源影音先锋久久资源网| 色成年激情久久综合| 人人狠狠综合88综合久久| 久久AV高潮AV无码AV| 久久午夜电影网| 欧美日韩精品久久免费| 97久久国产亚洲精品超碰热| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 |