Показать сообщение отдельно
Старый 20.01.2015, 23:06
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 3  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Если коротко:
Код AS3:
package package_cl{
	import flash.display.MovieClip;
 
	public class VectorPool_cl {
		// Вектор может динамически расширяться - не надо его пересоздавать под каждый размер
		private var vector:Vector.<MovieClip> = new Vector.<MovieClip>();
		public function VectorPool_cl() {
		}
		pulbic function fn_get():MovieClip{
			if (vector.length > 0) {
				// Фишка пула - это не создавать новый экземпляр,
				// если можно использовать ранее созданный
				return vector.pop();
			}
			// Не создавали раньше ничего - значит всё-таки надо создать
			return new MovieClip();
		}
		public function fn_push(movieClip:MovieClip):void{
			vector.push(movieClip);
		}
	}
}
Использование:
Код AS3:
public static var pool:VectorPool_cl = new VectorPool_cl();
...
a = pool.fn_get()
addChild(a);
...
removeChild(a)
// Вторая фишка пула - нужно _вручную_ туда добавлять ставшие ненужными объекты,
// иначе все время будет вызываться new MovieClip(); и от пула не будет никакого толку
pool.fn_push(a);
...
// И только здесь начинается выгода от использования пула,
// b присваивается то, что было в a, без создания MovieClip заново
b = pool.fn_get()
Но вы хотите универсальный пул. Тогда нужно как-то научиться создавать не просто MovieClip, а объект заранее заданного типа внутри пула

Решения:

1. Как в приведённой выше ссылке назначить пулу фабрику объектов
(вместо фабрики подойдет просто функция, создающуя объект, или просто класс объекта)

2. А нужна ли вам универсальность? Просто копипастим класс пула и меняем MovieClip на нужный тип.
Что? Копипаста не всегда является злом:

- С одной стороны - это дублирование двух функций.
Но с другой - это строгая типизация и не надо громоздить фабрик.
Плюс в этих функцях мало что дублируется - там if один всего

- Вы особо и не накопипастите - не будет у вас много пулов.
Вы будете заводить пул только когда:
а) Объекты часто создаются и часто "уничтожаются" (перестают использоваться)
б) Создание экземпляров этих объектов является узким местом в приложении
с) Вы можете сказать, когда объект стал ненужным, т.е. знаете в каком месте написать:
Код AS3:
pool.fn_push(object);