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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 09.08.2008, 17:06
jaguard вне форума Посмотреть профиль Отправить личное сообщение для jaguard Найти все сообщения от jaguard
  № 1  
Ответить с цитированием
jaguard
[+1 31.07.08]

Регистрация: Jul 2008
Сообщений: 48
По умолчанию Про правильную организацию, про оптимизацию, и еще кое-что.

1. Создаю я спрайт, или, в моем случае - класс наследник спрайта. Хочу добавить листенера на мышку. Если добавляю листенера к себе, не работает, даже когда я аттачу спрайт к stage(вообще не работает, даже в области спрайта).
Добавить же сразу листенера к stage я не могу, т.к. в момент создания он null. Недодумали в адобе, вместо того чтобы сделать глобальный всеуказатель stage, они его сделали локальным для каждого спрайта, указывающим на глобальный когда он аттачится.

В общем, в результате мне приходится заводить отдельную однострочную процедуру, которую буду ручками вызывать ПОСЛЕ аттача моего спрайта к сцене. Неудобно. Есть способ лучше?

Заодно не получилось и удалить самого себя из списка stage. Тоже нельзя? Вызывал примерно так: this.stage.removeChild(this);


2. Оптимизационный вопрос. Насколько эффективно работает addChild/removeChild, и не лучше ли будет не удалять наследников, а запоминать указатель на них и ставить visible в false? Не будет ли лишних пенальти от приличного количества невидимых спрайтов у stage? И кстати, рендерит ли Flash спрайты с нулевой альфой? Или нулевыми scaleX/scaleY?

3. Как можно сделать глобальные функции rand(), abs(), sin/cos, которые можно будет вызывать без префикса Math? А то читаемость очень страдает.

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

Регистрация: Feb 2008
Адрес: Череповец
Сообщений: 623
Отправить сообщение для Felicast с помощью ICQ
2. как я понимаю ничего сверх глобального функции addChild/removeChild не делают. они просто добавляют указатель на твой объект в список. такчто я думаю они работают не намного дольше visible.
__________________
я могу стать всем, если только захочу

Старый 09.08.2008, 17:29
jaguard вне форума Посмотреть профиль Отправить личное сообщение для jaguard Найти все сообщения от jaguard
  № 3  
Ответить с цитированием
jaguard
[+1 31.07.08]

Регистрация: Jul 2008
Сообщений: 48
Цитата:
Сообщение от Felicast Посмотреть сообщение
2. как я понимаю ничего сверх глобального функции addChild/removeChild не делают. они просто добавляют указатель на твой объект в список. такчто я думаю они работают не намного дольше visible.
Но ведь removeChild принимает не индекс, а указатель. Значит, если в сцене 300 объектов, удаление будет в худшем случае в 300 раз медленнее. Конечно, можно хранить индекс объекта и удалять его по индексу, но ведь и удаление из середины (или тем более начала) Actionscript'ового Array неоптимально. Если речь идет о партикловой системе(или там, системе пулек), это ведь может быть критично?

Очевидно, все зависит от того, как много бессмысленного оверхеда тратится на обработку пустого/погашенного спрайта.

Старый 09.08.2008, 17:32
fljot вне форума Посмотреть профиль Отправить личное сообщение для fljot Найти все сообщения от fljot
  № 4  
Ответить с цитированием
fljot

блогер
Регистрация: Jul 2007
Сообщений: 940
Записей в блоге: 3
1. чтоб вам подсказали, чего там не работает, нужен код. "телепаты в отпуске"
то, что stage нулевой это как раз ок. раз спрайт не в display list, значит и stage ему не нужен.
удалить самого себя можно
Код:
parent.removeChild(this)
зачем добавлять на сцену? обычно добавляет контейнер сам в себя. т.е. скажем рутовый класс создаёт спарйт и добавляет к себе.

2. с нулевой альфой рендерит. причём альфовые рендеринги самые тяжёлые.

3. http://as3.ru/?p=16#more-16
или можно просто сделать ссылки на функции.. врятли это повысит производительость)
но вы уверены, что читаемость страдает?) не зря же функции клали в пакет-класс.

Старый 09.08.2008, 18:06
jaguard вне форума Посмотреть профиль Отправить личное сообщение для jaguard Найти все сообщения от jaguard
  № 5  
Ответить с цитированием
jaguard
[+1 31.07.08]

Регистрация: Jul 2008
Сообщений: 48
[quote=fljot;757213]1. чтоб вам подсказали, чего там не работает, нужен код. "телепаты в отпуске"
то, что stage нулевой это как раз ок. раз спрайт не в display list, значит и stage ему не нужен.
Код:
parent.removeChild(this)
Stage нужен, если мне в этот display list нужно спрайт добавить. Замкнутый порочный круг - без указателя на stage себя к нему не добавить, а без добавления не получить этот указатель . Дурдом. Сделали бы хоть какую-нибудь сабфункцию у объекта DisplayObject типа retrieveStage().

Цитата:
зачем добавлять на сцену? обычно добавляет контейнер сам в себя. т.е. скажем рутовый класс создаёт спарйт и добавляет к себе.
Да, так пришлось сделать. Но бардак - плодить два класса где можно обойтись одним. Для того класса для которого я это сделал это нормально, а для чего-нибудь простого уже излишество.


Цитата:
2. с нулевой альфой рендерит. причём альфовые рендеринги самые тяжёлые.
А с visibility == false сильно тратится время? Мне нужно понять, что быстрее - удалять объекты, или сетапить visibility в false. Т.е. понятно что второе быстрее, но как это влияет на общую производительность, вот что главное.

Цитата:
3. http://as3.ru/?p=16#more-16
или можно просто сделать ссылки на функции.. врятли это повысит производительость)
А как сделать эти ссылки глобальными?

Пробовал добавлять к базовому package
Код:
public function Sin(a:Number):Number
{
  return Math.sin(a);
}
и так тоже

public var Sin:Function = Math.sin;

Оба варианта внутри этого package видно, а в других файлах - нет.
Цитата:

но вы уверены, что читаемость страдает?) не зря же функции клали в пакет-класс.
Безусловно. Чем короче тем лучше .

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

Регистрация: May 2008
Сообщений: 161
1. обьяви переменную в документ класее тип main=Stage
и потом docclacc.main.addEvent.....

Старый 09.08.2008, 18:52
jaguard вне форума Посмотреть профиль Отправить личное сообщение для jaguard Найти все сообщения от jaguard
  № 7  
Ответить с цитированием
jaguard
[+1 31.07.08]

Регистрация: Jul 2008
Сообщений: 48
Цитата:
Сообщение от Tfp Посмотреть сообщение
1. обьяви переменную в документ класее тип main=Stage
и потом docclacc.main.addEvent.....
Мысль понятна, реализация - нет . Что такое "docclacc"?

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

Регистрация: Feb 2008
Адрес: Череповец
Сообщений: 623
Отправить сообщение для Felicast с помощью ICQ
Цитата:
Сообщение от jaguard Посмотреть сообщение
Но ведь removeChild принимает не индекс, а указатель. Значит, если в сцене 300 объектов, удаление будет в худшем случае в 300 раз медленнее.
я уверен, что там не просто массив, а хеш таблица. операции добавления/удаления в хеш таблицах выполняется за константное(!), а не за линейное время. следовательно скорость не будет зависеть от количества объектов.

зы: это уже обсуждалось недавно на этом форуме.
__________________
я могу стать всем, если только захочу

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

Регистрация: Apr 2007
Адрес: Moscow city
Сообщений: 286
Отправить сообщение для ulik с помощью ICQ
2автор: ты экземпляр класса добавь сначало в displayList и будет тебе stage.
__________________
Дизайн, как презерватив - каждому жмет по-своему © Я
мое: блог форум

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

Регистрация: Feb 2008
Адрес: Череповец
Сообщений: 623
Отправить сообщение для Felicast с помощью ICQ
по 1-му пункту:
Код:
public class YourClass extends Sprite
{
	public static var myStage : DisplayObject;
	//реализация
}
в основном классе пишешь
Код:
YourClass.myStage = this;
и в конструкторе YourClass смело обращаешься к myStage
__________________
я могу стать всем, если только захочу

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

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

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


 


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


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