Есть несколько разных способов хранения данных для игры с блоками вроде Minecraft.
То, как Майнкрафт делает это, разделяет мир на куски размером 16x16x256. Куски вокруг игрока загружаются в память, когда игрок запускает игру, затем фоновая нить загружается больше, когда вы ходите вокруг. Вот видео, которое показывает это: http://www.youtube.com/watch?v=oR_ZdJH9eho .
Еще один способ сделать это - разбить мир на октри. Майкл Гудфеллоу написал блог о реализации мира кубов с такой структурой данных: http://www.sea-of-memes.com/LetsCode1/LetsCode1.html . Octree хорош тем, что дает вам некоторую встроенную компрессию, но работать с Array, вероятно, будет немного сложнее.
О хранении "только необходимых в памяти?" Это немного сложнее, так как вы должны спросить, что "нужно". Если у вас есть неигровые персонажи, которые живут в другой части мира с ИИ, который взаимодействует с окружающей средой, то вам «нужно» гораздо больше мира, чтобы быть в памяти. Данные о мире вокселов могут быть очень большими и очень большими, поэтому лучше постараться сохранить в памяти как можно меньше данных. (IE, только NPC рядом с игроком).
Графическому движку «понадобится» каждый блок, не полностью окруженный другими непрозрачными блоками. Обычный способ визуализации мира - это создание единой сетки, которая содержит вершины для каждого видимого блока. Рисовать это намного быстрее, поскольку вы делаете только 1 вызов методов рисования для 65 536 блоков (в кусках размера Minecraft). Так как графический движок должен будет построить эту сетку, он обычно должен знать все кубы в чанке. Обратите внимание, что именно поэтому, когда вы видите сквозь пол в Minecraft, большая часть мира невидима. Это потому, что каждый блок, который окружен со всех шести сторон, пропускается. Я полагаю, что Minecraft также уменьшает количество вершин, объединяя горизонтальные стороны одного и того же типа текстуры в одну рамку с повторением текстуры.
Мой совет - использовать куски 16x16x256. Храните их в массиве, так как вам потребуется быстрая итерация и редактирование из-за построения сетки и игровой логики (обнаружение столкновений, добавление / удаление блоков и т. Д.). Затем загрузите как можно больше кусков в круг вокруг игрока. Увеличьте или уменьшите количество фрагментов для лучшего или худшего компьютера.
Загрузка чанков будет огромным ударом по производительности, поэтому поместите его в поток, который запускает его с течением времени. Сделайте так, чтобы вы могли полностью загрузить 3 новых чанка за время, которое требуется игроку, чтобы пройти от одного конца чанка к другому.