Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Про правильную организацию, про оптимизацию, и еще кое-что. (http://www.flasher.ru/forum/showthread.php?t=114801)

jaguard 09.08.2008 17:06

Про правильную организацию, про оптимизацию, и еще кое-что.
 
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? А то читаемость очень страдает.

Felicast 09.08.2008 17:20

2. как я понимаю ничего сверх глобального функции addChild/removeChild не делают. они просто добавляют указатель на твой объект в список. такчто я думаю они работают не намного дольше visible.

jaguard 09.08.2008 17:29

Цитата:

Сообщение от Felicast (Сообщение 757210)
2. как я понимаю ничего сверх глобального функции addChild/removeChild не делают. они просто добавляют указатель на твой объект в список. такчто я думаю они работают не намного дольше visible.

Но ведь removeChild принимает не индекс, а указатель. Значит, если в сцене 300 объектов, удаление будет в худшем случае в 300 раз медленнее. Конечно, можно хранить индекс объекта и удалять его по индексу, но ведь и удаление из середины (или тем более начала) Actionscript'ового Array неоптимально. Если речь идет о партикловой системе(или там, системе пулек), это ведь может быть критично?

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

fljot 09.08.2008 17:32

1. чтоб вам подсказали, чего там не работает, нужен код. "телепаты в отпуске"
то, что stage нулевой это как раз ок. раз спрайт не в display list, значит и stage ему не нужен.
удалить самого себя можно
Код:

parent.removeChild(this)
зачем добавлять на сцену? обычно добавляет контейнер сам в себя. т.е. скажем рутовый класс создаёт спарйт и добавляет к себе.

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

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

jaguard 09.08.2008 18:06

[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 видно, а в других файлах - нет.
Цитата:


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

Tfp 09.08.2008 18:08

1. обьяви переменную в документ класее тип main=Stage
и потом docclacc.main.addEvent.....

jaguard 09.08.2008 18:52

Цитата:

Сообщение от Tfp (Сообщение 757219)
1. обьяви переменную в документ класее тип main=Stage
и потом docclacc.main.addEvent.....

Мысль понятна, реализация - нет :). Что такое "docclacc"?

Felicast 09.08.2008 19:44

Цитата:

Сообщение от jaguard (Сообщение 757211)
Но ведь removeChild принимает не индекс, а указатель. Значит, если в сцене 300 объектов, удаление будет в худшем случае в 300 раз медленнее.

я уверен, что там не просто массив, а хеш таблица. операции добавления/удаления в хеш таблицах выполняется за константное(!), а не за линейное время. следовательно скорость не будет зависеть от количества объектов.

зы: это уже обсуждалось недавно на этом форуме.

ulik 09.08.2008 19:54

2автор: ты экземпляр класса добавь сначало в displayList и будет тебе stage.

Felicast 09.08.2008 20:24

по 1-му пункту:
Код:

public class YourClass extends Sprite
{
        public static var myStage : DisplayObject;
        //реализация
}

в основном классе пишешь
Код:

YourClass.myStage = this;
и в конструкторе YourClass смело обращаешься к myStage


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

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