Поскольку у вас есть бесконечные уровни, я бы предложил структуру, похожую на ту, что у вас уже есть, с небольшим изменением.
Вместо того, чтобы хранить все в одном большом массиве и перемещать вещи внутри этого массива каждый раз, когда пользователь перемещает (ой), вместо этого сохраняйте 9 фрагментов карты (каждый размером, примерно равным удвоенному размеру экрана), когда пользователь приближается к краю текущего чанка, расположите чанки за кадром, переместите все левые чанки и загрузите новые в промежуток.
Надеюсь, это было понятно, но на всякий случай вот диаграмма:
![Chunking](https://i.stack.imgur.com/kXGK1.png)
Буквенные квадраты - это куски карты, а красный квадрат - это окно просмотра (я нарисовал его немного слишком большим, помните, что окно просмотра меньше черных квадратов). Когда окно просмотра перемещается вправо, вы выгружаете фрагменты A B и C, перемещаете все остальные влево и загружаете новые данные в самые правые. Поскольку чанк в два раза больше ширины экрана, у вас есть время, необходимое пользователю, чтобы пересечь экран, чтобы сгенерировать / загрузить уровень в эти чанки. Если пользователь быстро перемещается по миру, у вас может быть набор фрагментов 4x4 для дополнительной буферизации.
Для решения возврата к предыдущим фрагментам карты. Есть несколько способов сделать это:
- Запишите куски на жесткий диск, когда они больше не используются (или что-либо подобное в javascript)
- Расширяйте свой блок бесконечно в памяти. Вместо массива чанков есть ассоциативный массив, который занимает х / у позицию чанка и возвращает чанк (или ноль, что указывает на то, что пользователь никогда не был здесь раньше, и его нужно сгенерировать).
- Процедурно генерируйте свои уровни, это сложно, но это означает, что, как только чанк уходит с экрана, вы можете просто утилизировать его и быть уверенным, что позже сможете восстановить тот же самый чанк снова