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

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

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

Регистрация: Sep 2002
Сообщений: 30,787
DarkLight, ты не путаешь глубину рекурсии с настройками таймаута в CS4?

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

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
aksios, программу создаю, там реализовать рекурсией гораздо проще, чем циклами (как по мне, может и ошибаюсь). И вообще чем так плоха рекурсия?
Вот к примеру. Мне нужно обработать переменную в цикле относительно нескольких величин, т.е. по логике я должен создать цикл в цикле (а то и несколько ступеней вложенности) - флеш при этом однозначно повесится (возможно не на долго, но факт перегрузки есть), а в случае с использованием рекурсии все это решается более спокойно (хотя по времени может и дольше, но без подвисания компа). Вот и возникает вопрос: когда лучше рекурсия, а когда цикл?
Кстати, в моем примере достаточно сложная система обработки переменных, поэтому выбрал рекурсию (хотя наверное можно было бы попробовать и циклом).
Кстати о ресурсах - я частично уже написал, а если говорить о вышеуказанном коде, так там хоть 5000 итераций - субъективно будет практически без задержек.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 29.06.2009, 20:38
DarkLight вне форума Посмотреть профиль Отправить личное сообщение для DarkLight Посетить домашнюю страницу DarkLight Найти все сообщения от DarkLight
  № 13  
Ответить с цитированием
DarkLight
ветеран форума
 
Аватар для DarkLight

Регистрация: May 2006
Адрес: Москва
Сообщений: 2,978
Отправить сообщение для DarkLight с помощью ICQ Отправить сообщение для DarkLight с помощью Skype™
Цитата:
DarkLight, ты не путаешь глубину рекурсии с настройками таймаута в CS4?
хм, ну может быть, я давно не пользуюсь CS4, но в настройках, насколько помню, видел и то и другое. Возможно, привиделось)
__________________
4am is time to rock

Старый 29.06.2009, 21:32
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 14  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,600
Записей в блоге: 17
Лучше тогда, когда это красивее выглядит, и более важно - быстрее бегает.
Кстати, а почему при рекурсии компьютер повеситься, а при циклах будет бегать быстрее?
Цитата:
а в случае с использованием рекурсии все это решается более спокойно (хотя по времени может и дольше, но без подвисания компа).
С чего это? Абсолютно одинаково.
Хотя, циклы пожалуй выйграют, ибо область поиска переменных у них будет более ближняя (они будут локальны) и будут быстрее обращаться, чем к функции, которая не локальна. Хотя, можно сделать на неё ссылку, но не факт, что поможет. Надо на досуге проверить)

Старый 29.06.2009, 22:22
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 15  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
Psycho Tiger и уважаемая публика...
Предлагаю 2 варианта кода, по сути делающих одно и то же: вывод мувика из библиотеки на основную сцену. В библиотеке мувик (просто квадрат) с Linkage "quad".
Код с применением цикла:
Код AS1/AS2:
Stage.align = "TL";
Stage.scaleMode = "noscale";
for (v=0; v<100; v++) {
	for (h=0; h<100; h++) {
		this.attachMovie("quad","quad_v"+v+"h"+h,this.getNextHighestDepth());
		this["quad_v"+v+"h"+h]._x = this["quad_v"+v+"h"+h]._width*v;
		this["quad_v"+v+"h"+h]._y = this["quad_v"+v+"h"+h]._height*h;
	}
}
Действительно работает быстрее, но на какое-то время полностью вырубает машину (может только мою =) )
Код с применением рекурсии (и задержки для обхода лимита ее глубину)
Код AS1/AS2:
Stage.align = "TL";
Stage.scaleMode = "noscale";
foo(0,0,this);
function foo(v, h, targ) {
	targ.attachMovie("quad","quad_v"+v+"h"+h,targ.getNextHighestDepth());
	targ["quad_v"+v+"h"+h]._x = targ["quad_v"+v+"h"+h]._width*h;
	targ["quad_v"+v+"h"+h]._y = targ["quad_v"+v+"h"+h]._height*v;
	if (h<100) {
		foo(v,h+1,targ);
	} else {
		if (v<100) {
			setTimeout(foo,1,v+1,0,this);
		} else {
			trace("stop");
		}
	}
}
Работает все же медленней (даже если задержку поставить в 0мс). Но при этом машина не зависает на несколько секунд, а результат можно лицезреть (это можно отнести как к плюсам, так и к минусам).
Исходя из вышесказанного остановлюсь все же на рекурсии (т.к. не думаю что пользователь будет рад полному подвисанию системы, даже в ущерб скорости). Если у кого будут другие мнения и/или доводы - с удовольствием выслушаю.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 29.06.2009, 22:26
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 16  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
С тем же успехом можно было прогонять пачками циклы с интервалом, не забивая память рекурсиями.

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

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
Цитата:
Сообщение от __etc Посмотреть сообщение
...не забивая память рекурсиями.
Т.е. получается любая функция хранится в памяти до окончания работы ролика , а рекурсия плодит их (функции) похлеще кроликов? Если да, то можно ли (и как) удалить рекурсивную функцию из памяти?

Upd. Перепроверил - при рекурсии функция пересоздается (по крайней мере таковы результаты трэйса), так что не понятно чем тогда будет забиваться память. Если можно - поподробней по данной теме.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!


Последний раз редактировалось TanaTiX; 30.06.2009 в 00:48.
Старый 30.06.2009, 08:09
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 18  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Память забивается стеком вызовов и локальными переменными, из значениями и областями видимости, очевидно же.

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

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
Всем спасибо за внимание, все понятно.

Upd. Вот стало интересно с Flasm-ом немного поиграться, интересно ж... Наваял такой незатейливый код:
Код AS1/AS2:
foo(0,200);
function foo(s, e) {
	this.txt.text += s+", ";//txt - InstanceName вручную созданного текстового поля
	if (s<e) {
		foo(s+1,e);
	}
}
После использования проги:
Код:
C:\Flasm>flasm -d rec.swf > rec.flm
В результате получаю такой код:
Код:
movie 'rec.swf' compressed // flash 9, total frames: 1, frame rate: 12 fps, 550x400 px

  frame 0
    constants 'txt', 'text', ', ', 'foo'  
    function2 foo (r:2='s', r:3='e') (r:1='this')
      push r:this, 'txt'
      getMember
      push 'text', r:this, 'txt'
      getMember
      push 'text'
      getMember
      push r:s, ', '
      add
      add
      setMember
      push r:s, r:e
      lessThan
      not
      branchIfTrue label1
      push r:e, r:s, 1
      add
      push 2, 'foo'
      callFunction
      pop
     label1:
    end // of function foo

    push 200, 0.0, 2, 'foo'
    callFunction
    pop
  end // of frame 0
end
Изменение значения с 200 на любое другое работает в пределах установленным по умолчанию, а где находится тот заветный кусок кода, в котором прописывается собственно ограничение на глубину рекурсии, для по прежнему остается загадкой. Поиск тоже не привел ни к чему путному (искал именно на счет рекурсии, в отношении оптимизации информация, хоть и мало, но есть). Если кто не против малость заморочиться (или просто знает) - спасибо.

ЗЫ. и я так понимаю, что под ас3 прога работать не будет?
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 03.07.2009, 23:34
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 20  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,600
Записей в блоге: 17
Цитата:
Изменение значения с 200 на любое другое работает в пределах установленным по умолчанию
В смысле "не больше"? Может тип данных не позволяет выйти за большее?

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:56.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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