Страницы

Поиск по вопросам

среда, 25 декабря 2019 г.

Хранение, доступ и жизненный цикл данных необходимым для отрисовки

#алгоритм #разработка_игр #архитектура #графика


Имеется простая 2D игра с видом сверху и в профиль (как в Heroes of Might and Magic
III). Игровая карта - тайловая, процедурно генерируемая, её размер - не ограничен.
По мере перемещения персонажа подгружаются новые участки карты (чанки), другие удаляются.

Каждый объект, который должен отображаться на экране, содержит компонент GraphicsInfo,
который в свою очередь хранит такие данные как позиция на экране, размеры и т.д. Идея
заключается в том, чтобы в части программы, отвечающей за отрисовку, хранить коллекцию
всех этих объектов удобным для отрисовки способом.

Но появилась сложность - при выгрузке чанков из памяти нужно как-то определять, какие
именно объекты GraphicsInfo там находились и удалять их из коллекции.Все осложняется
ещё тем, что загрузка и выгрузка чанков осуществялется в отдельном потоке. Поэтому
хранить объекты в самих чанках и удалять их оттуда непосредственно при выгрузке не
хотелось бы, т.к. задача сильно усложняется проблемой синхронизации разных потоков.

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


Ответы

Ответ 1



По идее, вы храните объекты (или ссылки на них, не суть) в чанках. Загрузили чанк - добавили его объекты к отрисовке. Выгрузили чанк - убрали его объекты из отрисовки. Для упрощения, можете в каждом объекте добавить поле "к какому чанку он относится". Тогда удаление станет еще проще. Хотя, чанки обычно квадратные и вычислить чанк по расположению объекта проще простого. Все операции по добавлению и удалению, естественно нужно делать в критических секциях (или других объектах синхронизации), во избежании ошибок.

Комментариев нет:

Отправить комментарий