LINUX.ORG.RU

Шаблон Flyweight (C++)

 


0

3

Здравствуйте. Делаю небольшую игру на С++ в которой есть карта, которая состоит из 50х50 ячеек, в итоге выходит 2500 объектов, но есть отличный шаблон для таких целей - Flyweight, который дает возможность создать для поля 50х50 не 2500 объектов, а напр. 5 объектов.

Приспособленец сохраняет уникальные объекты в коллекцию ключ-значение

std::map<int, Tile *> m_tiles;
Саму реализацию проводить не буду, она типичная. После отрисовки самой карты все хорошо, но если нужно изменить хотя бы один объект, аналогичные объекты по типу, меняются тоже, оно и понятно (все аналогичные объекты имеют одинаковый адрес). А есть какая-то альтернатива для решения этой проблемы, чтобы создавалось напр. не 2500 объектов, а поменьше, но с разными адресами, чтобы после изменения одного, не изменялись остальные?

Саму реализацию проводить не буду, она типичная.

Зря. Зачем тогда показал std::map, он тоже типичный.

если нужно изменить хотя бы один объект, аналогичные объекты по типу, меняются тоже

Логика подсказывает, что перед тем как изменить объект, надо его отделить от остальных. Не пойму в чём проблема.

ox55ff ★★★★★
()

Это ты так разряженный массив обозвал надоевшим все словом шаблон-шма-паттерн?

По теме. Раскрой задачу. Ни фига ведь непонятно

dave ★★★★★
()
Ответ на: комментарий от Nietzsche

Лорчую этого оратора. При изменении объекта копируй его и изменяй копию.

hippi90 ★★★★★
()

Шаблоны головного мозга?

Для начала, 2500 объектов любой вменяемой конфигурации - это копейки и ни разу не повод усложнять код.

Потом, если у тебя там 2496 одинаковых умолчальных объектов и 4 кастомных, храни только отличные от умолчания объекты, и отдавай объект по умолчанию если не-умолчального не нашлось.

И в крайнем случае, если это действительно выгодно (например, свойств объекта прям мегабайты, и надо типом объекта прям заливать большие площади, а потом менять отдельные ячейки), то да, copy-on-write. Для объектов хранится refcount, чтение из ячейки просто возвращает const ссылку на объект по указателю, а при записи мы сначала смотрим на refcount объекта в ячейке, если он равен единице то спокойно напрямую меняем его свойства, а если refcount > 1, то уменьшаем refcount, копируем объект с refcount=1, кладём в ячейку и только потом меняем.

Но в общем случае у тебя в каждой ячейке может быть уникальный объект, поэтому вся эта чушь не нужна и только добавляет оверхед, тормоза и усложняет код, поэтому возвращаемся к п.1 и тупо храним <array<array<Object, N>, N>.

slovazap ★★★★★
()

а напр. 5 объектов
но если нужно изменить хотя бы один объект

То будетуже 6 объектов. А на карте новым объектом перерисовывай нужные детали.

anonymous
()

ну очевидно же: если меняешь объект, то перед этим создай его копию. она не затронет остальных «одинаковых» объектов

bvn13 ★★★★★
()
Ответ на: комментарий от peregrine

Вот когда будет 250 000 тогда другой разговор.

Даже 250 000 * 8 по нынешним временам это фигня. ОП просто не понимает смысла паттерна Flyweight, на который с умным видом ссылается.

asaw ★★★★★
()

Flyweight, который дает возможность создать для поля 50х50 не 2500 объектов, а напр. 5 объектов

Не например 5, а конкретно 2500, но с общими данными. И при чём тут flyweight, когда у тебя обычная ленивая инициализация?

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

Я нихрена не понял что хочет автор.

hlamotron
()
Ответ на: комментарий от peregrine

Зачем пляски когда всего 2500 объектов? Вот когда будет 250 000 тогда другой разговор.

Плюсую. 2500 даже последовательно перебирать на каждом кадре игры - современный проц будет скучать.

hlamotron
()

Как бы не оказалось, что мап тормозит ваш код сильнее чем что бы то ни было. Вектор может? Далее, зачем вообще во внутреннем представлении поиск по идентификатору? Указатель на Tile вполне может лежать в ячейке напрямую и идентифицировать тайл не хуже. В остальном согласен с вышеотписавшимися copy-on-write.

khrundel ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.