1. 程式人生 > >遊戲開發入門(八)遊戲中的場景管理

遊戲開發入門(八)遊戲中的場景管理

授課者通過2D圍棋的例子,逐步拓展成3D的虛擬遊戲世界。這個3D遊戲世界基本上就可以涵蓋市面上所有型別的遊戲了,我們通過各種手段去管理好這個遊戲世界,就能快速的進行各種遊戲邏輯的開發。

筆記與總結(請先學習視訊內容):

1.什麼是場景物體?什麼是遊戲場景?
遊戲中所有具有空間屬性的物體都是場景物體。
所有場景物體構成的集合成為遊戲場景。

2.一般情況下哪些內容屬於場景物體,哪些不屬於場景物體?
場景物體:玩家,NPC,場景建築,地形,粒子特效,場景中的道具(武器等),還有一些看不到的物件如volume、攝像機等
非場景物體: UI,UI上的道具,玩家(NPC)技能,玩家(NPC)狀態,碰撞盒,物體的材質
個人覺得,非場景物體並沒有什麼嚴格意義的概念,刨除所有場景物體,其他的都是非場景物體。或者嚴格來說,他們並不是我們通常認識下的物體,只是單純的遊戲邏輯物件。比如說玩家的狀態,他在場景中並沒有實體,不過我們完全可以給狀態建立一個類物件來表示某個角色的狀態。

3.場景管理的意義

  • a.便於玩家快速的定位場景裡面的物件
  • b.妥善處理巨大場景帶來的記憶體開銷問題
  • c.處理巨大場景帶來的渲染效率問題
  • d.處理大量物件的碰撞檢測的效率問題

4.2D遊戲需要場景管理麼?
我們接觸的大部分遊戲都有一個虛擬的遊戲世界,玩家通過操作來改變這個世界。這個世界複雜一點,可以像各種大型MMO遊戲一樣(3D),這個世界簡單一點,可能像視訊中的圍棋一樣(2D,或者如超級瑪麗的那種)。所以無論是哪種遊戲,總是有那麼一個場景空間(或者說一個遊戲世界)去存放遊戲物件,這個空間就需要我們去統一的管理。這樣,我們才能在遊戲進行時方便快速的找到我們需要的物件,再去做進一步的處理。如果2D空間內物件數量龐大的話,也可以採用一定策略進行優化。
所以,2D遊戲也一樣需要場景管理。

5.2D場景管理與3D場景管理的差別?
面臨的問題不同:2D場景相比3D場景,一般來說無論是渲染開銷還是記憶體開銷都要小的多。

6.關於非物理碰撞檢測的問題與優化方案
問題:對於一個非基於物理引擎的碰撞檢測,我們一般需要遍歷場景中所有物件的位置並判斷二者間距離(假設物件都是球型的),才能檢測二者是否發生碰撞。一旦物件數量多起來,CPU根本無法承受。
優化:實際上,我們知道距離很遠的兩個物件一定時間內是不會發生碰撞的。為了減小碰撞檢測的開銷,我們可以將場景劃分成N*N塊,然後將所有的物件規分到不同的塊裡面,不同塊(且不相鄰)之間的物件不會發生碰撞,這樣就減小了碰撞檢測的開銷。
注:

其實一般的物理引擎的邏輯開銷比我們沒有優化的也還要複雜的多,因為他可能會有更多更詳細的檢測邏輯,不過像physX引擎在檢測時還會藉助GPU來提高效率。

7.四叉樹與八叉樹
二維空間的管理與物件檢測可以使用四叉樹進行處理。
三維空間的管理與物件檢測可以使用八叉樹進行處理。
不過八叉樹的相對開銷相比四叉樹要高不少。
這兩個概念其實並沒有那麼高深,和我們平常學習的資料結構沒什麼差別,只不過他的每個節點下面有四/八個子樹。這樣的處理完全是因為這兩種結構符合我們邏輯檢測的思路。

8.關於碰撞檢測的優化思路
其實這與我們處理搜尋,排序的思路是類似的,N^2肯定不是最優解,起碼我們會想到類似二叉樹,二叉堆的的資料結構。如果再去結合我們遊戲中空間分佈的實際情況,也就不難想到四叉樹這樣的處理辦法。當然,理論上還應該有其他的優化思路,效率如何博主暫時沒有深入去研究過。

9.關於視野渲染的優化
與現實世界相似,我們無法看到無線遠的東西,或者是無限遠的東西幾乎是看不清的。所以,遊戲世界裡面的玩家也類似,每個玩家的視野限制在一個視錐裡面。這對於遊戲的優化是非常重要的

  • a.渲染上,因為不在視野內的東西,我們完全就可以不去渲染,即渲染剔除
  • b.遊戲邏輯上,因為玩家的視野有限,過於遠的場景資料可以完全不去載入,即場景動態載入
  • c.在視野範圍但是又很遠的東西,我們可以給他換一個精度比較低的模型,即LOD

10.入口管理
對於一些房間內(場景比較小)的遊戲,玩家的視野只侷限在一個房間裡面。這時候其實房間外的任何東西都不需要載入與處理(假如與當前遊戲邏輯無關)
這樣,我們就可以在玩家切換房間(如開門)的時候再去載入其他房間場景,這對於遊戲的優化是很有幫助的。

11.遊戲天空的實現
天空盒:用一個完整的封閉的空間來包圍整個遊戲場景,在這個空間表面貼上天空效果的貼圖。一般來說非常大,要比實際遊戲場大,接近玩家視野的極限。
天空盒組成:

  • 大氣顏色層
  • 雲層
  • 天體層
  • 遠景片

12.LOD
前面提到過,視野遠處的東西玩家是看不到細節的,所以也就不需要給其渲染那麼複雜的模型(貼圖等)。LOD就是基於這個原理根據與相機位置的距離動態切換資源(高精度資源與低精度資源),是遊戲中常用的渲染優化方式

13.地形的處理
遊戲場景中的地形可以說僅次於天空盒大小的存在了,與天空盒不同,玩家與地形的距離非常近,所以一般來說地形的表現細節應該足夠豐富才行。但是問題是如果給所有的地形都賦予足夠的精度,就需要佔用大量的記憶體,這是不現實的,所以地形也要有LOD處理,遠處的地形不需要太精細的效果。另外,在遊戲中的大地形是不存在球形的。其實地形只是一個面片,玩家只在面片的上面進行移動。
地形制作:一般由美術在客戶端進行刷,構建完畢後會以高度圖的形式儲存在地圖資料資訊裡面。
高度圖:其實就是一個二維表,記錄每個座標的高度值(Z值)
地形LOD的處理方法: 按照距離大小,視覺貢獻度(斜面的貢獻度比平面高)來分配不同精度的LOD模型

14.地表紋理處理
由於地形面積過大,正常情況下需要提供大量的貼圖來表現不同位置的不同效果。為了節省貼圖資源所佔用的記憶體空間,同時還想表示出豐富的地貌效果,就需要用到多層紋理混合技術。只需要幾個貼圖,按照不同權重的混合就能達到多種不同的效果。

15.水
前面渲染的課簡單說到了水的渲染一般是通過UV動畫(法線貼圖)來實現的,但是更逼真的水還需要考慮到反射與折射,甚至是與玩家
的互動。這就需要進一步新增反射貼圖等更深層次的處理。

16.植被
實現方式1:記錄每株草的位置、貼圖、材質等資訊,執行時生成草的模型,將使用同樣貼圖的草合併為若干組。
實現方式2:記錄植被區域,記錄區域內植被貼圖、材質等資訊,設定區域植被的密度、變異因子等資訊,執行是生成若干組隨機植被。