Хранение больших 2D игровых миров

Сочинить? При парсинге запроса Вы повреждаете его в его составные части (маркеры, и т.д.), реверс составил бы части в строковый запрос.

7
задан grey 2 August 2009 в 13:38
поделиться

5 ответов

Квадродеревья - довольно эффективное решение для хранения данных о большом двумерном мире и объектах в нем.

7
ответ дан 6 December 2019 в 21:17
поделиться

Разбейте мир на более мелкие области и разберитесь с ними. Любое решение этой проблемы будет сводиться к этой концепции (например, квадродеревья, упомянутые в другом ответе). Различия будут в том, как они подразделяют мир.

Сколько данных хранится на тайле? Как быстро игроки могут перемещаться по миру? Как ведут себя неигровые персонажи и т. Д., Находящиеся за кадром? Они просто сбрасываются, когда игрок возвращается (как в старых играх Zelda)? Они просто возобновят работу с того места, где были? Выполняют ли они какой-то догоняющий сценарий?

Сколько разных данных рендеринга потребуется для разных областей?

Какую часть мира можно увидеть одновременно?

Все эти вопросы повлияют на ваше решение, а также на возможности вашей платформы.

2
ответ дан 6 December 2019 в 21:17
поделиться

Вы можете получить некоторые идеи о том, как реализовать это, из некоторых структур пространственных данных, таких как деревья диапазона или kd.

Однако ответ на этот вопрос будет значительно варьироваться в зависимости от того, как именно ваша игра работает.

Мы говорим о 2D-платформере с 10 врагами на экране, еще 20 за кадром, но «активными», и неизвестным числом, более «неактивными»? Если это так, вы, вероятно, можете сохранить весь свой уровень в виде массива «экранов», где вы будете управлять ближайшими к вам.

Или вы имеете в виду настоящую 2D-игру с большим количеством движений вверх / вниз? Возможно, вам придется быть здесь немного осторожнее.

Платформа также имеет некоторое значение. Если вы реализуете простой платформер для настольных ПК, вам, вероятно, не придется беспокоиться о производительности так же сильно, как на встроенном устройстве. Это не оправдание, чтобы быть наивным в этом вопросе, но, возможно, вам также не нужно быть ужасно умным.

Я думаю, это несколько интересный вопрос. Предположительно, кто-то умнее меня, имеющий опыт внедрения платформеров, уже придумал эти вещи.

2
ответ дан 6 December 2019 в 21:17
поделиться

Предполагая, что ваша игра обновит только видимое и некоторую область вокруг видимого, просто разбейте мир на «экраны» («экран» - это прямоугольная область на тайловой карте, которая может заполнить весь экран). Храните в памяти «экраны» вокруг видимой области (и некоторые другие, если вы хотите обновить сущности, которые близки к персонажу - но нет особых причин обновлять сущность, которая находится далеко), а остальное храните на диске с кешем чтобы избежать загрузки / разгрузки часто посещаемых мест при перемещении. Некоторые настройки, например:

+---+---+---+---+---+---+---+
|FFF|FFF|FFF|FFF|FFF|FFF|FFF|
+---+---+---+---+---+---+---+
|FFF|NNN|NNN|NNN|NNN|NNN|FFF|
+---+---+---+---+---+---+---+
|FFF|NNN|NNN|NNN|NNN|NNN|FFF|
+---+---+---+---+---+---+---+
|FFF|NNN|NNN|VVV|NNN|NNN|FFF|
+---+---+---+---+---+---+---+
|FFF|NNN|NNN|NNN|NNN|NNN|FFF|
+---+---+---+---+---+---+---+
|FFF|NNN|NNN|NNN|NNN|NNN|FFF|
+---+---+---+---+---+---+---+
|FFF|FFF|FFF|FFF|FFF|FFF|FFF|
+---+---+---+---+---+---+---+

Где часть "V" - это "экран", где находится центр (герой или что-то еще), части "N" - это те, кто находится поблизости и имеет активные (обновляемые) объекты, проверяются на столкновения, и т.д. и "F" части - это далеко не все части, которые могут обновляться нечасто и могут быть «выгружены» (сохранены на диск). Конечно, вы можете захотеть использовать больше "N" экранов, чем два: -).

Обратите внимание на то, что, поскольку 2D-игры обычно не хранят много данных, вместо того, чтобы сохранять удаленные части на диск, вы можете просто сохранить их память сжата.

1
ответ дан 6 December 2019 в 21:17
поделиться

Возможно, вы захотите использовать один массив int или байтов, который ссылается на типы блоков. Если вам нужна дополнительная оптимизация оттуда, вы захотите связать с более сложными структурами данных, такими как деревья Oct из вашего массива. Здесь есть хорошее обсуждение на игровом форуме Java: http://www.javagaming.org/index.php/topic,20505.30.html text

Все, что содержит ссылки, становится очень дорогим, потому что указатель что-то занимает например, 8 байтов каждый, в зависимости от языка, поэтому в зависимости от того, насколько заселен ваш мир, он может очень быстро стать дорогим (8 указателей по 8 байтов каждый составляют 64 байта на элемент, а массив байтов - 1 байт на элемент). Так что, если 1/64 вашего мира не пуста, байтовый массив будет гораздо лучшим вариантом. Вам также придется потратить много времени на итерацию по дереву всякий раз, когда вы повторный поиск коллизий или чего-то еще - массив байтов будет мгновенным поиском.

Надеюсь, этого достаточно для вас. : -)

0
ответ дан 6 December 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: