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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.02.2013, 02:19
Sintesis вне форума Посмотреть профиль Отправить личное сообщение для Sintesis Найти все сообщения от Sintesis
  № 1  
Ответить с цитированием
Sintesis
 
Аватар для Sintesis

Регистрация: Jul 2008
Сообщений: 912
По умолчанию Глобальный Enter Frame

Как лучше реализовать ентерфрейм, чтоб была возможность добавлять функции в которых есть анимация. Сделал так, но мне кажется это медленно:
Код AS3:
package resources{
	import flash.events.Event;
 
	/**
	 * ...
	 * @author Sintesis
	 */
	public class MyTween{
 
		private var _myFuncVector:Vector.<Function>;
		private var _funcCount:int = 0;
		private var _oldFuncCount:int = 0;
 
		public function MyTween(){
			_myFuncVector = new Vector.<Function>;
		}
 
		public function startTimer():void {
			Dispatcher._stage.addEventListener(Event.ENTER_FRAME, timerListener);
		}
 
		public function stopTimer():void {
			Dispatcher._stage.removeEventListener(Event.ENTER_FRAME, timerListener);
		}
 
		public function setFunc(func:Function):void {
			_myFuncVector.push(func);
			_funcCount = _myFuncVector.length;
		    _oldFuncCount = _myFuncVector.length;
		}
 
		private function timerListener(event:Event):void {
//не нравится, что каждый кадр перебираю вектор _myFuncVector
			while (_funcCount--) {
				_myFuncVector[_funcCount]();
			}
			_funcCount = _oldFuncCount;
		}
	}
}
может есть лучшие решения?

Старый 08.02.2013, 02:26
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 2  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Да вроде нормально. Именно перебор сильно не улучшить. Можно for .. in попробовать, можно сделать список вместо вектора (как бонус вставка/удаление быстрее), но до 1000 длины вектора нереально разницу увидеть. Можно написать функцию удаления - это даст повод подумать над Dictionary вместо или вместе с вектором.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 08.02.2013, 02:35
Sintesis вне форума Посмотреть профиль Отправить личное сообщение для Sintesis Найти все сообщения от Sintesis
  № 3  
Ответить с цитированием
Sintesis
 
Аватар для Sintesis

Регистрация: Jul 2008
Сообщений: 912
Цитата:
Сообщение от -De- Посмотреть сообщение
Именно перебор сильно не улучшить.
Печально. Но может есть какой-то другой подход добавления/удаления в анимацию, без создания таймеров или ентерфрейма каждому отдельному анимируемому объекту?

Старый 08.02.2013, 12:02
Frost47rus вне форума Посмотреть профиль Отправить личное сообщение для Frost47rus Найти все сообщения от Frost47rus
  № 4  
Ответить с цитированием
Frost47rus
[+4 08.09.13]

Регистрация: May 2012
Сообщений: 131
каждую анимацию имплементить от интерфейса с function Tick():void;, например.
создание анимации проводить в какой-нибудь AnimationSystem, которая будет получать игровой Tick от игрового мира World, скажем. Собирать анимации в Vector.<Animation>();
Код AS3:
public function Tick(dt:Number):void{
 var i:int;
 for (i=0; i< animations.length; i++){
   animations[i].Tick();
 }
}

Старый 08.02.2013, 17:33
Sintesis вне форума Посмотреть профиль Отправить личное сообщение для Sintesis Найти все сообщения от Sintesis
  № 5  
Ответить с цитированием
Sintesis
 
Аватар для Sintesis

Регистрация: Jul 2008
Сообщений: 912
А вот это всё каждый фрейм происходит?
Код AS3:
public function Tick(dt:Number):void{
 var i:int;
 for (i=0; i< animations.length; i++){
   animations[i].Tick();
 }
}

Старый 08.02.2013, 17:49
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 6  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
//не нравится, что каждый кадр перебираю вектор _myFuncVector
Вы в каждом кадре должны вызвать все функции (так же?)
А сам перебор (сравнение i <, инкремент i++, обращение к элементу массива) - ни как не больше времени и памяти жрёт чем непосредственный вызов всех функции Tick()
Т.е. это не место для оптимизаций.

Где место для оптимизаций? Это удаление функции могло бы быть, но у Вас просто нет такого метода

Цитата:
while (_funcCount--) {
_myFuncVector[_funcCount]();
}
_funcCount = _oldFuncCount;
Зачем так сложно? _Если_ не предпологается удаление функций, то не нужно поля использовать (да и если бы предполагалось - можно было бы переменными обойтись):
Код AS3:
for each (var fun:Function in _myFuncVector)
{
    fun();
}

Старый 08.02.2013, 18:45
Sintesis вне форума Посмотреть профиль Отправить личное сообщение для Sintesis Найти все сообщения от Sintesis
  № 7  
Ответить с цитированием
Sintesis
 
Аватар для Sintesis

Регистрация: Jul 2008
Сообщений: 912
Цитата:
Сообщение от expl Посмотреть сообщение
Вы в каждом кадре должны вызвать все функции (так же?)

Зачем так сложно?
Код AS3:
for each (var fun:Function in _myFuncVector)
{
    fun();
}
Да! Спасибо expl, совсем забыл про for each так красивей). Удаление функций тоже есть, просто не писал сюда, оно нормально работает. Думал, может, связанные списки делать, но оказывается это не такой уж и напряг когда цикл в энтерфрейме постоянно перебирает вектор с функциями.

Добавлено через 8 минут
Интересно, что быстрей такой подход как Frost47rus написал где будут через интерфейс дёргаться методы или как у меня с передачей всего метода в ентерфрейм или это совсем не важно что так, что так?

Старый 08.02.2013, 19:07
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 8  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
Разве for..in не намного медленней, чем другие циклы?
__________________
мой пустой блог

Старый 08.02.2013, 19:52
Sintesis вне форума Посмотреть профиль Отправить личное сообщение для Sintesis Найти все сообщения от Sintesis
  № 9  
Ответить с цитированием
Sintesis
 
Аватар для Sintesis

Регистрация: Jul 2008
Сообщений: 912
так, нужно будет сделать класс который измеряет скорость работы отдельных кусков кода(но это уже другая история), действительно for each ведь медленее while, но используя for each в данном случае стают не нужными private var _funcCount:int = 0; private var _oldFuncCount:int = 0; и все манипуляции с ними отпадают.
В общем-то почти всё что хотел - узнал, так как по любому прийдётся перебирать вектор с анимациями каждый кадр то моё решение удовлетворяет.

Старый 08.02.2013, 21:11
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 10  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Удаление функций тоже есть, просто не писал сюда, оно нормально работает
Тогда с предложенным мной наивным foreach можно огрести,
если удаление функции происходит внутри другой или той же вызываемой функции (хотя предыдущий подход тоже не спасёт ситуацию)

Цитата:
действительно for each ведь медленее while
Глупости, смотря для чего и как
Тут народ пытался определить что же лучше (с переменным успехом): http://stackoverflow.com/questions/1...ce-in-as3-flex
Цитата:
for each в данном случае стают не нужными private var _funcCount:int = 0; private var _oldFuncCount:int = 0;
Да зачем вообще здесь поля эти использовать, да ещё 2 штуки.
Пользуйтесь переменными.

Вот пример без foreach, если религия не позволяет:
Код AS3:
var length:int = _myFuncVector.length;
for (var i:int = 0; i < length; i++)
{
    _myFuncVector[i]();
}
Или так (если коллеги за читабельность по рукам не надают и можно в обратном порядке функции выполнять):
Код AS3:
for (var i:int = _myFuncVector.length; i-- > 0;)
{
    _myFuncVector[i]();
}


Последний раз редактировалось expl; 08.02.2013 в 21:24.
Создать новую тему Ответ Часовой пояс GMT +4, время: 02:13.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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