Unity3D游戲開發之C#編程中常見數據結構的比較


一.前言  

Unity3D是如今最火爆的游戲開發引擎,它可以讓我們能輕松創建諸如三維視頻游戲、建築可視化、實時三維動畫等類型的互動內容。它支持2D/3D游戲開發,據不完全統計,目前國內80%的手機游戲都是用Unity3D開發。

由於Unity3D在開發過程中使用最多的是C# 語言,所以就要合理的使用C#提供的一些數據結構是非常有必要的,合理的選擇數據結構可以加快開發速度,提高游戲運行性能,不合理的使用數據結構則會導致游戲運行性能降低,加大開發復雜程度!

先通過表格看看常用的數據結構:

C#常用數據結構

中文名

Array

普通數組

ArrayList

數組集合

List<T>

泛型數組

LinkList<T>

泛型鏈表

Stack

Queue

隊列

HashTable

哈希表

Dictionary<K,T>

字典

然后先大概了解這些數據結構的用法。

二.數據結構之間比較和部分使用案列

1.數組(Array)在一般的編程中較為常見,是最簡單的數據結構之一,具有三個特點:數組存儲的數據都是在連續的內存單元上,數組中的元素都是同一類型,數組可通過下標直接訪問。缺點是數組是連續存儲,在兩個元素之間插入新的元素時很不方便,在創建數組時必須指定長度或初始化元素,就會面臨溢出或內存浪費的問題。2.ArrayList就可以解決Array帶來的一些缺點:無需指定大小或初始化元素。可以動態的插入數據元素,無需考慮溢出或浪費內存的事。ArrayList可以存儲不同數據類型的原因是由於把所有類型都當作Object類型來處理,使用時很有可能會發生類型不匹配的問題,這也就說明ArrayList是類型不安全的數據結構,在頻繁的進行讀寫(裝箱拆箱)操作ArrayList的過程中會產生額外的開銷,導致性能下降,所以在開發過程中使用ArrayList較少!

3.為了解決ArrayList不安全類型與裝箱拆箱的缺點,List<T>作為一種新的數組類型引入,繼承了ArrayList的一些優點,且確保了類型的安全,因無需進行裝箱拆箱操作,因此List<T>是高性能的,所以List<T>在游戲開發過程中經常用到的數組類型。以下是List<T>的簡單操作:

List<string>  Lstr=new List<string>();

Lstr.Add(“元素一”);   // 插入數據元素

Lstr[0]=“元素二”;     // 修改數據元素

Lstr.RemoveAt(0);       // 移除數據元素

在Unity3D游戲開發中,我們可以使用List<GameObject>來存儲游戲對象,比如在射擊游戲中的子彈,或角色扮演游戲中的NPC,都可以使用List<GameObject>進行存儲。

4.LinkList<T>的特點是鏈中的每一個元素都指向下一個元素,這樣救構成了一條鏈。在插入和刪除某個數據元素時時間復雜度都為O(1)。

5.Stack(棧)的特點是先進后出。

6.Queue(隊列)的特點是先進先出。

7.我通過游戲開發中的用法來介紹哈希表的使用和它的一些特點。在游戲開發過程中,我們通常會涉及到通過游戲角色的ID來正確匹配英雄角色,所以每個英雄角色都要有自己唯一的ID,每個英雄角色的ID和他們的角色名進行一一對應,那么,我們就可以使用哈希表進行存儲這種數據,假設有如下信息:

序號

ID

角色名稱

1

2059

亞瑟

2

“2060”

妲己

3

“ABC”

后羿

4

2061.5

宮本武藏

使用哈希表存儲的代碼如下:

Hashtable Hero = new Hashtable ();

         // Hero.Add (key,value);

         Hero.Add (2059,"亞瑟");        //插入第1個元素

         Hero.Add (“2060”,"妲己");        //插入第2個元素

         Hero.Add (“ABC”,"后羿");        //插入第3個元素

         Hero.Add (2061.5,"宮本武藏");    //插入第4個元素

 

         //  通過key訪問value

         if (Hero.ContainsKey (“2060”)) {

            Debug.Log ("該隊伍中包含妲己");

         } else {

          Debug.Log ("該隊伍中不包含妲己");

         }

通過以上的代碼可以發現哈希表可以接收任意類型值作為key(key和value的類型都為object類型),其實這就體現出哈希表類型不安全。

8.為了解決哈希表類型不安全,我們可以使用Dictionary<K,T>來存儲數據,可以將上面的代碼改寫成下面代碼:

Dictionary<int ,string> Hero = new Dictionary<int, string> ();

// Hero.Add (int key,string value);

Hero.Add (2059,"亞瑟");        //插入第1個元素

Hero.Add (2060,"妲己");        //插入第2個元素

Hero.Add (2061,"后羿");        //插入第3個元素

Hero.Add (2062,"宮本武藏");    //插入第4個元素

//  通過 key(int)訪問value(string)

if (Hero.ContainsKey (2061)) {

      Debug.Log ("該隊伍中包含后羿");

} else {

      Debug.Log ("該隊伍中不包含后羿");

}

對比哈希表,字典保證了類型的安全,但世界上並不存在十全十美的東西,代碼也是如此,字典通過空間換時間,通過更多的內存開銷來滿足對速度的追求。在創建字典時,可以傳入一個字典容量值,但在實際使用時並非該值,而是使用不小於該值的最小質數最為它的實際容量,所以字典容量的最小值是3。且當有了實際容量后,並非直接實現索引,而是通過創建了兩個額外的Array數組來實現間接的索引。面臨的情況就是,即便創建了一個空的字典,伴隨而來的是兩個長度為3的數組。所以當處理的數據不多時,慎重使用字典。

三.總結

     在游戲開發過程中,很多情況下使用普通數組也是可以的,數據結構的選取需要考慮數據的大小和使用場景才能合理的存儲和處理該數據。優秀的程序員需要考慮機器運行的性能,合理的選擇一些數據結構可以提高程序運行性能和降低開發復雜度。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM