додаток виходить з ладу, коли він досягає 1,5 Гбіт.
Це настійно говорить про те, що ви не представляєте свої плитки правильно, оскільки це означатиме, що кожна плитка має розмір ~ 80 байт.
Те, що вам потрібно зрозуміти, - це те, що між концепцією геймплей плитки та візуальною плиткою, яку бачить користувач, має бути відокремлений . Ці два поняття - це не одне і те ж .
Візьмемо для прикладу Terraria. Найменший у світі 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, щоб зробити це швидше, ніж просто малювати окремі квадратики.
Тепер видиму область плиток потрібно розбити на різні шматки, так що ви не будуєте постійно спрайтові листи, коли камера рухається. Отже, у вас можуть бути 64x64 шматки світу як аркуші спрайту. Незалежно від того, звідки в поточному положенні камери гравця видно 64x64 шматки світу, - це шматки, які ви малюєте. Будь-які інші шматки навіть не мають спрайтових аркушів; якщо шматок впаде з екрана, ви викидаєте цей аркуш (зверніть увагу: ви насправді не видаляєте його; ви тримаєте його навколо і поважаєте його за новий шматок, який може стати видимим пізніше).
Мені хотілося б, щоб вся карта була оброблена принаймні на серверній програмі (і по можливості клієнту).
Ваш сервер не повинен знати або дбати про візуальне зображення плиток. Все, про що потрібно дбати, - це концептуальне зображення. Користувач додає сюди плитку, тому він змінює індекс плитки.