Страницы

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

вторник, 27 ноября 2018 г.

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

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


Ответ

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

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

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