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.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 22

      +1
      Какое-то грубое описание: массивы, списки, хэш-таблицы, словари — всё в одну кучу. У них у всех своё применение.
        0
        Странно было бы, если бы у всех них было одно применение — не находите? :)
        0
        a[«key»]
        не сразу понял что кавычки так нарисовались
          +3
          Типизированный блеать, типизированный!
            0
            Перечислил массивы C# и что?
              0
              И то, что при разработке под юнити, не всегда очевидно, что из .NET реализовано, а что — нет. Особенно если ты пишешь не на шарпах, а на JS.
              0
              За старание конечно спасибо, но называть хэши массивами… Это совершенно разные типы данных, которые нужны для разных целей.
                +1
                А как корректно сгруппировать все эти структуры? «Коллекция»? «Хранилище»?
                  0
                  Массивы («built-in» arrays), списки (ArrayList, List<>), хэши (Hashtable, Dictionary<,>).
                    0
                    При этом сами по себе термины «список» и «хэш» не являются единственно верным названием всей группы данных. Например синоним списка это коллекция, а у хэшей — словарь, хэш-таблица (последенне более верный термин, нежели просто хэш).
                      0
                      А назвать все эти структуры одним словом. Т.Е. как называется категория, в которую входят массивы, списки и хеши
                        0
                        А к какой категории отнести например куб и шар?) Очевидно к фигурам, можно опуститься чуть ниже и отнести их к трехмерным фигурам. Аналогично и тут, массивы, списки и словари относятся к категории «структуры данных» и единственная более точная группа для них (которую я вижу) — линейные структуры данных.
                          0
                          Во. «структура данных» — то слово, которое я ждал.
                            0
                            И все-таки, я против переименования статьи в «Структуры данных в Unity». Слишком академично и не слишком очевидно, имхо.
                              +1
                              Всегда есть проблема выбора между простотой и точностью названия
                                0
                                Ну, благо Хабр — это блог, а не учебник. Так что можно назвать может менее правильно, но зато более «народно», что ли.
                  0
                  но называть хэши массивами… Это совершенно разные типы данных

                  Кстати, хэши также называют "ассоциативными массивами".
                    –1
                    Да, а еще называют map, hash-table, dictionary. Не люблю придираться к словам, но то, что у русскоязычных программистов подразумевается под словом «массив» и у англоязычных под словом «array» и то, что в большинстве языков объявляется, как <тип данных>[] <имя переменной>; это принципиально другой тип данных нежели associative array.
                      0
                      Теперь вы уже спорите с терминологией? («ассоциативный массив»)

                      Мне кажется, вы придираетесь к словам. Всем же понятно, о чем речь.

                      Сложение строк — оно тоже «конкатенация». Но кто так говорит?..
                        –3
                        Возможно. Я просто хотел указать на место, которое может запутать или ввести в заблуждение.
                  0
                  Вопрос в тему топика:

                  Имеется 2 варианта массивов:
                  — Двумерный булевый массив NxN. (Built-in array)
                  — Одномерный массив размерностью N содержащий массивы разной длинны и хранящей в себе значения integer. Каждый внутренний массив может иметь длинну от 0 до N-1 (но в среднем 6+- значений, то есть в среднем массив будет иметь размерность Nx6).

                  Вопрос:
                  Какой из этих вариантов будет выполнять те или иные операции быстрее/медленнее? Как будет кушать память? Как на это будет влиять размерность N (интереусет диапозон N от 100 до 10 000)?
                    0
                    очевидно же.
                    1.Прямоугольный массив при равной заполненности будет быстрее. Возможно, я даже ошибаюсь, так как прямоугольный массив может оказаться просто синтаксическим сахаром. Тогда при равной заполненности они скорее всего равны.
                    2.Чем меньше разрядность зубцов в зубчатом массиве, тем он будет больше обгонять прямоугольный.

                  Only users with full accounts can post comments. Log in, please.