UGUI 原始碼之 IndexedSet

2021-08-30 18:04:28 字數 1909 閱讀 4494

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...