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

в 21:46, , рубрики: list, unity, unity3d, массивы, Программирование, разработка, метки: , , ,

Unity — выбираем, какой массив использоватьДля тех, кто сталкивался с 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.

Автор: soulburner

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js