iPhone 游戲開發教程 游戲引擎 (3)
iPhone 游戲開發教程 游戲引擎 (3)是本文要介紹的內容,繼續上一章的內容開始介紹,本文主要介紹動畫的一些內容,詳細內容先來看內容。
動畫
通過渲染連續的圖片,我們可以確保玩家看到一個移動的物體,盡管他所做的僅僅是在同樣的像素上,但這些像素在快速的改變顏色。這就是動畫的基本概念。2D動畫很簡單,但3D動畫通常牽扯到更多的物體與動作,因此更復雜。
除了討論動畫技巧,這一節還會討論主要的優化類型可以使得我們的圖像引擎有效的和可靠的完成復雜的不可能以原始方式來完成的圖形任務。一些主要的優化技巧包括淘汰、紋理排序、使用智能紋理文件、資源管理和細節級別渲染。
2維動畫:精靈
在2D圖像中,如果我們要渲染馬兒奔馳的完整場景,我們可以先創建出馬兒的奔馳各個姿態的圖片。這種圖片成為一幀。當一幀接一幀的渲染到屏幕上時,馬兒動起來了(見圖2-7)。這和電影創建動畫的方式非常相似,電影也是通過展示連續的幀來達到移動效果。
圖2-7 斯坦福德的馬的動作
為了將這些幀保存在一起,我們將它們放在同一個紋理中,稱為精靈。通過前面章節我們描述的裁剪方法,將只包含當前幀內容的部分渲染到屏幕上。
你可以將每一幀渲染多次直到渲染該序列的下一幀。這取決于你希望你的動畫播放的多快,以及提供了多少幀圖片。事實上,通過渲染的幀速和順序,你可以創造出多種特效。
3維動畫:模型
與2D動畫中每次重畫時都維護一幅用來渲染的圖片--精靈不同,3D動畫是通過實際的計算的計算運動的幾何效果。正如我們之前描述的,所有的3D物體都由包含一個或多個三角形構成,被稱作網格。有多種可以使網格動起來的方法,這些技術與游戲發展與圖形硬件有關。這些技術后的基本概念都是:關鍵幀。
關鍵幀與我們之前討論的2D動畫中的幀有些許不同。2維動畫的美術人員畫出每一幀并保存在紋理中。但是在3D中,只要我們保存了最特殊的幾幀,我們就可以通過數學計算得到其他幀。
最開始的使用網格動畫的游戲實際上存儲了網格的多個拷貝,每一個拷貝都是都在不同的關鍵幀方向上。例如,如果我們在3D中渲染馬兒,我們應該為上面精靈的每一個關鍵幀都創建網格。在time(1),***幀被描畫出來,在time(2),第二針被描述出來。
在主要關鍵幀之間,使用一種叫做“插值”的技術方法。因為我們知道time(1)的關鍵幀和time(2)的關鍵幀有著相同數量的三角形,但是方向稍有區別,我們可以創建當前時間點的臨時的,融合了前面兩個網格的網格。所以在時間time(1.5),臨時網格看起來正好介于time(1)與time(2)之間,而在time(1.8),看起來更偏向于time(2)。
以上技術效率低下的原因是很明顯的。它僅在只有少量的三角形和少量的關鍵幀時才是可接受的,但是現代圖像要求有高解析度與生動細節的動畫。幸運的是,有更好的存儲關鍵幀數據的方法。
這就技術叫做“骨骼動畫”(skeletal animation, or bone rigging)。還是以馬兒為例,你可能注意到了大多數的三角形都是成組的移動,比如頭部組、尾部組和四肢組。如果你將它們都看成是骨頭關聯的,那么將這些骨頭組合起來就形成了骨骼。
骨骼是由一組可以適用于網格的骨頭組成的。當一組骨骼在不同方向連續的表示出來的時候,就形成了動畫。每一幀動畫都使用的是相同的網格,但是都會有骨頭從前一方位移動到下一個方位的細小的動作變化。
通過僅存儲在某一個方位的網格,然后在每一關鍵幀時都利用它,我們可以創建一個臨時的網格并將其渲染到屏幕上。通過在兩個關鍵幀之間插值,我們可以以更小的成本來創建相同的動畫。
動畫控制器
動畫控制器對象在抽象低層次的任務非常有用,如選擇哪一幀來渲染,渲染多長時間,決定下一幀代替前一幀等。它也起到連接游戲邏輯與圖像引擎等動畫相關部分的作用。
在頂層,游戲邏輯只關心將設某些東西,如播放跑動的動畫,和設定它的速度為可能應該每秒跑動數個單位距離。控制器對象知道哪個幀序列對應的跑動動畫以及這些幀播放的速度,所以,游戲邏輯不必知道這些。
粒子系統
另外一個與動畫控制器相似的有用對象是粒子系統管理器。當需要描畫高度支離破碎的元素,如火焰、云朵粒子、火苗尾巴等時可以使用粒子系統。雖然粒子系統中的每個對象都有有限的細節與動畫,它們組合起來卻能形成富有娛樂性的視覺效果。
淘汰
***的增加每秒鐘描畫到屏幕上的次數的方法是在每次迭代中都減少描畫在屏幕上的數目的總量。你的場景可能同時擁有成百上千的物體,但是如果你只需要描述其中的一小部分,你仍然可以將屏幕渲染得很快。
淘汰是從描畫路徑上移除不必要的物體。你可以在多層次上同時進行淘汰。例如,在一個高層次,一個用戶在一間關閉了門的房間里面是看不到隔壁房間的物體的,所以你不必描畫出隔壁其他物體。
在一個低層次,3D圖像引擎會經常移除部分你讓它們描畫的網格。例如,在任意合適的給定時間點,半數的網格幾何體在攝影機背面,你從攝像機中看不到這些網格,看到的只是攝影機前方的網格,因此,當網格被渲染時,所有的在攝影機背后的網格都會被忽略。這叫做背面淘汰。
紋理排序
每次當一個物體被渲染到屏幕上時,圖形硬件都會將紋理源文件載入到內存中。這是被稱作上下文交換(context switching)的一部分。
如果要將三幅圖片描畫到屏幕上,而其中兩幅圖片共用同一個紋理資源,有兩種辦法來處理紋理排序:高效的方法是連續的渲染兩幅共享資源的圖片,這樣只需要以此上下文交換,而低效的方法則需要兩次上下文交換。你不應該將第三幅圖片放在共享紋理的兩幅圖片之間描畫。
在渲染處理過程中,通過排列共享紋理的物體可以減少上下文交換的次數,從而提高渲染速度。
紋理文件
在一開始就計劃好紋理組織結構可以幫助你以***化方式排列你的紋理。假設你準備在你的游戲中描畫幾何體,一個主角和一些生物。
如果前兩個關卡是草地,接下來的關卡是沙漠,你可以將所有的樹木、草、灌木、巖石以及花兒的圖片來放到一起來渲染前兩關,并將沙子圖片放在另外一個紋理文件中用來渲染第三關。同樣的,你可以將玩家虛擬人偶放到一個紋理中。如果所有的生物在所有關卡中都用到了,***的方式可能是將它們放在一個紋理文件中。但是,如果***關有吼猴與鼯鼠,而第二關只有森林鼠與蘇里南蛤蟆,你可以將***次前兩種動物放在一個紋理中,將后兩種放在一個紋理中。
資源管理
大部分的視頻游戲在一個時間點只會渲染它們所有圖片內容的一小部分。將所有紋理同時載入內存是非常低效的。
幸運的是,游戲設計通常決定了哪些資源在游戲的各個章節是可見的。通過保留必須的紋理為載入狀態并卸載不使用的紋理,可以最有效的利用有限的內存資源。
還是使用前一節的例子,當游戲引擎載入***關時,資源管理代碼必須確保 吼猴與鼯鼠的紋理被載入到內存中。當程序進行到下一關時,資源管理代碼會卸載那些紋理,因為它已經知道它們不會在第二關被使用。
細節層次
另外一個優化技巧,尤其是對3D圖像,叫做細節層次。考慮當一個物體遠離攝像機時,它看起來非常小,而且大部分細節都丟失了。你可以描畫一個同樣大小,卻僅擁有簡單網格的物體,或者甚至一張平面貼圖。
通過保留不同細節層次的物體的副本在內存中,圖像引擎可以根據與攝像機的距離決定使用哪個副本。
小結:iPhone 游戲開發教程 游戲引擎 (3)的內容介紹完了,希望本文對你有所幫助!想要深入了解iPhone 游戲引擎的更多內容,請參考以下幾篇文章: