PDA

Просмотр полной версии : производительность и слушатели


random13
13.08.2009, 16:02
вопрос возник следующий, очень много на самом деле обсуждали по поводу слушателей, что их хорошо бы зачищать иногда и прочее прочее прочее, хотя в некоторых случаях это либо не возможно либо просто нельзя дабы не нарушить работу самой флехи...

но вопрос вот в чем насколько завязаны слушатели и общая производительность,
опять же известно что впринципи флешка может зачищать и их но это крайне непростой процесс, много ли они съедают памяти? может у кого были на эту тему исследования, замечания и прочее...

MonkDead
13.08.2009, 16:30
События съедают очень много памяти и крайне тяжелы (в плане производительности).
При разработки серьезных проектов события не используют, либо пишут свой аналог рассылки событий без создания тучи экземпляров классов и рассылка происходит целенаправленно, а не по иерархической цепочки как базовые события flash'a.

ramshteks
13.08.2009, 16:50
ну может я конечно не писал чего то такого действительно серьезного, но не сказал бы что бы события были слишком тяжелыми. если на одно событие 500 слушаетлей то конечно...) да и рассылка по всей иерархии происходит, если я ничего не путаю только в стадии пузырька. Да и потом, я думаю что сами собьытия все таки реализованы не на самом флеше, а являются частью плеера, что наталкиет опять таки на мысль что они достаточно быстры.

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

MonkDead
13.08.2009, 17:20
но не сказал бы что бы события были слишком тяжелыми

Для теста:
1) создайте 5000 Sprite;
2) нарисуйте в них что нибудь и добавьте на сцену:
3) подпишитесь на событие MOUSE_MOVE (можно и не подписываться, события и так будут рассылаться);
4) посмотрите FPS

Сделайте тоже самое без подписки на событие и установите спрайтам mouseEnabled = false или замените Sprite на Shape и также посмотрите FPS :)

Каждое событие создает экземпляр класса Event, а создание динамически экземпляров классов серьезно бьет по памяти и производительности.
В данном тесте, мышиные события рассылаются еще к тому же чаше чем Fps ролика.

random13
13.08.2009, 17:24
каак интересно получается, если мы пишем серьезный проект то лучше вообще все возможные функции написать с нуля, даже слушателей.., помойму велосипедом пахнет, я думаю что в компании adobe знают по более нашего про всё это и расчитывали когда создавали пусть и глючную платформу

MonkDead
13.08.2009, 17:28
random13, катайтесь на велосипеде, а я покатаюсь на машине.

Не забываем, что flash платформа универсальна, а все универсальное работает медленнее чем целенаправленное.
А вы знаете что половину методов flash, при расчетах динамически создает экземпляры классов (совершенно неоправданно).

Dezar
13.08.2009, 17:46
а я вообще всегда думал, что все эти слушатели да стандартные библиотеки для чайников.
ибо как правило они жрут (вес или ресурсы) больше чем могло было бы быть при написании с нуля.

MonkDead
13.08.2009, 17:48
а я вообще всегда думал, что все эти слушатели да стандартные библиотеки для чайников.

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

ибо как правило они жрут (вес или ресурсы) больше чем могло было бы быть при написании с нуля.

Dezar, у меня как вы поняли такое же представление.

ramshteks
13.08.2009, 17:50
я думаю даже самописная реализация событий не даст хорошей производительности для 5000 спрайтов. да и сравнивать 5000 спрайтов с 5000 шейпов не правильно, я считаю, так как это разные вещи. Да и как вы правильно подметили с выключенными событиями мыши все будет побыстрей работать. Так что тут я думаю стоит задуматься больше не о том что это тормазнуто, а о правильности архитектуры. Хотя конечно правда ваша, в некоторых ситуациях флеш не так быстр как хотелось бы, а главное не так как можно было бы.

MonkDead
13.08.2009, 18:01
я думаю даже самописная реализация событий не даст хорошей производительности для 5000 спрайтов.

Даст и более чем в 10 раз.

Так что тут я думаю стоит задуматься больше не о том что это тормазнуто, а о правильности архитектуры

Да и забить вообще на эти flash контейнеры и пользоваться одной математиком, тем самым увеличив общую производительность в сравненни с базовыми возможностями flash уже более чем в 20 раз.

ramshteks
13.08.2009, 18:20
я вам поверю на слово)

Dezar
13.08.2009, 18:20
)))))))))))))
долои библиотеки!!

мне вот инетерстно.
для какои конкретно задачи топикстартер задает данный вопрос..может можно было бы предложить с ходу вообще иное решение,кроме как прослушка? )

MonkDead
13.08.2009, 18:28
я вам поверю на слово)

ramshteks, я не заставляю верить мне :)

Dezar, сам пытаюсь у него выяснить, он тут подобными темами видимо опрос делает :)

PgeorgyV
13.08.2009, 18:33
События съедают очень много памяти и крайне тяжелы (в плане производительности).
При разработки серьезных проектов события не используют, либо пишут свой аналог рассылки событий без создания тучи экземпляров классов и рассылка происходит целенаправленно, а не по иерархической цепочки как базовые события flash'a.
Что то я не очень понял как отказать, например, от события MOUSE_OVER, по таймеру что ли проверять наведение? Можно пример или пояснение как в серьёзных проектах отказаться от мышиных событий...

MonkDead
13.08.2009, 18:36
Что то я не очень понял как отказать, например, от события MOUSE_OVER, по таймеру что ли проверять наведение? Можно пример или пояснение как в серьёзных проектах отказаться от мышиных событий...

Использовать мат. операции. Если коротко проверять попадание точки (курсора) в многоугольники (ваш графический объект).

Таким образом я сделал в своем 3D движке события, только вместо точки использовал вектор, а точка пересечения вектора с полигоном и была точкой курсора в трехмерном пространстве.

Rzer
13.08.2009, 18:55
Самый простой пример, когда события мешают: на сцене располагаем Спрайты сеткой с шагом в 1 пиксель заполняя весь экран. Вопрос, что легче: подписать все спрайты на события мыши или вычислить нужный по координатам? Думаю прирост будет x100000 если не больше

iflamberg
13.08.2009, 19:13
2Rzer: подписывается контейнер на события. Дейсвия выполняем в зависимости от target. Все. Одно событие на все ваши спрайты.

MonkDead
13.08.2009, 19:13
Rzer, конкретный пример и что самое важное очень частый.

подписывается контейнер на события. Дейсвия выполняем в зависимости от target. Все. Одно событие на все ваши спрайты.

iflamberg, да подписались мы 1 раз, но это не означает что дети не шлют событие. Все дети все равно рассылают события, а то сколько у вас слушателей значения никакого не имеет (даже если вы и не подписывались на события они все равно рассылаются).


P.S. чувствую эту тему будем мусолить пару дней теперь :) :(

r_r_f_r
13.08.2009, 22:00
Что-то все в крайности кидаются:)

Самый простой пример, когда события мешают: на сцене располагаем Спрайты сеткой с шагом в 1 пиксель заполняя весь экран.
Это называется bitmap:)

random13, если у вас этих объектов будет штук 100, то проблема точно никак не в слушателях и событиях будет, а в перерисовке.

Как я понимаю вы делаете векторный редактор не просто для линий, а для каких-то объектов, следовательно в нём мало вероятно будет > 100 объектов, дальше - отрисовка.
Делаем три "слоя": средний для редактируемого объекта, нижний и верхний для остальных объектов, их или в битмапу срисовываем, или просто cacheAsBitmap выставляем(как уже говорилось "Не забываем, что flash платформа универсальна, а все универсальное работает медленнее чем целенаправленное.")

Пояснение на "штук 100", незабываем убивать объекты которые вне области видимости.

П.С Я не говорил что 5000 отображаемых спрайтов это лучше чем битмапа+математика:)

PgeorgyV
14.08.2009, 10:30
Таким образом я сделал в своем 3D движке события, только вместо точки использовал вектор, а точка пересечения вектора с полигоном и была точкой курсора в трехмерном пространстве.
т.е. Вы для полигона проверяете hitTestPoint по интервалу/таймеру для определения нахождения курсора над ним? Какой у Вас интервал 100мс?

да подписались мы 1 раз, но это не означает что дети не шлют событие. Все дети все равно рассылают события, а то сколько у вас слушателей значения никакого не имеет (даже если вы и не подписывались на события они все равно рассылаются).
1. Вы имитируете события только для DisplayObjects или, например, для URLLoader тоже?
2. Я так понял можно только отключить рассылку мышиных событий(mouseChildren, mouseEnabled) в случае Sprite/extends DisplayObjectContainer или ещё лучше просто использовать Shape/extends DisplayObject, правда в этом случае мы отказываемся от контейнеров, что в свою очередь ведёт к большему числу перерасчетов координат, или вообще не возможно по некоторым обстоятельствам?

random13
14.08.2009, 11:20
ramshteks, я не заставляю верить мне :)

Dezar, сам пытаюсь у него выяснить, он тут подобными темами видимо опрос делает :)

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

я хотел узнать чего стоит ждать от событий, здесь люди прекрасно описали как повлияет кол-во объектов на производительность, другой вопрос раз уж мы заговорили про 5000 объектов, хотелось бы увидеть такой проект где их реально столько отображается на экране в единый момент времени


кстати тут еще кто то кинул совершенно необдуманную фразу "Долой библиотеки", ага и фреймворки туда же...

пока все люди будут дома спать вы будете писать свой супер пупер легкий код и сдвигать сроки сдачи проекта

MonkDead
14.08.2009, 13:51
т.е. Вы для полигона проверяете hitTestPoint по интервалу/таймеру для определения нахождения курсора над ним? Какой у Вас интервал 100мс?

hitTestPoint это метод flash, а я же сказал не использую flash методы (насколько это возможно). Чистая математика, посмотрите в google такой запрос: "точка в многоугольнике".

Вы имитируете события только для DisplayObjects или, например, для URLLoader тоже?

"Имитирую" - не очень правильное слово. Нет только те события которые надо слушать постоянно в процессе работы программы,
URLLoader временное действие.

правда в этом случае мы отказываемся от контейнеров, что в свою очередь ведёт к большему числу перерасчетов координат

Вообще не использую контейнеры под графические элементы!

или вообще не возможно по некоторым обстоятельствам?

Таких обстоятельств нет :)

другой вопрос раз уж мы заговорили про 5000 объектов, хотелось бы увидеть такой проект где их реально столько отображается на экране в единый момент времени


Ссылка на такой проект у меня в подписи, до 30000 графических объектов "отображается на экране в единый момент времени".


пока все люди будут дома спать вы будете писать свой супер пупер легкий код и сдвигать сроки сдачи проекта

Пишешь один раз такой фреймворк и живешь потом спокойно.

чего вы привязались ко мне, зачем да зачем

Вы просто создаете такие общие темы, тем самым хотите узнать все и сразу. Чтобы ответить на подобные вопросы надо провести целый семинар по as :)

random13
14.08.2009, 14:28
Ссылка на такой проект у меня в подписи, до 30000 графических объектов "отображается на экране в единый момент времени".

честно... не впечатлило, некоторые вещи не открылись и выдали ошибку, а где это всё применять??? вроде есть нормальные 3d игры со своими мощными движками, а вот в браузере совсем нет желания играть учитывая что он будет еще зависать по неопределенным причинам


Вы просто создаете такие общие темы, тем самым хотите узнать все и сразу. Чтобы ответить на подобные вопросы надо провести целый семинар по as :)
так давайте собиремся:)


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

MonkDead
14.08.2009, 14:34
кстати еще вопрос, а ваша математика сама по себе не оказывается тоже очень тяжеловатой для флеша???
а то я пробовал делать определеные математические вычисления с естественными гео координатами которые легко рушили флешку, пришлось искать другие решения..

Как пример рассчитать 30000 полигонов (90000++ точек), прогнать их через десятки алгоритмов и отправить на отрисовку занимает от 6 до 20 мс в зависимости от типа рендеринга.
Дабы as3 гораздо шустрее в мат. расчетах чем as2.

Вы думаете flash не занимается мат. расчетами для определения например мышиных событий? Просто он делает их очень много, создает динамически экземпляры классов и делает еще куче всего лишнего.

некоторые вещи не открылись и выдали ошибку

Какие именно?

SorrowN00b
14.08.2009, 14:52
Ссылка на такой проект у меня в подписи, до 30000 графических объектов "отображается на экране в единый момент времени".
Респект, мужик!

random13
14.08.2009, 15:03
вот ссыль http://www.infinity3d-engine.com/ru/demos/felhound.html
а где эти вещи применяете?

MonkDead
14.08.2009, 15:18
вот ссыль http://www.infinity3d-engine.com/ru/demos/felhound.html

Эту демку просто не опубликовал под новой версией движка, на старой версии иногда просто не успевает распарсится файл из 200000 строк.

а где эти вещи применяете?

На сайте в шапке написано :)

Вообще на что фантазии хватит, сейчас в разработки:
1) интерактивный музей
2) три онлайн игры
3) тур по микрорайону для строительной компании (можно заходить в любое здание, ходить по любым помещениям, ездить на лифтах и т.д.)
4) пару разработок под моим руководством:
a) игра в стиле CS
б) игра в стиле Ragnarok
5) и мелкие проекты.

PgeorgyV
14.08.2009, 15:20
MonkDead, спасибо за ответы, Ragnarok это круто)

Волгоградец
14.08.2009, 15:26
hitTestPoint это метод flash, а я же сказал не использую flash методы (насколько это возможно). Чистая математика, посмотрите в google такой запрос: "точка в многоугольнике".
Так с каким все-таки интервалом проверяешь?

MonkDead
14.08.2009, 15:37
Так с каким все-таки интервалом проверяешь?

Как и стандартные мышиные события (или можно указать любой интервал, я использую стандартный интервал, что бы не возникало проблем с мышиными событиями).
Суть такая:
1) отследили например нажатие левой кнопки на мышке;
2) начинаем проверят в какой области произошло данное событие (Quad tree);
3) ищем потенциальные графические объекты над которыми могло произойти это событие:
4) проверяем с кем же все таки связано действие, когда находим отсылаем событие (но не создаем экземпляр события, а берем из буфера).

Как итог всего этого подхода создается и рассылается лишь одно событие в независимости от количества графических объектов.
Так же, если объекты не подписаны на событие они не участвуют в проверке и не отсылают ничего, в отличии от стандартной системы рассылки.

Волгоградец
14.08.2009, 15:52
Как это - "отследили например нажатие левой кнопки на мышке", если встроенные события не используешь?

MonkDead
14.08.2009, 15:59
Как это - "отследили например нажатие левой кнопки на мышке", если встроенные события не используешь?

Один то раз использую для stage.