Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 31.10.2013, 16:08
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 11  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Я сделал тест - подписал сто тысяч объектов, каждый на свой ентерФрейм, результат - 5 fps. А когда в цикле пробегал по этим ста тысячам - 16 fps.
Возможно я не правильно понял, так что переспрошу - отдельные enterFrame быстрее в три раза?
Цитата:
И как их можно сделать доступными для сборщика мусора, после удаления?
Так как они создаются у Вас локально и единственное, что их удерживает, это DOC, то после удаления из него, они будут доступны для GC.
Цитата:
А если я в самом классе CircleAnimation напишу, что бы он удалялся из родительского объекта после воспроизведения, будет лучше?
Лучше, чтобы родитель удалял детей, а не дети самопроизвольно руководили родителем.

Старый 31.10.2013, 16:14
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 12  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Цитата:
Сообщение от Akopalipsis Посмотреть сообщение
Возможно я не правильно понял, так что переспрошу - отдельные enterFrame быстрее в три раза?
Один ентерФрейм, с тысячей методов выполниться быстрее, чем тысяча ентерФреймов.

Старый 31.10.2013, 16:16
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 13  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
samana Спасибо!

Старый 31.10.2013, 16:34
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 14  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
Сообщение от Akopalipsis Посмотреть сообщение
Тогда такой вопрос - подписывая circle на ENTER_FRAME, мы передаём listener в EventDispatcher, где он помещается в массив и при каждом тике, вызываются все listeners из массива. Если сделать отдельный класс для ENTER_FRAME, то в моём понимании, это будет выглядеть так - создали экземпляр и чтобы подписаться на его тики, мы передаем в него ссылку на класс с методом, который должен вызываться каждый тик. Передав ссылку в класс ENTER_FRAME, она помещается в массив и каждый тик, этот массив перебирается циклом и вызывает нужный метод. Получается тоже самое.
По этому мне кажется, что я не понимаю, как сделать один класс с ENTER_FRAME. Где я ошибаюсь?
Событие Event.ENTER_FRAME создается FlashPlayer'ом для каждого подписчика. то есть как это работает:
- FP берет список подписчиков
- для каждого подписчика создается НОВЫЙ объект класса Event
- каждому подписчику отдается его собственный экземпляр класса Event

Если же мы сделаем так:
Код AS3:
package {
 
	import flash.display.Shape;
	import flash.errors.IllegalOperationError;
 
 
    /**
	 * Глобальный диспатчер события flash.events.Event.ENTER_FRAME
	 * 
	 * @author gloomyBrain
	 */
	public final class EnterFrameBroadcaster extends Shape {
 
		private static var _instance:EnterFrameBroadcaster;
 
		/**
		 * Экземпляр синглтона
		 */
		public static function get instance():EnterFrameBroadcaster {
 
			if (!EnterFrameBroadcaster._instance) EnterFrameBroadcaster._instance = new EnterFrameBroadcaster();
			return _instance;
 
		}
 
		/**
		 * Для получения экземпляра используется статический акцессор EnterFrameBroadcaster.instance!
		 */
		public function EnterFrameBroadcaster() {
 
			super();
 
			if (EnterFrameBroadcaster._instance) throw new IllegalOperationError("Для получения экземпляра используется статический акцессор instance!");
 
		}
 
	}
 
}
и будем подписываться на событие Event.ENTER_FRAME от объекта EnterFrameBroadcaster.instance, то для всех подписчиков будет создаваться только один экземпляр класса Event. Таким образом можно сэкономить на созднаии объектов событий, что при большом количестве слушателей может быть актуально.
__________________
...вселенская грусть

Старый 31.10.2013, 16:40
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 15  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
gloomyBrain Спасибо! Вот когда я читал форум раньше, то сложилось впечатление, что синглетон - это ВООБЩЕ не нужный паттерн. А вот чем больше я углубляюсь в архитектуру,
тем больше понимаю его полезность. И не важно, как его реализовать, главное, что это будет всегда один и тот же экземпляр.

Старый 31.10.2013, 16:59
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 16  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Ну на самом деле тут синглтон необязателен, все можно сделать через статические методы подписки/отписки.
Я вообще не знаю, где синглтон обязателен или хотя бы чуть более полезен чем какой-то другой вариант статического доступа =)
__________________
...вселенская грусть

Старый 31.10.2013, 19:26
LIGHTHILL вне форума Посмотреть профиль Отправить личное сообщение для LIGHTHILL Найти все сообщения от LIGHTHILL
  № 17  
Ответить с цитированием
LIGHTHILL

Регистрация: Oct 2013
Сообщений: 5
Такой вариант лучше? Здесь, как я понимаю ENTER_FRAME только один.
Единственное для упрощения, на каждом новом кадре я проверяю только самый первый объект из массива, а не перебираю весь массив, т.к. вряд ли кто-то сможет дважды кликнуть мышкой за один кадр, при 60fps.
Является ли такое упрощение нормальным при разработке полноценного приложения?
Код AS3:
package 
{
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	public class Main extends MovieClip 
	{
		private var circle: Array = new Array();;
		private var new_circle: CircleAnimation;
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			stage.addEventListener(MouseEvent.CLICK, onClick);
			addEventListener(Event.ENTER_FRAME, onEnter);
		}
 
		private function onClick(e:MouseEvent): void
		{
			new_circle = new CircleAnimation();
			circle.push(new_circle);
			addChild(circle[circle.length - 1]);
			circle[circle.length - 1].x = mouseX;
			circle[circle.length - 1].y = mouseY;
		}
 
		private function onEnter(e:Event): void
		{
			if (circle[0] != null)												// проверка, есть ли ещё объекты в массиве
			{
				if (circle[0].currentFrame == circle[0].totalFrames)
				{
					removeChild(circle[0]);
					circle.splice(0, 1);										// удаление из массива самого "старого" объекта из массива, который полностью воспроизвёлся
				}
			}
		} 
 
 
	}
 
}
И ещё вопрос: есть ли какая-нибудь функция для определения того, что MovieClip полностью воспроизвёлся, что бы не сравнивать текущий кадр с количеством кадров.
А ещё лучше ивент, срабатывающий при достижении последнего кадра.


Последний раз редактировалось LIGHTHILL; 31.10.2013 в 19:41.
Создать новую тему Ответ Часовой пояс GMT +4, время: 07:16.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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