Game Programming Patterns / Паттерны программирования в играх: 1.2. Flyweight
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Поднимается туман, открывая взору старый величественный лес. Qeruim 01.05.14 в 10:45 |
|
|
Древние болиголовы, неподдающиеся счету, стоят перед вами в виде соборной оранжереи. Qeruim 01.05.14 в 10:47 Древние болиголовы бесчисленным числом возвышаются над вами, образуя собор из зелени. IngaJolly 07.05.14 в 19:20 |
||
|
Солнечные лучи золотыми стержнями пронизывают туман сквозь витражный навес из листьев. Mingun 01.05.14 в 11:19 Витражный навес из листьев преломляет солнечный свет, превращая его в золотые лучи тумана. IngaJolly 08.05.14 в 16:29 |
||
|
Между гигантскими стволами, вы можете увидеть огромный лес простирающийся в даль. Qeruim 01.05.14 в 10:55 Меж гигантских стволов вы можете разглядеть густой лес, простирающийся вдаль. IngaJolly 08.05.14 в 16:31 |
||
|
Об этой своего рода потусторонней обстановке мы мечтаем, когда становимся разработчиками игр, и сцены, подобные этой, часто встают перед глазами при упоминании шаблона, название которого не могло бы быть более сдержанным: скромный Приспособленец. Mingun 01.05.14 в 11:27 О подобном другом мире мы мечтаем, будучи разработчиками игр, и такие сцены часто возможны благодаря паттерну со скромнейшим названием "Приспособленец" (Flyweight). IngaJolly 08.05.14 в 16:36 |
||
|
Лес за деревьями Mingun 01.05.14 в 11:27 Лес вместо деревьев IngaJolly 08.05.14 в 16:38 Засадим деревьями лес. Deo 22.08.14 в 08:57 |
||
|
Я могу описать разросшийся лес всего парой предложений, но его реализация в реалтаймовой игре - совсем другая история. undefiened 30.04.14 в 17:56 Я могу описать разросшийся лес парой предложений, но его реализация в игре реального времени — совсем другая история. Mingun 01.05.14 в 11:31 Я могу описать густой лес всего несколькими предложениями, но фактическая реализация его в игре в режиме реального времени - совсем другая история. IngaJolly 08.05.14 в 16:42 |
||
|
В то время, как вы видите на своем мониторе лес разнообразных деревьев, все, что видит программист - миллионы полигонов, разгребаемые видеокартой 60 раз в секунду. undefiened 30.04.14 в 17:59 Когда ваш экран заполняет целый лес индивидуальных деревьев, всё, что видит программист графики — так это миллионы полигонов, которые видеокарта должна разгребать 60 раз в секунду. Mingun 01.05.14 в 11:36 Когда экран заполняет целый лес отдельных деревьев, всё, что видит программист графики - это миллионы полигонов, которые ему как-то нужно передавать видеокарте каждую шестидесятую часть секунды. IngaJolly 08.05.14 в 16:45 |
||
|
Речь идет о сотнях деревьев, каждое из которых детализировано с помощью сотней полигонов. undefiened 30.04.14 в 18:02 Речь идёт о тысячах деревьев, подробная геометрия каждого из которых состоит из тысяч полигонов. Mingun 01.05.14 в 11:37 Мы говорим о тысячах деревьев, каждое из которых имеет детализированную геометрию из тысяч полигонов. IngaJolly 08.05.14 в 16:45 |
||
|
Даже если у вас достаточно памяти для описания такого леса, чтобы его можно было отрисовать, данные должны пробиться по шине от центрального процессора на видеокарту. Mingun 01.05.14 в 11:40 Даже если у вас достаточно памяти для описания этого леса, чтобы визуализировать его, этим данным придется проделать путь по шине от центрального процессора к видеокарте. IngaJolly 08.05.14 в 16:48 |
||
|
Каждое дерево имеет кучу связанных с ним данных: Mingun 01.05.14 в 11:40 |
||
|
Сетка из полигонов, которые определяют форму ствола, ветвей и зелени. Mingun 01.05.14 в 11:41 |
||
|
Текстуры для коры и листьев. Mingun 01.05.14 в 11:41 |
||
|
Его местоположение в ориентация в лесу. Mingun 01.05.14 в 11:41 Его положение и ориентация в лесу. IngaJolly 08.05.14 в 16:50 |
||
|
Параметры тонкой настройки, вроде размера и оттенка, чтобы каждое дерево выглядело уникальным. Mingun 01.05.14 в 11:42 |
||
|
Если вы обрисуете это всё в коде, вы получите что-то вроде этого: Mingun 01.05.14 в 11:43 Если придется написать быстрый код, то получится что-то вроде этого: IngaJolly 08.05.14 в 16:51 |
||
|
class Tree Mingun 01.05.14 в 11:43 |
||
|
{ Mingun 01.05.14 в 11:43 |
||
|
private: Mingun 01.05.14 в 11:43 |
||
|
Mesh mesh_; Mingun 01.05.14 в 11:43 |
||
|
Texture bark_; Mingun 01.05.14 в 11:43 |
||
|
Texture leaves_; Mingun 01.05.14 в 11:43 |
||
|
Vector position_; Mingun 01.05.14 в 11:43 |
||
|
double height_; Mingun 01.05.14 в 11:43 |
||
|
double thickness_; Mingun 01.05.14 в 11:43 |
||
|
Color barkTint_; Mingun 01.05.14 в 11:43 |
||
|
Color leafTint_; Mingun 01.05.14 в 11:43 |
||
|
}; Mingun 01.05.14 в 11:43 |
||
|
Это довольно много данных, особенно велики сетка и текстуры. Mingun 01.05.14 в 11:44 Тут много данных, особенно для сетки и текстур. IngaJolly 08.05.14 в 16:52 |
||
|
Целый лес из таких объектов будет слишком тяжёлым, чтобы просто отправить его на видеокарту в одном кадре. Mingun 01.05.14 в 11:45 Целый лес объектов - это слишком много, чтобы передать видеокарте за один кадр. IngaJolly 08.05.14 в 16:54 Загрузить видеокарту целым лесом этих объектов в одном кадре - это слишком. Deo 22.08.14 в 14:12 |
||
|
К счастью, есть проверенный временем приём для обработки такой ситуации. Mingun 01.05.14 в 11:47 |
||
|
Ключевое наблюдение состоит в том, что хотя в лесу могут быть тысячи деревьев, в основном они все выглядят одинаково. Mingun 01.05.14 в 11:48 Ключевое наблюдение состоит в том, что хотя в лесу могут быть тысячи деревьев, в основном они все выглядят одинаково. IngaJolly 08.05.14 в 16:55 |
||
|
Скорее всего они все используют одну сетку и текстуры. Mingun 01.05.14 в 11:48 Скорее всего, все они используют одну и ту же сетку и текстуры. IngaJolly 08.05.14 в 16:55 |
||
|
Это означает, что большинство полей в этих объектах одни и те же для всех экземпляров. Mingun 01.05.14 в 11:49 А значит большинство полей будут общими для всех экземпляров этих объектов. Deo 22.08.14 в 14:14 Это значит, что большинство полей в объектах будут одинаковы во всех экземплярах. IngaJolly 24.08.14 в 18:11 |
||
|
Вы должны быть сумасшедшим или иметь миллиардный бюджет для индивидуального моделирования каждого дерева в лесу. Mingun 01.05.14 в 11:53 Вы должны быть сумасшедшим или миллиардером с соответствующим бюджетом для художников, чтобы индивидуально моделировать каждое дерево в целом лесу. IngaJolly 08.05.14 в 16:57 Нужно быть чокнутым или миллиардером, чтобы спонсировать художникам моделирование каждого отдельного дерева в лесу. Deo 22.08.14 в 14:16 |
||
|
Обратите внимание, что материал в маленьких прямоугольниках один и тот же для каждого дерева. Mingun 01.05.14 в 11:54 Обратите внимание, что написанное в маленьких прямоугольниках одинаково для каждого дерева. IngaJolly 08.05.14 в 17:00 |
||
|
Мы можем смоделировать это явно разделив объект на две части. Mingun 01.05.14 в 11:56 Мы можем смоделировать это явно, разбив объект наполовину. IngaJolly 08.05.14 в 17:01 |
||
|
Сперва мы вытащим все общие для деревьев данные и переместим их в отдельный класс: Mingun 01.05.14 в 11:56 Сперва возьмем данные, общие для всех деревьев, и переместим их в отдельный класс: IngaJolly 24.08.14 в 18:13 |
||
|
class TreeModel Mingun 01.05.14 в 11:56 |
||
|
{ Mingun 01.05.14 в 11:57 |
||
|
private: Mingun 01.05.14 в 11:57 |
||
|
Mesh mesh_; Mingun 01.05.14 в 11:57 |
||
|
Texture bark_; Mingun 01.05.14 в 11:57 |
||
|
Texture leaves_; Mingun 01.05.14 в 11:57 |
||
|
}; Mingun 01.05.14 в 11:57 |
||
|
Игре требуется только один экземпляр этих вещей, так что нет причин хранить одни и те же сетки и текстуры в памяти по тысяче раз. Mingun 01.05.14 в 11:58 Игре требуется только один из них, потому что нет причины помещать те же сетки и текстуры в память тысячу раз. IngaJolly 08.05.14 в 17:03 Игре необходим лишь один экземпляр каждого из этих полей, ведь нет причин держать тысячи одинаковых текстур и сеток в памяти. Deo 22.08.14 в 14:34 |
||
|
Далее, каждый экземпляр дерева в мире обзаведётся ссылкой на эту общую для всех модель TreeModel. Mingun 01.05.14 в 11:59 Затем каждый экземпляр дерева получает ссылку на общий класс TreeModel. IngaJolly 08.05.14 в 17:05 |
||
|
Что остаётся в классе Tree, так это состояние, которое индивидуально для каждого экземпляра: Mingun 01.05.14 в 12:00 Что остается в классе Tree - состояние, уникальное для каждого экземпляра: IngaJolly 24.08.14 в 18:16 |
||
|
class Tree Mingun 01.05.14 в 11:57 |
||
|
{ Mingun 01.05.14 в 11:57 |
