list 和 dictionary,是最常用的資料結構之二。
先來看看list 和 dictionary的優缺點:
1.遍歷,list可以 for 可以 foreach 還可以.foreach(),而 dictionary只能foreach (unity某些版本使用foreach會由於拆裝箱產生gc)。list的遍歷順序就是元素的新增順序,dictionary是hash方式儲存的,所以遍歷時無法保證順序。
2.list是支援排序的(key為固定的整數索引)。可以直接調sort()、reverse()等方法, dictionary不支援(key型別不確定)。
3.list查詢慢,需要遍歷,時間複雜度是 o(n), dictionary查詢快,使用雜湊查詢方式,時間複雜度為 o(1)。
4.list 移除效率低,內部由陣列實現並非鍊錶。 remove(item)需要先遍歷查詢到對應的index,removeat(index)方法需要從在移除index處的元素後,後邊的元素依次向前補位。在list長度較長甚至同時需要多次移除時,對效能影響較大。
msdn list 原始碼位址
msdn dictionary 原始碼位址
--------------------nratel割--------------------
indexedset 在 unity unityengine.ui.collections 命名空間下。
它比較巧妙地吸取了list 和 dictionary各自的優點。當然也不是完美的)。
**比較簡單。這裡我對它的注釋做一下解釋。
缺點:1占用更多的記憶體。 (沒辦法,本來只用存乙份,現在要列表中乙份,字典中乙份)
2排序是非永久的。(移除操作為了提公升效率,會打亂排序)
3不易序列化. (因為是組合的資料結構)
可以在符合上述條件的、恰當的情況下使用它。
由於它是 internal class,不能直接調它的實現,可以拷貝乙份出來再用。
最後,貼上 indexedset 的原始碼,(純貼上自 unity 2017.3.1f1)
using system;
using system.collections;
using system.collections.generic;
namespace unityengine.ui.collections
public bool remove(t item)
public ienumeratorgetenumerator()
ienumerator ienumerable.getenumerator()
public void clear()
public bool contains(t item)
public void copyto(t array, int arrayindex)
public int count }
public bool isreadonly }
public int indexof(t item)
public void insert(int index, t item)
public void removeat(int index)
}public t this[int index]
set}
public void removeall(predicatematch)
}//sorts the internal list, this makes the exposed index accessor sorted as well.
//but note that any insertion or deletion, can unorder the collection again.
public void sort(comparisonsortlayoutfunction)}}
}
UGUI原始碼(六)VertexHelper
ugui提供了我們自己構建頂點 三角形的類,那就是vertexhelper類。通過這個類,我們可以建立頂點,構成三角形,填充到一張mesh上,然後用meshrenderer渲染到螢幕上,實際上我們可以直接操作mesh類新增頂點 三角形等操作,這裡的vertexhelper只是ugui與mesh之間的...
UGUI原始碼解析 9 MaskGraphic
一 簡介 maskablegraphic是乙個抽象類,繼承了graphic,iclippable,imaskable,imaterialmodifier介面,派生了rawimage,image和text 二 功能 1 onenable protected override void onenable...
UGUI原始碼解析 12 RawImage
一 簡介 如果你沒有或不想建立乙個圖集,你可以簡單地使用rawimage來繪製乙個紋理。請記住,每個rawimage都會建立乙個drawcall,因此最好只用於背景或臨時可見圖形。指令碼注釋 繼承maskablegraphic,是未經處理的。二 功能說明 1 setnativesize 重寫mask...