|
|
|||||
Регистрация: Jul 2008
Сообщений: 912
|
Глобальный Enter Frame
Как лучше реализовать ентерфрейм, чтоб была возможность добавлять функции в которых есть анимация. Сделал так, но мне кажется это медленно:
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; } } } |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Да вроде нормально. Именно перебор сильно не улучшить. Можно for .. in попробовать, можно сделать список вместо вектора (как бонус вставка/удаление быстрее), но до 1000 длины вектора нереально разницу увидеть. Можно написать функцию удаления - это даст повод подумать над Dictionary вместо или вместе с вектором.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
Регистрация: Jul 2008
Сообщений: 912
|
Печально. Но может есть какой-то другой подход добавления/удаления в анимацию, без создания таймеров или ентерфрейма каждому отдельному анимируемому объекту?
|
|
|||||
[+4 08.09.13]
Регистрация: May 2012
Сообщений: 131
|
каждую анимацию имплементить от интерфейса с function Tick():void;, например.
создание анимации проводить в какой-нибудь AnimationSystem, которая будет получать игровой Tick от игрового мира World, скажем. Собирать анимации в Vector.<Animation>(); |
|
|||||
Регистрация: Jul 2008
Сообщений: 912
|
А вот это всё каждый фрейм происходит?
|
|
|||||
Цитата:
А сам перебор (сравнение i <, инкремент i++, обращение к элементу массива) - ни как не больше времени и памяти жрёт чем непосредственный вызов всех функции Tick() Т.е. это не место для оптимизаций. Где место для оптимизаций? Это удаление функции могло бы быть, но у Вас просто нет такого метода Цитата:
|
|
|||||
Регистрация: Jul 2008
Сообщений: 912
|
Цитата:
Добавлено через 8 минут Интересно, что быстрей такой подход как Frost47rus написал где будут через интерфейс дёргаться методы или как у меня с передачей всего метода в ентерфрейм или это совсем не важно что так, что так? |
|
|||||
Регистрация: Jul 2008
Сообщений: 912
|
так, нужно будет сделать класс который измеряет скорость работы отдельных кусков кода(но это уже другая история), действительно for each ведь медленее while, но используя for each в данном случае стают не нужными private var _funcCount:int = 0; private var _oldFuncCount:int = 0; и все манипуляции с ними отпадают.
В общем-то почти всё что хотел - узнал, так как по любому прийдётся перебирать вектор с анимациями каждый кадр то моё решение удовлетворяет. |
|
|||||
Цитата:
если удаление функции происходит внутри другой или той же вызываемой функции (хотя предыдущий подход тоже не спасёт ситуацию) Цитата:
Тут народ пытался определить что же лучше (с переменным успехом): http://stackoverflow.com/questions/1...ce-in-as3-flex Цитата:
Пользуйтесь переменными. Вот пример без foreach, если религия не позволяет: var length:int = _myFuncVector.length; for (var i:int = 0; i < length; i++) { _myFuncVector[i](); } Последний раз редактировалось expl; 08.02.2013 в 21:24. |
Часовой пояс GMT +4, время: 13:01. |
|
« Предыдущая тема | Следующая тема » |
|
|