Game Programming Patterns / Паттерны программирования в играх: 1.2. Flyweight

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

private:

Mingun 01.05.14 в 12:00

1

TreeModel* model_;

Mingun 01.05.14 в 12:00

1

Vector position_;

Mingun 01.05.14 в 12:00

1

double height_;

Mingun 01.05.14 в 12:01

1

double thickness_;

Mingun 01.05.14 в 12:02

1

Color barkTint_;

Mingun 01.05.14 в 12:02

1

Color leafTint_;

Mingun 01.05.14 в 12:02

1

};

Mingun 01.05.14 в 12:02

1

Можно представить это так:

Mingun 01.05.14 в 12:03

1

Можно визуализировать это так:

IngaJolly 08.05.14 в 17:06

0

Выглядит очень похоже на шаблон Тип объекта.

Mingun 01.05.14 в 12:08

0

Это выглядит очень похожим на паттерн "тип объекта" (Type Object).

IngaJolly 08.05.14 в 17:07

1

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

Mingun 01.05.14 в 12:10

0

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

IngaJolly 14.05.14 в 15:39

0

Однако, цели данных шаблонов различаются.

Mingun 01.05.14 в 12:11

0

Как бы то ни было, цели паттернов отличаются.

IngaJolly 14.05.14 в 15:41

0

Целью шаблона Тип объекта является минимизация количества классов, которые вам необходимо определить путём проталкивания «типов» в вашу объектную модель.

Mingun 01.05.14 в 12:13

0

Цель паттерна "Тип объекта" (Type Object) - минимизировать количество определяемых классов, загрузив "типы" в собственную модель объекта.

IngaJolly 14.05.14 в 16:32

0

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

Mingun 01.05.14 в 12:14

0

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

IngaJolly 14.05.14 в 16:32

0

Шаблон же Приспособленец заботится чисто об эффективности.

Mingun 01.05.14 в 12:15

0

Паттерн "приспособленец" (Flyweight) полностью нацелен на эффективность.

IngaJolly 14.05.14 в 16:33

1

Это всё хорошо для хранения объектов в основной памяти, но никак не помогает при отрисовке.

Mingun 01.05.14 в 12:04

1

Это хорошо для хранения в основной памяти, но не помогает при визуализации.

IngaJolly 14.05.14 в 16:34

0

Перед тем, как лес попадёт на экран, он должен пройти через память видеокарты.

Mingun 01.05.14 в 12:05

0

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

IngaJolly 14.05.14 в 16:35

0

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

Deo 22.08.14 в 14:39

0

Мы должны выразить это совместное использование ресурсов способом, понятным видеокарте.

Mingun 01.05.14 в 12:06

2

Тысяча экземпляров

Mingun 01.05.14 в 12:06

1

Чтобы свести к минимуму объём данных, проталкиваемых на видеокарту, мы хотели бы иметь возможность отправить общие данные — TreeModel — всего один раз.

Mingun 01.05.14 в 12:18

0

Чтобы минимизировать объем данных, которые нужно послать видеокарте, нужно иметь возможность отсылать совместно используемые данные - TreeModel - всего лишь однажды.

IngaJolly 14.05.14 в 16:40

0

Затем, по отдельности, мы протолкнём данные, уникальные для каждого экземпляра дерева — его позицию, цвет, масштаб.

Mingun 01.05.14 в 12:20

0

Затем отдельно отсылаем уникальные данные каждого экземпляра дерева - его позицию, цвет и масштаб.

IngaJolly 14.05.14 в 16:41

0

И наконец, мы скажем видеокарте, что «используй вот эту одну модель для отрисовки каждого экземпляра».

Mingun 01.05.14 в 12:21

0

После того говорим видеокарте: "Используй ту модель, чтобы визуализировать каждый из этих экземпляров".

IngaJolly 14.05.14 в 16:42

0

К счастью, сегодняшние графические API и видеокарты поддерживают именно то, что мы хотим.

Mingun 01.05.14 в 12:22

1

В подробностях это кропотливая работа, да и тема выходит за рамки данной книги, но и Direct3D, и OpenGL поддерживают отрисовку дубликатов (instanced rendering).

Mingun 01.05.14 в 12:27

0

Подробности утомительны и выходят за рамки данной книги, но как Direct3D, так и OpenGL имеют поддержку поэкземплярной визуализации.

IngaJolly 14.05.14 в 16:47

0

В обоих API вы предоставляете два потока данных.

Mingun 01.05.14 в 12:28

1

Первый содержит кусок общих данных, который будет отрисовываться несколько раз — это будут сетки и текстуры в нашем «древесном» примере.

Mingun 01.05.14 в 12:29

0

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

IngaJolly 14.05.14 в 16:51

0

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

Mingun 01.05.14 в 12:31

0

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

IngaJolly 14.05.14 в 16:54

0

С помощью одного вызова отрисовки (draw call), отобразится весь лес.

Mingun 01.05.14 в 12:32

0

С помощью единственного вызова метода отрисовки появляется целый лес.

IngaJolly 14.05.14 в 17:35

1

Этот API видеокарт означает, что шаблон Приспособленец может быть единственным шаблоном проектирования «Банды четырёх», имеющим аппаратную поддержку.

Mingun 01.05.14 в 12:34

0

Данное API видеокарты означает, что паттерн "приспособленец" может быть единственным паттерном проектирования "Банды четырех", имеющим реальную аппаратную поддержку.

IngaJolly 14.05.14 в 17:44

0

Шаблон Приспособленец

Mingun 01.05.14 в 12:07

0

Паттерн "приспособленец" (Flyweight)

IngaJolly 14.05.14 в 17:44

0

Теперь, когда у нас в багаже есть конкретный пример, мы можем продвинутся дальше к следующему шаблону.

Mingun 02.05.14 в 09:57

0

Теперь, когда у нас в кобуре есть конкретное оружие в виде примера, можно рассмотреть весь паттерн.

IngaJolly 14.05.14 в 17:46

0

Приспособленец, как неявно следует из его названия, вступает в игру тогда, когда у вас есть объекты, которые должны бы быть более лёгкими, чем они есть на самом деле, в основном потому, что их слишком много.

Mingun 02.05.14 в 12:48

0

"Приспособленец" ("Flyweight" по англ. - игра слов "fly" - лететь, "weight" - вес) вступает в игру, когда есть объекты, требующие большей "легковесности", в основном потому что их слишком много.

IngaJolly 14.05.14 в 17:48

1
+2

С отрисовкой дубликатов становится важно, не сколько памяти занимают объекты, а сколько времени занимает проталкивание каждого дерева по шине на видеокарту, но основная идея остаётся прежней.

Mingun 03.05.14 в 14:25

0

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

IngaJolly 14.05.14 в 17:51

0

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

Mingun 03.05.14 в 14:30

0

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

IngaJolly 14.05.14 в 17:55

0

«Банда четырёх» называет эти вещи внутренним состоянием, но я предпочитаю называть их «контекстно-свободными» вещами.

Mingun 03.05.14 в 14:32

0

"Банда четырех" называет это свойственным состоянием, но мне нравится термин "контекстно-свободные" характеристики.

IngaJolly 26.08.14 в 16:41

0

В данном примере такими вещами являются геометрия и текстуры дерева.

Mingun 03.05.14 в 14:32

0

В примере это геометрия и текстуры дерева.

IngaJolly 26.08.14 в 16:42

0

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

Mingun 03.05.14 в 14:42

0

Остальные данные - это несвойственное состояние, характеристики, уникальные для каждого экземпляра.

IngaJolly 14.05.14 в 17:57

0

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

Mingun 03.05.14 в 14:48

0

Здесь это позиция, масштаб и цвет каждого дерева.

IngaJolly 26.08.14 в 16:44

0

Также, как и в куске кода примера выше, этот шаблон сокращает расход памяти путём разделения одной копии внутреннего состояния между всеми местами, где встречается объект.

Mingun 03.05.14 в 14:51

0

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

IngaJolly 14.05.14 в 18:01

0

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

Mingun 03.05.14 в 14:54

0

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

IngaJolly 14.05.14 в 18:03

0

Отчасти так кажется потому, что в данном примере довольно легко выделить общее состояние: класс TreeModel.

Mingun 03.05.14 в 14:55

0

Так кажется отчасти потому, что в примере мы могли бы создать отдельную сущность для совместно используемого состояния: TreeModel.

IngaJolly 14.05.14 в 18:05

0

Я нахожу этот шаблон не столь очевидным (и, следовательно, более умным)

Mingun 03.05.14 в 14:56

0

Этот паттерн менее очевидный (и потому более хитрый)

IngaJolly 14.05.14 в 18:06

0

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

Mingun 03.05.14 в 14:57

0

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

IngaJolly 14.05.14 в 18:07

0

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

Mingun 03.05.14 в 14:59

0

В таких случаях кажется, что объект магическим образом находится в нескольких местах одновременно.

IngaJolly 14.05.14 в 18:08

0

Давайте я покажу вам ещё один пример.

Mingun 03.05.14 в 14:59

0

Позвольте мне продемонстрировать другой пример.

IngaJolly 14.05.14 в 18:08

0

Место пускания корней

Mingun 03.05.14 в 15:01

0

Где бы пустить корни

IngaJolly 14.05.14 в 18:09

0

Земля, на которой растут деревья, тоже должна быть представлена в нашей игре.

Mingun 03.05.14 в 15:03

1

Она может состоять из кусков травы, грязи, холмов, озёр, рек и любого другого ландшафта, который мы сможем придумать.

Mingun 03.05.14 в 15:05

0

На земле может быть трава, грязь, холмы, озера, реки и любой другой ландшафт по желанию.

IngaJolly 14.05.14 в 18:11

0

Мы сделаем нашу землю состоящую из плиток: поверхность мира будет огромной сеткой маленьких плиток.

Mingun 03.05.14 в 15:07

0

Мы сделаем землю мозаичной: поверхность в виде огромной сетки крошечных плиток.

IngaJolly 14.05.14 в 18:13

0

Каждая плитка будет покрыта одним видом ландшафта.

Mingun 03.05.14 в 15:08

0

Каждая плитка покрыта одним видом ландшафта.

IngaJolly 26.08.14 в 17:03

0
Минутку...

← Предыдущая страница

Следующая страница →