Динамический многомерный массив для 2D процедурного мира Gen - PullRequest
2 голосов
/ 12 марта 2019

ЦЕЛЬ
Я создаю генератор мира, который должен динамически добавлять «воксели» в какой-то список, когда камера приближается к краю того, что уже существует. Каждый воксел должен быть максимально доступным, поскольку к каждому кадру потребуется доступ к нескольким сотням вокселей из списка тысяч.

ПОДХОДЫ, КОТОРЫЕ Я РАССМОТРЕЛ
1) Моя первая мысль была о многомерном массиве вокселей, его индексами были координаты x и y вокселя: Voxels[,] voxels = new Voxel[128,128];

Плюсы: это должно быть очень быстро, если предположить, что я знаю координаты своего вокселя: Voxel myVoxel = voxels[x, y];

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

2) Чтобы исправить это, я решил, что могу просто сохранить значения x & y в строке и использовать их в качестве ключей в словаре. Dictionary<string, Voxel> voxels = new Dictionary<string, Voxel>(); Voxel myVoxel = voxels[x + "," + y];
Тогда добавление в список будет так же просто, как вызов .Add (); способ.

ВОПРОСЫ
1) Чем эффективность извлечения из массива отличается от словаря. В моей голове, массив будет быстрее многих, так как я предполагаю, что словари должны перебирать каждый ключ, чтобы проверить равенство (извините за мое невежество, если я ошибаюсь)

2) Если массив действительно равен , что гораздо быстрее извлекать, будет уничтожать и воссоздавать массив из сотен тысяч элементов несколько раз в секунду (в зависимости от размер куска) стоит ли?

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

Заранее спасибо

1 Ответ

0 голосов
/ 28 марта 2019

На ваши вопросы


1) Если вы знаете индекс элемента в массиве, массив будет самым быстрым (O (1) раз) . Например, если вы используете мировые позиции, вы можете использовать пол ваших координат мировых координат для каждого вокселя в качестве их индексов в трехмерном массиве. По сути, когда вы генерируете свой мир из трехмерного массива, используйте индекс в качестве позиции в мире, и тогда вы сможете находить их индексы в постоянное время с помощью Math.floor (worldPosition) в вашем трехмерном массиве. - это самый быстрый.

Словари работают быстрее, чем массивы, когда вы просматриваете несортированную структуру данных, не зная индекса . См. здесь для изображения (поиск в словаре для несортированного списка - O (1), а поиск в массиве - O (n)).


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


Кроме того, я бы настоятельно рекомендовал проверить видео Себастьяна Лига о создании ландшафта для других лучших практик, если вы используете Unity https://www.youtube.com/watch?v=wbpMiKiSKm8&list=PLFt_AvWsXl0eBW2EiBtl_sxmDtSgZBxB3

...