Unity3D / выбираем, какой массив использовать


Для тех, кто сталкивался с Unity, — не секрет, что эта платформа предоставляет большое количество разнообразных массивов — аж 5 штук (для JS и того больше — 6!). Так что же выбрать и как не запутаться в этом многообразии?



Начну — с конца. Сразу же приведу данные собранные в табличку.


Нетипизованный Типизованный
Доступ по индексу,

фиксированная длина
- встроенный массив

(built-in array)
Доступ по индексу,

динамический размер
ArrayList

или Javascript Array
List
Доступ по ключу Hashtable Dictionary
А теперь — давайте поговорим о каждом в отдельности…



Javascript Array


Самый простой и самый медленный вариант массива. Доступен только в JavaScript (UnityScript). Нетипизированный, с динамичным размером. Можно хранить объекты любого типа, вперемешку. Однако, это может внести и неразбериху, а также (при использовании pragma strict) придется каждый раз приводить типы.

Использование:

UnityScript C#
объявление var a: Array = new Array(); -
добавление a.Add(item); -
доступ a[i] -
удаление a.RemoveAt(i); -
размер
a.length
-
Документация на сайте Unity: unity3d.com/support/documentation/ScriptReference/Array.html

ArrayList


.Net тип массива аналогичный предыдущему Javascript Array, однако доступный как для UnityScript, так и для C#. Обладает все теми же преимуществами и недостатками, однако набор функций — более богат, чем в предыдущем случае.

Использование:

UnityScript C#
объявление var a: Array = new ArrayList(); ArrayList a = new ArrayList();
добавление a.Add(item);
доступ a[i]
удаление a.RemoveAt(i);
размер a.Count
Документация в MSDN: msdn.microsoft.com/en-US/library/system.collections.arraylist.aspx

Built-in array


Самый быстрый вариант массива. Однако, это жесткий массив, с фиксированной длиной, не позволяющий вставлять элементы в середину и т.п. Однако, если вам нужен максимум быстродействия — то встроенные массивы — это то, что вы ищите. Кроме того, они могут быть двухмерными.

Использование:

UnityScript C#
объявление var a: int[] = new int[100]; int[] a = new int[100];
добавление a[i] = item;
доступ a[i]
удаление -
размер a.Length
объявление 2D var a: int[,] = new int[10, 10]; int[,] a = new int[10, 10];
доступ 2D a[x, y]
Преобразование из Array и других типов в Built-in array производится методом .ToBuiltin().

Документация в MSDN: msdn.microsoft.com/en-us/library/system.array%28VS.80%29.aspx

Hashtable


Нетипизированный массив с доступом не по индексу, а по ключу. Ключ, кстати, — тоже нетипизированный (точнее, он, как и значение — являются объектами типа Object).

Использование:

UnityScript C#
объявление var a: Hashtable = new Hashtable(); Hashtable a = new Hashtable();
добавление a[«key»] = item;
доступ a[key]
удаление a.Remove(key)
размер a.Count
Документация в MSDN: msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx

Dictionary


Аналогично Hashtable, за исключением того, что и ключ, и элемент в таком массиве имеют заданный тип. Следовательно, работает это дело быстрее и не требует лишнего type cast'а.

Использование:

UnityScript C#
объявление var a: Dictionary.<KeyT, ValueT> = new Dictionary.<KeyT, ValueT>(); Dictionary<KeyT, ValueT> a = new Dictionary<KeyT, ValueT>();
добавление a[«key»] = item;
доступ a[key]
удаление a.Remove(key)
размер a.Count
Документация в MSDN: msdn.microsoft.com/en-us/library/xfhwa508.aspx

Заключение


Собственно, сводная табличка была в самом начале статьи.

Что можно посоветовать? Нужна скорость — используйте встроенные массивы []. И по возможности — всегда используйте типизированные массивы. Это оградит вас от лишней путаницы, приведения типов и выиграет скорость.

Также не забывайте, что MSDN'овские классы массивов находятся в пакете System.Collections.Generic, так что либо указывайте путь напрямую (например, new System.Collections.Generic.List.<int>), либо пишите соответствующий import / using.



Поделитесь интересным с друзьями:

Блог: http://romanlovetext.blogspot.com/