Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   [Паттерны] Объектный пул. (http://www.flasher.ru/forum/showthread.php?t=211623)

ZackMercury 03.10.2015 14:46

Объектный пул.
 
Как я себе представляю, что такое пул.
Пул - это массив объектов, которые заранее инициализируются, и если неизвестно, сколько из них может понадобиться, при нехватке инициализируются ещё.
Объекты в пуле хранятся для отсутствия необходимости в создании новых объектов на лету в работе программы.
Это позволяет экономить производительность за счёт заранее забронированной памяти.
Как правило, свойства объекта сбрасываются на свойства по умолчанию, при условии, что затем нужны свойства по-умолчанию, и не сбрасываются, если в последствии они устанавливаются в нужные.

Почему я создал тему:
Возник спор, который заключается в следующем:
Есть массив неких объектов с данными, которые хранят местоположения объектов на карте, и ещё некоторую информацию об объектах(1 объект в массиве представляет 1 объект на карте).
Тот, кто работает над проектом называет это "объектный пул", при этом вытаскивая не первый попавшийся объект, а ищет объект с нужными координатами, чтобы получить его другие значения.

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

//Объясните же мне, почему я неправ и что же на самом деле пул.

Zebestov 03.10.2015 14:53

Это не пул.

И да, пул (в моем понимании) не столько (не только?) резервирует память, сколько экономит время на выполнение конструктора, т.е. на создание объекта, и, как следствие, время, которое GC откусит на уборку уже отработанных объектов.

caseyryan 03.10.2015 15:03

Цитата:

Тот, кто работает над проектом называет это "объектный пул", при этом вытаскивая не первый попавшийся объект, а ищет объект с нужными координатами, чтобы получить его другие значения.
Этот "тот кто работает над проектом" я. Он мне уже весь мозг взорвал пытаясь доказать, что у меня не пул объектов а просто массив или что-то в этом роде.
Суть такая: есть класс ObstaclePool с набором статических методов. При запуске локации туда передается XML инструкция для создания объектов, которая сгенерирована редактором локаций. Этот пул создает необходимые объекты. Но не просто так в том количестве, в котором они прописаны в XML, а с максимальной экономией памяти. То есть если 2 объекта одного типа не могут одновременно быть отображены на экране, то и нет смысла создавать два объекта. Будет исползоваться один и тот же, просто его значения будут меняться в соответствии с теми значениями, которые заданы для его координат. Все эти настройки координат хранятся в спецаильной обертке ObjectWrapper
Код AS3:

internal class ObstacleWrapper {
 
 
        public var obstacle:        Obstacle        = null;
        public var isDestroyed:        Boolean                = false;
        public var posX:                int                        = 0;
        public var posY:                int                        = 0;
        public var health:                int                        = 0;
 
        public function ObstacleWrapper() {
 
        }
}

И в пулл помещаются эти обертки, с созданными объектами. Дополнительно у этого класса-пула есть методы для удобного поиска объекта, который нужно добавить на указанные координаты (переместился экран так, что объект скрылся, удаляем его из дисплей листа, вернулся - снова добавляем). Но суть всего этого класса заключается в том, чтобы не создавать все эти обертки и объекты заново при рестарте локации (при проигрыше или по требованию игрока), а просто ресетнуть значения у тех, что уже были созданы и хранятся в пуле

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

udaaff 03.10.2015 15:03

https://ru.wikipedia.org/wiki/%D0%9E...BF%D1%83%D0%BB
Гугл пестрит определениями того, что есть объектный пул.

caseyryan 03.10.2015 15:07

Цитата:

Сообщение от udaaff (Сообщение 1187613)
https://ru.wikipedia.org/wiki/%D0%9E...BF%D1%83%D0%BB
Гугл пестрит определениями того, что есть объектный пул.

Я ему это уже скидывал)

ZackMercury 03.10.2015 15:13

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

udaaff 03.10.2015 15:14

caseyryan, почему ты считаешь, что это именно объектный пул, а не объектный массив?

Zebestov 03.10.2015 15:14

Ну тогда у тебя целый завод, а не пул :) там у тебя все, и пул в том числе.

caseyryan 03.10.2015 15:17

Цитата:

caseyryan, почему ты считаешь, что это именно объектный пул, а не объектный массив?
Это игра слов "объектный пул", "объектный массив", можно назвать "объектный набор" или "коллекция объектов".
Главное что определению пула это соответствует. Объекты создаются один раз при запуске, а потом используются во всем процессе игры одни и те же
Цитата:

Ну тогда у тебя целый завод, а не пул там у тебя все, и пул в том числе.
Да! Ты здесь первый кто это сразу просек. Как я уже написал, там для удобства добавлены методы поиска объекта.
Но основная задача - все-таки пул

udaaff 03.10.2015 15:19

Цитата:

Сообщение от Zebestov (Сообщение 1187618)
Ну тогда у тебя целый завод, а не пул :) там у тебя все, и пул в том числе.

Больше напоминает объектную клоаку :)
Цитата:

Если объекты после возвращения в пул оказываются в неправильном или неопределённом состоянии, такая конструкция называется объектной клоакой

Zebestov 03.10.2015 15:20

Пул (бассейн) — это по сути массив молекул воды, только без доступа по индексу, так что да :)

caseyryan 03.10.2015 15:21

Цитата:

Сообщение от udaaff (Сообщение 1187621)
Больше напоминает объектну ю клоаку :)

Не не, ты опустил гланое
Цитата:

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

ZackMercury 03.10.2015 15:22

Цитата:

Это игра слов "объектный пул", "объектный массив", можно назвать "объектный набор" или "коллекция объектов".
Объектный пул - это шаблон проектирования, который не равен объектному массиву, это разные вещи.

caseyryan 03.10.2015 15:24

Цитата:

Сообщение от ZackMercury (Сообщение 1187624)
Объектный пул - это шаблон проектирования, который не равен объектному массиву, это разные вещи.

Любой пул содержит в себе массив

Zebestov 03.10.2015 15:24

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

caseyryan 03.10.2015 15:26

Что-то мне подсказывает, что этот спор ничем не увенчается. Не важно какие есть примеры в интернете. Примеры на то и примеры, чтобы показывать общую суть. А реализаций может быть очень много. Я одних синглтонов встречал штук 7 или 10 разных реализаций. А суть все равно у всех одна - возвращать ссылку на один и тот же созданный заранее экземпляр. И пул обязан делать по шаблону, который где-то там кем-то написан. Главное что общая идея его такая же. А какие я вспомогательные функции добавил и с какой целью - это уже не имеет значения.

ZackMercury 03.10.2015 15:27

Цитата:

Кто сказал, что у caseyryan объект после возвращения в пул
Я даже уверен, что из "пула" ничего не удаляется и ничего туда не засовывается в процессе работы программы.
Цитата:

Любой пул содержит в себе массив
Где коммутативность? Любой массив не является пулом.

Zebestov 03.10.2015 15:27

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

caseyryan 03.10.2015 15:29

Цитата:

и простенький пул для примитивного дайсюда/положиназад.
Там по сути так и есть. Дай сюда - забери обратно. Только с дополнениями. Потому что я не вижу смысла городить еще отдельный класс для выполнения попутных задач в этом месте

Zebestov 03.10.2015 15:29

Цитата:

Сообщение от ZackMercury (Сообщение 1187628)
Я даже уверен, что из "пула" ничего не удаляется и ничего туда не засовывается в процессе работы программы.

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

caseyryan 03.10.2015 15:31

Цитата:

Я даже уверен, что из "пула" ничего не удаляется и ничего туда не засовывается в процессе работы программы.
Нет, потмоу что это ресурсоемкая операция. Если ты читал как работают динамические массивы то поймешь о чем я. Вместо удаления там есть флаг типа "занято / не занято"

Zebestov 03.10.2015 15:34

Никогда не заморачивался с пулами.
Код AS3:

private var _bulletsPool:Array = [];
...
private function getBullet():Bullet { return (this._bulletsPool.length) ? this._bulletsPool.pop() : new Bullet(); }
private function putBullet(bullet:Bullet):void { this._bulletsPool[this._bulletsPool.length] = bullet; }

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

caseyryan 03.10.2015 15:38

Цитата:

Никогда не испытывал необходимости городить пул "на все случаи жизни".
Я тоже)
А вот здесь встала необъодимость придумать такую систему. Потому что художник делает огромные локации с больишм количеством объектов. Его аргумент - если делать мало всего и все время подстраиваться под производительность устройства, то игра будет неинтересной и скучной. И он прав. Поэтому пришлось приудмать способ расставлять столько объектов, сколько он хочет, с минимальной нагрузкой на память и процессор. Игра все-таки мобильная

udaaff 03.10.2015 15:41

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

caseyryan 03.10.2015 15:45

Долой шаблонное мышление! Да здравствуют концепты! :D

ZackMercury 03.10.2015 15:45

Цитата:

Но основная задача - все-таки пул
Как раз "основная функция" конструкции, которая вышла у caseyryan не пул, а карта объектов. А как пул он работает только между уровнями.

udaaff 03.10.2015 15:45

Цитата:

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

Zebestov 03.10.2015 15:47

Мсье знает толк! :)

caseyryan 03.10.2015 16:00

Цитата:

Сообщение от ZackMercury (Сообщение 1187640)
Как раз "основная функция" конструкции, которая вышла у caseyryan не пул, а карта объектов. А как пул он работает только между уровнями.

Я давно заметил у тебя черту, рассуждать о том, чего ты не знаешь) Между уровнями у меня вообще ничего такого не используется, потому что это там совершенно не нужно

ZackMercury 03.10.2015 16:11

Сорян, я имел в виду это
Цитата:

Но суть всего этого класса заключается в том, чтобы не создавать все эти обертки и объекты заново при рестарте локации (при проигрыше или по требованию игрока), а просто ресетнуть значения у тех, что уже были созданы и хранятся в пуле


Часовой пояс GMT +4, время: 01:48.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.