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

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

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

Регистрация: Jul 2008
Сообщений: 912
ну как же? Тут бесконечно будут создаваться переменные итераторы 60 раз в секунду
Код AS3:
for each (var fun:Function in _myFuncVector)//var fun:Function
for (var i:int = 0; i < length; i++)//var i:int
Добавлено через 6 минут
Цитата:
Сообщение от expl Посмотреть сообщение
Тогда с предложенным мной нативным foreach можно огрести,
если удаление функции происходит внутри другой или той же вызываемой функции (хотя предыдущий подход тоже не спасёт ситуацию)
А что тут отгребать? Просто убираем функцию из вектора
Код AS3:
public function removeFunc(func:Function):void {
			var i:int = _myFuncVector.length;
			while (i--) {
				if (_myFuncVector[i] == func) {
					_myFuncVector.splice(i, 1);
				}
			}
		}

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

Регистрация: Apr 2001
Адрес: Berlin
Сообщений: 1,862
Отправить сообщение для derhab с помощью ICQ Отправить сообщение для derhab с помощью Skype™
Может так попробовать?

Код AS3:
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();
		}
	}
}
__________________
freelance | Раздор

Старый 09.02.2013, 03:58
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 13  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
В свое время мне показался более простым и очевидным другой вариант. Класс таймера наследовался от EventDispatcher. Он так же имел методы start(), stop(), reset(). Сам таймер был 2-в-1: он посылал как ENTER_FRAME в каждом кадре, так и TIMER каждую секунду (ну мне секунды было достаточно). При этом таймер корректно отрабатывал незавершенную секунду при последовательном вызове методов stop() и start().
Все, кто заинтересован в кадрах или секундах, просто получали ссылку на этот глобальный таймер и вешали на него слушатель. А уже по месту решалось, что делать в обработчике, который, к примеру, уже таки мог пробежаться по сотне объектов и передвинуть их.
Ну т.е. антиглобалистский такой подход =)
__________________
Поймай яблоко 2!

Старый 09.02.2013, 15:20
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 14  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
ну как же? Тут бесконечно будут создаваться переменные итераторы 60 раз в секунду
Вы вызвали двойной фейспалм у меня >_<.
4 байта, на стеке, будет создаваться 60 раз в секунду. Какой ужас!
При чем место на стеке и при взятии значения поля(не переменной), если не ошибаюсь, тоже выделяется.
Завязывайте с придумыванием себе проблем. Об этих 4-х байтах даже GC не знает - они автоматом после отработки функции сносятся.

Или, по-крайней мере, прочитайте доки по работе виртуальной машины, структуре байткода, посмотрите во что компилируется тот или иной код,
а уже потом придумывайте себе что и когда будет тормозить.

Вот что может создать проблемы, т.к. память выделяется на куче, с последующей сборкой GC и прочими прелестями (но не в вашем случае - 60 раз в секунду выделить память под Point - это фигня на постном масле):
Код AS3:
var point:Point = new Point(x, y);
но не это:
Код AS3:
var point:Point = _anotherPoint;
и не это:
Код AS3:
var n:int = 100;

Цитата:
А что тут отгребать? Просто убираем функцию из вектора
Код AS3:
for each (f in _myFuncVector)
{
    f()
    // а внутри f вызывается removeFunc(...),
    // а внутри removeFunc вызывается _myFuncVector.splice(i, 1);
    // а мы, вообще-то идем по этому _myFuncVector
}
Самое тупое решение - скопировать список перед итерацией и итерировать по копии
Кстати, тут и с добавлением функции внутри функции те же проблемы будут.
Это типичная проблема для всяких самописных Signal-ов и EventDispatcher-ов (в стандартном, вроде, решена)
Если Вы уверены - что внутри слушателя не будете никого подписывать/отписывать - можете забить.


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

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

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


 


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


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