Game Programming Patterns / Паттерны программирования в играх: 1.2. Flyweight
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
private: Mingun 01.05.14 в 12:00 |
|
|
TreeModel* model_; Mingun 01.05.14 в 12:00 |
||
|
Vector position_; Mingun 01.05.14 в 12:00 |
||
|
double height_; Mingun 01.05.14 в 12:01 |
||
|
double thickness_; Mingun 01.05.14 в 12:02 |
||
|
Color barkTint_; Mingun 01.05.14 в 12:02 |
||
|
Color leafTint_; Mingun 01.05.14 в 12:02 |
||
|
}; Mingun 01.05.14 в 12:02 |
||
|
Можно представить это так: Mingun 01.05.14 в 12:03 Можно визуализировать это так: IngaJolly 08.05.14 в 17:06 |
||
|
Выглядит очень похоже на шаблон Тип объекта. Mingun 01.05.14 в 12:08 Это выглядит очень похожим на паттерн "тип объекта" (Type Object). IngaJolly 08.05.14 в 17:07 |
||
|
Оба включают делегирование части состояния объекта в некоторые другие объекты, совместно используемые несколькими экземплярами. Mingun 01.05.14 в 12:10 Оба включают делегирование части состояния объекта некоему другому объекту, совместно используемому несколькими экземплярами. IngaJolly 14.05.14 в 15:39 |
||
|
Однако, цели данных шаблонов различаются. Mingun 01.05.14 в 12:11 Как бы то ни было, цели паттернов отличаются. IngaJolly 14.05.14 в 15:41 |
||
|
Целью шаблона Тип объекта является минимизация количества классов, которые вам необходимо определить путём проталкивания «типов» в вашу объектную модель. Mingun 01.05.14 в 12:13 Цель паттерна "Тип объекта" (Type Object) - минимизировать количество определяемых классов, загрузив "типы" в собственную модель объекта. IngaJolly 14.05.14 в 16:32 |
||
|
Совместное использование памяти, которое вы при этом получаете, является всего лишь бонусом. Mingun 01.05.14 в 12:14 Любое совместное использование памяти, получаемое при этом, всего лишь бонус. IngaJolly 14.05.14 в 16:32 |
||
|
Шаблон же Приспособленец заботится чисто об эффективности. Mingun 01.05.14 в 12:15 Паттерн "приспособленец" (Flyweight) полностью нацелен на эффективность. IngaJolly 14.05.14 в 16:33 |
||
|
Это всё хорошо для хранения объектов в основной памяти, но никак не помогает при отрисовке. Mingun 01.05.14 в 12:04 Это хорошо для хранения в основной памяти, но не помогает при визуализации. IngaJolly 14.05.14 в 16:34 |
||
|
Перед тем, как лес попадёт на экран, он должен пройти через память видеокарты. Mingun 01.05.14 в 12:05 Перед тем как лес окажется на экране, ему нужно пройти путь до памяти видеокарты. IngaJolly 14.05.14 в 16:35 Перед тем, как лес попадёт на экран, он должен проложить свой путь через память видеокарты. Deo 22.08.14 в 14:39 |
||
|
Мы должны выразить это совместное использование ресурсов способом, понятным видеокарте. Mingun 01.05.14 в 12:06 |
||
|
Тысяча экземпляров Mingun 01.05.14 в 12:06 |
||
|
Чтобы свести к минимуму объём данных, проталкиваемых на видеокарту, мы хотели бы иметь возможность отправить общие данные — TreeModel — всего один раз. Mingun 01.05.14 в 12:18 Чтобы минимизировать объем данных, которые нужно послать видеокарте, нужно иметь возможность отсылать совместно используемые данные - TreeModel - всего лишь однажды. IngaJolly 14.05.14 в 16:40 |
||
|
Затем, по отдельности, мы протолкнём данные, уникальные для каждого экземпляра дерева — его позицию, цвет, масштаб. Mingun 01.05.14 в 12:20 Затем отдельно отсылаем уникальные данные каждого экземпляра дерева - его позицию, цвет и масштаб. IngaJolly 14.05.14 в 16:41 |
||
|
И наконец, мы скажем видеокарте, что «используй вот эту одну модель для отрисовки каждого экземпляра». Mingun 01.05.14 в 12:21 После того говорим видеокарте: "Используй ту модель, чтобы визуализировать каждый из этих экземпляров". IngaJolly 14.05.14 в 16:42 |
||
|
К счастью, сегодняшние графические API и видеокарты поддерживают именно то, что мы хотим. Mingun 01.05.14 в 12:22 |
||
|
В подробностях это кропотливая работа, да и тема выходит за рамки данной книги, но и Direct3D, и OpenGL поддерживают отрисовку дубликатов (instanced rendering). Mingun 01.05.14 в 12:27 Подробности утомительны и выходят за рамки данной книги, но как Direct3D, так и OpenGL имеют поддержку поэкземплярной визуализации. IngaJolly 14.05.14 в 16:47 |
||
|
В обоих API вы предоставляете два потока данных. Mingun 01.05.14 в 12:28 |
||
|
Первый содержит кусок общих данных, который будет отрисовываться несколько раз — это будут сетки и текстуры в нашем «древесном» примере. Mingun 01.05.14 в 12:29 Первый представляет собой большой двоичный объект общих данных, которые будут визуализироваться несколько раз - сетка и текстуры в нашем "древесном" примере. IngaJolly 14.05.14 в 16:51 |
||
|
Второй содержит список экземпляров и их параметров, которые будут использоваться для изменения первого куска данных при каждой отрисовке. Mingun 01.05.14 в 12:31 Второй - это список экземпляров и их параметров, которые будут использоваться для того, чтобы разнообразить первый кусок данных каждый раз при отрисовке. IngaJolly 14.05.14 в 16:54 |
||
|
С помощью одного вызова отрисовки (draw call), отобразится весь лес. Mingun 01.05.14 в 12:32 С помощью единственного вызова метода отрисовки появляется целый лес. IngaJolly 14.05.14 в 17:35 |
||
|
Этот API видеокарт означает, что шаблон Приспособленец может быть единственным шаблоном проектирования «Банды четырёх», имеющим аппаратную поддержку. Mingun 01.05.14 в 12:34 Данное API видеокарты означает, что паттерн "приспособленец" может быть единственным паттерном проектирования "Банды четырех", имеющим реальную аппаратную поддержку. IngaJolly 14.05.14 в 17:44 |
||
|
Шаблон Приспособленец Mingun 01.05.14 в 12:07 Паттерн "приспособленец" (Flyweight) IngaJolly 14.05.14 в 17:44 |
||
|
Теперь, когда у нас в багаже есть конкретный пример, мы можем продвинутся дальше к следующему шаблону. Mingun 02.05.14 в 09:57 Теперь, когда у нас в кобуре есть конкретное оружие в виде примера, можно рассмотреть весь паттерн. IngaJolly 14.05.14 в 17:46 |
||
|
Приспособленец, как неявно следует из его названия, вступает в игру тогда, когда у вас есть объекты, которые должны бы быть более лёгкими, чем они есть на самом деле, в основном потому, что их слишком много. Mingun 02.05.14 в 12:48 "Приспособленец" ("Flyweight" по англ. - игра слов "fly" - лететь, "weight" - вес) вступает в игру, когда есть объекты, требующие большей "легковесности", в основном потому что их слишком много. IngaJolly 14.05.14 в 17:48 |
+2 | |
|
С отрисовкой дубликатов становится важно, не сколько памяти занимают объекты, а сколько времени занимает проталкивание каждого дерева по шине на видеокарту, но основная идея остаётся прежней. Mingun 03.05.14 в 14:25 При поэкземплярной визуализации каждое отдельное дерево отнимает больше времени, чем памяти на передвижение по шине к видеокарте, но основная идея остается той же. IngaJolly 14.05.14 в 17:51 |
||
|
Шаблон решает проблему путём разделения данных объекта на два вида: первый вид данных — это те вещи, которые не являются уникальными для каждого экземпляра объекта, так что они могут использоваться совместно всеми экземплярами. Mingun 03.05.14 в 14:30 Паттерн решает это, разделив данные объекта на два вида: первый вид данных - характеристики, не являющиеся уникальными для отдельного экземпляра объекта, которые могут использовать совместно все экземпляры. IngaJolly 14.05.14 в 17:55 |
||
|
«Банда четырёх» называет эти вещи внутренним состоянием, но я предпочитаю называть их «контекстно-свободными» вещами. Mingun 03.05.14 в 14:32 "Банда четырех" называет это свойственным состоянием, но мне нравится термин "контекстно-свободные" характеристики. IngaJolly 26.08.14 в 16:41 |
||
|
В данном примере такими вещами являются геометрия и текстуры дерева. Mingun 03.05.14 в 14:32 В примере это геометрия и текстуры дерева. IngaJolly 26.08.14 в 16:42 |
||
|
Оставшиеся данные являются внешним состоянием, вещи, уникальные для каждого экземпляра. Mingun 03.05.14 в 14:42 Остальные данные - это несвойственное состояние, характеристики, уникальные для каждого экземпляра. IngaJolly 14.05.14 в 17:57 |
||
|
В данном случае, это позиция, масштаб и цвет каждого дерева. Mingun 03.05.14 в 14:48 Здесь это позиция, масштаб и цвет каждого дерева. IngaJolly 26.08.14 в 16:44 |
||
|
Также, как и в куске кода примера выше, этот шаблон сокращает расход памяти путём разделения одной копии внутреннего состояния между всеми местами, где встречается объект. Mingun 03.05.14 в 14:51 Как в куске кода из вышеприведенного примера, паттерн экономит память, используя одну и ту же копию свойственного состояния везде, где появляется объект. IngaJolly 14.05.14 в 18:01 |
||
|
Исходя из того, что мы видели до сих пор, может показаться, что шаблон просто обеспечивает базовое разделение ресурсов и вряд ли заслуживает носить гордое звание «шаблона». Mingun 03.05.14 в 14:54 Исходя из ранее увиденного, это кажется простым совместным использованием ресурсов и вряд ли стоит того, чтобы называться паттерном. IngaJolly 14.05.14 в 18:03 |
||
|
Отчасти так кажется потому, что в данном примере довольно легко выделить общее состояние: класс TreeModel. Mingun 03.05.14 в 14:55 Так кажется отчасти потому, что в примере мы могли бы создать отдельную сущность для совместно используемого состояния: TreeModel. IngaJolly 14.05.14 в 18:05 |
||
|
Я нахожу этот шаблон не столь очевидным (и, следовательно, более умным) Mingun 03.05.14 в 14:56 Этот паттерн менее очевидный (и потому более хитрый) IngaJolly 14.05.14 в 18:06 |
||
|
при использовании в случаях, когда не так-то просто выделить что-то общее в разделяемый объект. Mingun 03.05.14 в 14:57 при использовании в случаях, когда нет действительно четко определенной сущности для совместно используемого объекта. IngaJolly 14.05.14 в 18:07 |
||
|
В этих случаях это выглядит так, что объект волшебным образом появляется в нескольких местах одновременно. Mingun 03.05.14 в 14:59 В таких случаях кажется, что объект магическим образом находится в нескольких местах одновременно. IngaJolly 14.05.14 в 18:08 |
||
|
Давайте я покажу вам ещё один пример. Mingun 03.05.14 в 14:59 Позвольте мне продемонстрировать другой пример. IngaJolly 14.05.14 в 18:08 |
||
|
Место пускания корней Mingun 03.05.14 в 15:01 Где бы пустить корни IngaJolly 14.05.14 в 18:09 |
||
|
Земля, на которой растут деревья, тоже должна быть представлена в нашей игре. Mingun 03.05.14 в 15:03 |
||
|
Она может состоять из кусков травы, грязи, холмов, озёр, рек и любого другого ландшафта, который мы сможем придумать. Mingun 03.05.14 в 15:05 На земле может быть трава, грязь, холмы, озера, реки и любой другой ландшафт по желанию. IngaJolly 14.05.14 в 18:11 |
||
|
Мы сделаем нашу землю состоящую из плиток: поверхность мира будет огромной сеткой маленьких плиток. Mingun 03.05.14 в 15:07 Мы сделаем землю мозаичной: поверхность в виде огромной сетки крошечных плиток. IngaJolly 14.05.14 в 18:13 |
||
|
Каждая плитка будет покрыта одним видом ландшафта. Mingun 03.05.14 в 15:08 Каждая плитка покрыта одним видом ландшафта. IngaJolly 26.08.14 в 17:03 |
