2013-12-05 2 views
0

Так что это для чего-то похожего, по крайней мере, для того, что вы можете столкнуться с игрой minecraft.Должен ли я использовать массив или arraylist/list <>

В принципе у меня есть игра, в которой вы объекты, и я хочу создавать и уничтожать объекты на основе их положения в мире.

Я чувствую, что я должен использовать массив, потому что я могу отсортировать массив и найти его очень быстро, делая

array[spawnposition] = gameobject 

когда я создаю объект для хранения этого объекта и его мгновенно в правильно отсортированном месте для что позиция

, а затем, конечно, используйте точное положение икры для изменения и удаления.

Проблема в том, что даже площадь 100 X 100 X 100 представляет собой очень большой массив.

Так что я не уверен, как лучше всего это смягчить. Я думаю, что в основном это кубизм, поэтому я думаю, что если бы я просто ограничил одно измерение, я мог бы получить гораздо больше, но мне любопытно, как такие вещи, как minecraft, имеют дело с массивными мирами.

Я уверен, что частично они разбивают массивы и, возможно, создают массивы массивов, чтобы перейти к правильному массиву.

Но мне интересно, есть ли лучший способ, что-то, что делает его таким, например, нулевые значения, возможно, не занимают места. Таким образом, только один раз, когда я присваиваю значение массиву, он находит место для него, поэтому он имеет очень большой размер массива, на самом деле он такой же большой, как и количество фактических элементов в нем, а не потенциально, но все же допускает быстрый доступ, как и фактический массив. ,

В основном я бы использовал Список, например, для динамического, но я бы потерял доступ индексатора к фиксированным массивам, что позволяет мне быстро и быстро получать данные, не выполняя поиск.

+1

Minecraft действительно использует [куски] (http://gaming.stackexchange.com/questions/73488/how-is-world-data-stored-in-minecraft). –

+0

загляните в [jagged arrays] (http://msdn.microsoft.com/en-us/library/2s05feca.aspx).У C# есть много оптимизаций, связанных с ними, которые могут превосходить собственный код при правильном использовании. – ryrich

+1

Не используйте 'ArrayList' - он устарел. –

ответ

8

Короткая версия:

  • Использование Arrays если вы хотите фиксированное количество элементов
  • Использование List если вы хотите динамический ряд элементов
  • Используйте ArrayLists, если вы хотите, чтобы все кровоточить от их глаза

Я всегда предлагаю использовать List s. Нет реальной заметной разницы в производительности от массивов, у вас есть полная мощность IEnumerable, и они строго типизированы (поэтому почему вы не используете ArrayList).

Вы можете доступ индивидуальный элемент, используя List с порядковым номером:

List<string> items = new List<string>(); 
string someItem = items[4]; //assuming these items already exist 
items[5] = "asdf"; 

Однако, выбор которых использовать полностью зависит от вас. Вы можете читать на Arrays, Lists и ArrayLists, а затем проконсультироваться от вас.

+2

+1 для глазного кровотечения lol – paqogomez

+1

Для этой конкретной проблемы, однако, 2D-список (список списков) кусков (3D-массив) будет ближе к способу применения minecraft. Решение для загрузки/выгрузки блоков может включать использование двумерной двунаправленной очереди в качестве ваших списков. Использование списков для хранения отдельных блоков становится крайне неэффективным при выполнении каких-либо блочных запросов. – Lindenk

Смежные вопросы