|
|
|||||
Регистрация: Jul 2008
Сообщений: 912
|
ну как же? Тут бесконечно будут создаваться переменные итераторы 60 раз в секунду
for each (var fun:Function in _myFuncVector)//var fun:Function for (var i:int = 0; i < length; i++)//var i:int Цитата:
|
|
|||||
Может так попробовать?
package resources{ import flash.events.Event; /** * ... * @author Sintesis */ public class MyTween{ private var _myFuncDictionary:Dictionary; public function MyTween(){ _myFuncDictionary = new Dictionary(); } ..... public function setFunc(func:Function):void { if(!_myFuncDictionary[func]) _myFuncDictionary[func] = true; } public function removeFunc(func:Function):void { var f:Function = _myFuncDictionary[func]; if(f) delete f; } private function timerListener(event:Event):void { var f:Function = _myFuncDictionary[func] if(f) f(); } } } |
|
|||||
Lorem ipsum
|
В свое время мне показался более простым и очевидным другой вариант. Класс таймера наследовался от EventDispatcher. Он так же имел методы start(), stop(), reset(). Сам таймер был 2-в-1: он посылал как ENTER_FRAME в каждом кадре, так и TIMER каждую секунду (ну мне секунды было достаточно). При этом таймер корректно отрабатывал незавершенную секунду при последовательном вызове методов stop() и start().
Все, кто заинтересован в кадрах или секундах, просто получали ссылку на этот глобальный таймер и вешали на него слушатель. А уже по месту решалось, что делать в обработчике, который, к примеру, уже таки мог пробежаться по сотне объектов и передвинуть их. Ну т.е. антиглобалистский такой подход =)
__________________
Поймай яблоко 2! |
|
|||||
Цитата:
4 байта, на стеке, будет создаваться 60 раз в секунду. Какой ужас! При чем место на стеке и при взятии значения поля(не переменной), если не ошибаюсь, тоже выделяется. Завязывайте с придумыванием себе проблем. Об этих 4-х байтах даже GC не знает - они автоматом после отработки функции сносятся. Или, по-крайней мере, прочитайте доки по работе виртуальной машины, структуре байткода, посмотрите во что компилируется тот или иной код, а уже потом придумывайте себе что и когда будет тормозить. Вот что может создать проблемы, т.к. память выделяется на куче, с последующей сборкой GC и прочими прелестями (но не в вашем случае - 60 раз в секунду выделить память под Point - это фигня на постном масле): но не это: и не это: Цитата:
for each (f in _myFuncVector) { f() // а внутри f вызывается removeFunc(...), // а внутри removeFunc вызывается _myFuncVector.splice(i, 1); // а мы, вообще-то идем по этому _myFuncVector } Кстати, тут и с добавлением функции внутри функции те же проблемы будут. Это типичная проблема для всяких самописных Signal-ов и EventDispatcher-ов (в стандартном, вроде, решена) Если Вы уверены - что внутри слушателя не будете никого подписывать/отписывать - можете забить. Последний раз редактировалось expl; 09.02.2013 в 15:39. |
Часовой пояс GMT +4, время: 07:08. |
|
« Предыдущая тема | Следующая тема » |
|
|