приложение падает, когда оно достигает 1,5 ГБ.
Это настоятельно говорит о том, что вы неправильно представляете свои плитки, так как это будет означать, что каждая плитка имеет размер ~ 80 байт.
Что вам нужно понять, так это то, что между игровой концепцией плитки и визуальной плиткой, которую видит пользователь, должно быть разделение . Эти два понятия не одно и то же .
Взять, к примеру, Террарию. Самый маленький мир Terraria занимает 4200x1200 плиток, что составляет 5 миллионов плиток. Теперь, сколько памяти нужно, чтобы представить этот мир?
Итак, у каждой плитки есть слой переднего плана, фоновый слой (фоновые стены), «слой проволоки», куда идут провода, и «слой мебели», куда идут предметы мебели. Сколько памяти занимает каждая плитка? Опять же, мы просто говорим концептуально, а не визуально.
Плитка переднего плана может быть легко сохранена в неподписанном коротком. Существует не более 65536 типов листов переднего плана, поэтому нет смысла использовать больше памяти, чем эта. Фоновые листы могут легко находиться в байте без знака, так как существует менее 256 различных типов фоновых листов. Слой проводов является чисто двоичным: либо в плитке есть провод, либо его нет. Так что это один бит на плитку. И слой мебели снова может быть байтом без знака, в зависимости от того, сколько существует различных предметов мебели.
Общий объем памяти на плитку: 2 байта + 1 байт + 1 бит + 1 байт: 4 байта + 1 бит. Таким образом, общий размер небольшой карты Terraria составляет 20790000 байт, или ~ 20 МБ. (примечание: эти расчеты основаны на Terraria 1.1. С тех пор игра значительно расширилась, но даже современная Terraria может умещаться в пределах 8 байт на ячейку или ~ 40 МБ. Все еще вполне терпимо).
Вы никогда не должны хранить это представление в виде массивов классов C #. Они должны быть массивами целых чисел или чем-то подобным. AC # struct также будет работать.
Теперь, когда приходит время рисовать часть карты (обратите внимание на акцент), Terraria необходимо преобразовать эти концептуальные тайлы в настоящие тайлы. Каждая плитка должна на самом деле выбрать изображение переднего плана, фоновое изображение, дополнительное изображение мебели и иметь изображение в виде провода. Здесь XNA входит со своими различными листами спрайтов и тому подобным.
Что вам нужно сделать, так это преобразовать видимую часть вашей концептуальной карты в реальные листы листов спрайтов XNA. Вы не должны пытаться преобразовать всю вещь сразу . Каждая плитка, которую вы храните, должна быть просто индексом, говорящим, что «я тип плитки X», где X - целое число. Вы используете этот целочисленный индекс, чтобы выбрать, какой спрайт вы используете для его отображения. И вы используете спрайт-листы XNA, чтобы сделать это быстрее, чем просто рисование отдельных четырехугольников.
Теперь видимая область листов должна быть разбита на различные фрагменты, чтобы вы не создавали спрайт-листы постоянно, когда камера движется. Таким образом, у вас могут быть куски мира размером 64х64 в виде спрайтов. Независимо от того, какие фрагменты мира размером 64x64 видны с текущей позиции игрока на экране, это фрагменты, которые вы рисуете. У любых других кусков даже нет листов спрайтов; если кусок падает с экрана, вы выбрасываете этот лист (примечание: вы на самом деле не удаляете его; вы сохраняете его и назначаете заново для нового фрагмента, который может стать видимым позже).
Я хотел бы, чтобы вся карта была обработана, по крайней мере, на серверном приложении (и на клиенте, если это возможно).
Вашему серверу не нужно знать или заботиться о визуальном представлении плиток. Все, о чем нужно заботиться, - это концептуальное представление. Пользователь добавляет плитку сюда, поэтому он изменяет индекс плитки.