Показать сообщение отдельно
Старый 30.01.2017, 23:29
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 12  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
для неизвестного типа есть обобщенный тип *, без кастов передача ссылки, это будет лучше чем Object в данном случае
Код AS3:
	public final class ObjectPool
	{
		private var pool:Vector.<*>;
		private var counter:uint;
		private var className:Class;
 
		public function ObjectPool (className:Class, length:uint = 1)
		{
			this.className = className;
			pool = new Vector.<*>(length);
 
			var i:uint = counter = length;
			//создадим начальный набор объектов
			while (--i > -1)
			{
				pool[i] = new className();
			}
		}
 
		public function getObject ():*
		{
			if (counter > 0)
			{
				return pool[--counter];
			}
			// если объекты закончились
			// создаю объект и увеличивая длину массива
			pool.unshift(new className());
			return pool[0];
		}
 
		public function releaseObject (value:*):void
		{
			pool[counter++] = value;
		}
 
		// необязательный метод для тестирования
		public function toString ():String
		{
			return "Pool of " + className + " count = " + counter + "/" + pool.length;
		}
	}
Код AS3:
			var pool:ObjectPool = new ObjectPool(Point, 20);
			trace(pool);
			trace("---------");
			for (var i:int = 0, p:Point; i < 40; i++)
			{
				p = pool.getObject();
				p.x = Math.random() * 400;
				if (p.x > 300)
					pool.releaseObject(p);
				trace(pool.toString());
			}
странная реализация ObjectPool
1. зачем добавлять в начало когда можно добавлять в конец
2. проверки на in_use нету
3. зачем держать в списке используемые объекты, это имело бы смысл на языках с ручным управлением памяти
4. в списке могут оказаться две ссылки на один и тот же объект если делать releaseObject не в том порядке котором делался getObject

рекомендую использовать упрощенную прозрачную реализацию без всей этой шелухи
Код AS3:
var pool:Vector.<Point> = new Vector.<Point>();
 
var point:Point = pool.length > 0 ? pool.pop() : new Point(); //getObject
pool.push(point); //releaseObject
Код AS3:
			var pool:Vector.<Point> = new Vector.<Point>(20);
			for (var i:int = 0; i < pool.length; i++)
				pool[i] = new Point();
 
			trace("---------");
			for (var i:int = 0, p:Point; i < 40; i++)
			{
				p = pool.length > 0 ? pool.pop() : new Point();
				p.x = Math.random() * 400;
				if (p.x > 300)
					pool.push(p);
				trace("Pool " + pool.length);
			}
Добавлено через 31 минуту
Цитата:
Сообщение от caseyryan Посмотреть сообщение
"примитивные" типы (которых в as3 на самом деле нет) вроде Number или Boolean
Примитивные типы есть (как и в js, es) отличаются иммутабельным поведением и хранением на стеке без дополнительной аллокации памяти


Последний раз редактировалось Nooob; 31.01.2017 в 00:32.