2016年1月4日 星期一

Unity:場景物件數量的影響(一)

在 Unity 建置場景,有很多種選擇,使用一體成型的物件或組合型的物件,都能建立看起來相同的場景,直接使用模型資源或者事先製作好的 Prefab 也都能組合出一模一樣的場景,但是物件數量、做法,對於專案本身以及輸出後的影響,究竟是怎麼樣的呢?以下,使用幾個簡單的場景來觀察其中的差別。


影片網址:https://youtu.be/8a0IBUUMAiY

我們主要使用了以下幾種方式建置的場景來做比較:
  1. 直接在場景中建立的模型:
    這個場景中的物件所使用的模型,是直接存在於場景中的,所以,與 Project 視窗中的任何資源檔案無關,通常可以使用 Unity 提供的 API 直接產生它。
  2. 使用一個模型資源建立的場景:
    這個場景中的物件,是直接使用 Project 視窗中具備模型網格、UV 等資料的資源檔案所建立的,在這裡,是使用一個一體成型的模型來建立整個場景。
  3. 使用一個 Prefab 建立的場景:
    這個場景與第二個場景相同,也是使用一個一體成型的模型來建立整個場景,不同的是,需先將模型製作成 Prefab 檔案,然後,再使用這個 Prefab 檔案來建立場景。
  4. 使用多個模型資源組合的場景:
    這個場景中的物件,與第二個場景相同,是直接使用 Project 視窗中具備模型網格、UV 等資料的資源檔案所建立的,所不同的是,並非一體成型的模型,而是將場景需求的模型拆解成小塊,使用組合的方式建立場景。
  5. 使用多個 Prefab 組合的場景:
    這個場景與第四個場景相同,也是將場景需求的模型拆解成小塊,使用組合的方式建立場景,所不同的是,需先將模型製作成 Prefab 檔案,然後,再使用這個 Prefab 檔案來組合出場景。
針對每個方式所建置的場景,我們將複製出 100 個的場景,直接來觀察專案中的場景檔案大小,以及,觀察 Build 之後所佔容量的大小。



首先,先來觀察一下小場景。

小場景是個 5x5 的空間。

專案場景檔案資料夾


直接在場景中建立的模型
使用一個模型資源建立的場景
使用一個 Prefab 建立的場景
使用多個模型資源組合的場景
使用多個 Prefab 組合的場景

電腦桌機 Mac OS X 的 App


直接在場景中建立的模型 
直接在場景中建立的模型 Log
使用一個模型資源建立的場景
使用一個模型資源建立的場景 Log
使用一個 Prefab 建立的場景 
使用一個 Prefab 建立的場景 Log
使用多個模型資源組合的場景 
使用多個模型資源組合的場景 Log
使用多個 Prefab 組合的場景
使用多個 Prefab 組合的場景 Log

Build 成為 Xcode 專案


直接在場景中建立的模型
直接在場景中建立的模型 Log
使用一個模型資源建立的場景
使用一個模型資源建立的場景 Log
使用一個 Prefab 建立的場景
使用一個 Prefab 建立的場景 Log
使用多個模型資源組合的場景
使用多個模型資源組合的場景 Log
使用多個模型資源組合的場景
使用多個模型資源組合的場景 Log

安裝到 iOS 裝置


直接在場景中建立的模型
使用一個模型資源建立的場景
使用一個 Prefab 建立的場景
使用多個模型資源組合的場景 
使用多個 Prefab 組合的場景

Build 成為 Android 的 apk 檔


直接在場景中建立的模型
使用一個模型資源建立的場景
使用一個 Prefab 建立的場景
使用多個模型資源組合的場景
使用多個 Prefab 組合的場景
由於有些數據非常的接近,所以,再來觀察一下更大的場景:

大場景是 38x38 的迷宮路線

專案場景檔案資料夾


直接在場景中建立的模型
使用一個模型資源建立的場景 
使用一個 Prefab 建立的場景 
使用多個模型資源組合的場景 
使用多個 Prefab 組合的場景

電腦桌機 Mac OS X 的 App


直接在場景中建立的模型
直接在場景中建立的模型 Log
使用一個模型資源建立的場景
使用一個模型資源建立的場景 Log
使用一個 Prefab 建立的場景
使用一個 Prefab 建立的場景
使用多個模型資源組合的場景 
使用多個模型資源組合的場景
使用多個 Prefab 組合的場景 
使用多個 Prefab 組合的場景

Build 成為 Xcode 專案


直接在場景中建立的模型
直接在場景中建立的模型 Log
使用一個模型資源建立的場景
使用一個模型資源建立的場景 Log
使用一個 Prefab 建立的場景 
使用一個 Prefab 建立的場景 Log
使用多個模型資源組合的場景
使用多個模型資源組合的場景 Log
使用多個 Prefab 組合的場景
使用多個 Prefab 組合的場景 Log

安裝到 iOS 裝置


直接在場景中建立的模型
使用一個模型資源建立的場景
使用一個 Prefab 建立的場景 
使用多個模型資源組合的場景
使用多個 Prefab 組合的場景

Build 成為 Android 的 apk 檔


直接在場景中建立的模型
使用一個模型資源建立的場景
使用一個 Prefab 建立的場景
使用多個模型資源組合的場景
使用多個 Prefab 組合的場景
從以上這些結果可以發現,如果場景很小,專案內的場景數量很少,場景物件的數量以及做法,並不會有太大影響,只需要遵從官方文件所建議的去改善原始的資源檔案,但如果專案的場景數量很多,場景內容也很大的話,那麼,場景物件的數量以及建置物件的做法,將會帶來很明顯的影響。

以上資料可以看出,使用一體成型的模型資源或 Prefab 來建立場景,所佔用的容量最小,而且它們之間的差異很小,但是,在這個測試中,這部分是個很大的缺陷,因為,通常使用一體成型的方式來建立模型,有 100 個場景,應該不會每個場景都使用相同的模型,而這個測試則是 100 個場景重複使用相同的模型資源或 Prefab,理所當然的,所佔的容量會是最小,但在實作上,可能 100 個場景都將使用不同的模型資源或 Prefab,那麼,所佔容量可能會是最大,或者與直接在場景建立模型的做法差不多,此部分還沒有特別實際測試過。所以「使用一體成型的模型資源或 Prefab 來建立場景,所佔用的容量最小」這個結果並不可靠。

而透過程式直接在場景中建立模型來製作場景,它是很老實地在場景中記錄了整個模型的資料,各場景之間的物件彼此並沒有任何關聯,即使它們看起來一樣,模型內的資料也一樣,可是,並不會因此和節省容量。

而使用多個 Prefab 所組合起來的場景,很明顯的可以看出來,所佔用的容量最大,而且場景數量越多、場景內的物件數量越多,與其他做法的差別越大。

在 Unity 專案的開發過程中,大量的使用 Prefab 可以帶來許多好處,包含資源的重複使用,以及變更內容的方便性,相當易於維護,但經過這個實驗,發現到這是必須付出容量作為代價,不過,物件的易用性與容量之間的取捨,還是要看實際專案狀況來決定。

想要節省容量,又想要保持方便的開發流程,可能就需要製作一些簡單的工具指令來協助,例如將 Prefab 的內容,像是所包含的子物件以及 Component 等,透過自己撰寫的 Editor 程式或者 MenuItem 直接在場景中產生 GameObject.. 等,這樣,或許就比較能維持容量取捨與開發流程之間的平衡。

這個測試,還有些不足的地方,就留待未來再深入研究吧!如果,你喜歡這個文章或所展示的影片,請幫忙介紹給你的朋友,也別忘了訂閱影片頻道以及來粉絲專頁按個讚、留個言,謝謝!

使用 Unity 版本 5.2.3f1。

影片中所使用的專案可在此下載:http://1drv.ms/1mrL0Lc


2016/01/12
對於使用一個模型資源直接建立場景以及使用一個 Prefab 建立場景的做法,重新補充於另一篇「Unity:場景物件數量的影響(二)」。