比較Unity中幾種內建資料結構 – Some Datastructure in Unity

Unity是一個遊戲引擎,結合了前端場景編輯與後端程式開發的功能,而且一個專案可以幾乎不用修改就能發佈到 Android、iOS、web等不同平台上,相當的方便。

不過如此擁有方便功能的軟體,難免在某處會有所短,在使用Unity一段時間後,我最在意的一點便是 Unity 似乎在效能上有相當大的問題。即使有種種效能上的問題,Unity的在開發上方便性依舊難以取代,如果在意效能的話,開發者就只能在可行的範圍內專精自己所開發的細緻度,優化每個部份。

研究如何優化程式是一個很瑣碎的過程,但也有它的趣味所在,而且這過程能令我更了解自己所在使用的程式或工具。這次我測試了幾個資料結構的效能,讓我在開發 Unity 專案時可以依照需求選用適當的資料結構,以下便是測試的紀錄。

首先,Unity 是在它所專有的 Unity Player 上運作整個專案,Unity 提供了許多平台的 Player,並且允許開發者在所有的平台上相同的程式語言,所以 Unity 專案可以擁有跨平台的能力。而這個 Unity Player 是程式效能不佳的很大因素,它使用 .Net 2.0 作為基礎,並部分升級到了 .NET 3.5,整體落後最新的 .NET 4.5 有段距離,許多效能的改善並沒有跟上;另外 Unity Player 是一個支援相當多功能的 3D動畫 Player,但在發佈為單一平台的目標程式時,並無法選擇關閉不需要的功能,白白浪費了許多軟硬體資源。

因為是以 .NET Framework 作為基礎,所以有許多內建的資料結構可以使用,例如:Queue、Stack、List、LinkedList、Dictionary、SortedDictionary等。這次針對下列四個我常用的結構進行比較測試:

  • List
  • LinkedList – 相較於List,可以插入 element 於中央部分
  • Dictionary
  • SortedDictionary – 相較於 Dictionary,會依照 Key進行排序

table-unity-datastruct

Unity Data Structure Testing - Insert Unity Data Structure Testing - Scan

經過測試的結論,List 與 Dictionary 明顯在各方面效率方面都較佳,如果沒有相當依賴另外兩個結構的特別功能,選用簡單的資料結構便可。

值得注意的是,不管何種結構,如果想要操作整份資料而使用了 foreach,效能都不如直接用 loop 來進行處理,關於這點這篇文章做了詳細的解釋:Unity 的 foreach,簡單來說就是 Unity MonoDeveloper 的 bug。


測試 Unity 版本:5.3.4f,在PC上測試。

 

Advertisements

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s