Хоча я погоджуюсь з думками: "не хвилюйтеся з цього приводу, якщо це не доведена проблема", я думаю, що варто заздалегідь подумати над тим: ретро пристосування рішення набагато болючіше. І так, лише оновлення плиток "поблизу" - це шлях. Але ефективність зберігання та адресації предметів у вашому ігровому світі дуже важлива з міркувань продуктивності.
Те, про що ви дійсно думаєте тут, - це розріджений набір даних: те, де потенційні показники великі (або необмежені), але насправді використовується лише невелика частка. Ключовим моментом є те, що ви точно не знаєте, яка пропорція буде використовуватися.
Стандартним рішенням розрізненої задачі набору даних є відокремлення індексу / адресації від фактичного зберігання даних. Тож якщо плитковий предмет дорогий, зберігайте його в компактному вигляді (наприклад, плоский масив). Але дозвольте його індексувати через більш дешевий об’єкт. У своїй найпростішій формі це може бути 2D (або 3D) матриця, яку ви можете легко індексувати за координатами, але кожен елемент у матриці - це просто індекс. Потім ви використовуєте цей індекс для пошуку фактичного вмісту плитки в окремому компактному масиві. Якщо вміст плитки ще не існує, додайте їх у кінець масиву та збережіть індекс у тривимірній матриці.
Рішення стає складнішим, якщо ви хочете підтримати видалення вмісту (оскільки це призводить до фрагментації масиву вмісту), а якщо вміст плитки недорогий, додаткова вага індексу (32-бітний або 64-бітний індекси) ймовірно, перекриє заощадження від не зберігання кожної потенційної плитки. Це також додатковий пошук, який зашкодить вашій роботі кешу.
Ви можете отримати ще більшу ефективність зберігання, ввівши додаткові шари непрямості. Скажімо, ви організовуєте свою плитку в шматки, а шматки мають деталізацію 64x64x64. Враховуючи плитку в 125, 1, 132, ви знаєте, що вона належить шматку (1,0,2). Отже, у вас є світ, який складається з компактного масиву фрагментів і матриці індексів фрагмента (-1, якщо фрагмент не існує). Вміст кожного фрагменту (якщо він присутній) - це матриця розмірами 64x64x64 індексів плитки (-1, якщо плитка ще не існує) та компактний масив використаних плиток. Таким чином, ви не спалюєте велику кількість індексів плитки для шматок, які ніколи не використовуються. Дотримуючись такого роду підходу та підбираючи розумні номери для деталізації шматка, ви зможете масово масштабувати свій Всесвіт і тримати контроль пам'яті. Насправді, якщо ви робите шматки 32x32x32,
Ви також можете робити підступні трюки, як, наприклад, використовувати біт високого порядку для ваших шматочків або плиткових індексів, щоб означати щось особливе. Отже, якщо запис у матриці плиток має верхній набір бітів, то нижній 31 біт не означає індекс плитки, натомість вони означають "індекс основи" чи щось подібне, і ви можете переглянути це в окремо підтримуваному списку щоб дізнатись координати, до яких вона веде.