Просмотр полной версии : производительность и слушатели
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, при расчетах динамически создает экземпляры классов (совершенно неоправданно).
а я вообще всегда думал, что все эти слушатели да стандартные библиотеки для чайников.
ибо как правило они жрут (вес или ресурсы) больше чем могло было бы быть при написании с нуля.
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
я вам поверю на слово)
)))))))))))))
долои библиотеки!!
мне вот инетерстно.
для какои конкретно задачи топикстартер задает данный вопрос..может можно было бы предложить с ходу вообще иное решение,кроме как прослушка? )
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 движке события, только вместо точки использовал вектор, а точка пересечения вектора с полигоном и была точкой курсора в трехмерном пространстве.
Самый простой пример, когда события мешают: на сцене располагаем Спрайты сеткой с шагом в 1 пиксель заполняя весь экран. Вопрос, что легче: подписать все спрайты на события мыши или вычислить нужный по координатам? Думаю прирост будет x100000 если не больше
iflamberg
13.08.2009, 19:13
2Rzer: подписывается контейнер на события. Дейсвия выполняем в зависимости от target. Все. Одно событие на все ваши спрайты.
MonkDead
13.08.2009, 19:13
Rzer, конкретный пример и что самое важное очень частый.
подписывается контейнер на события. Дейсвия выполняем в зависимости от target. Все. Одно событие на все ваши спрайты.
iflamberg, да подписались мы 1 раз, но это не означает что дети не шлют событие. Все дети все равно рассылают события, а то сколько у вас слушателей значения никакого не имеет (даже если вы и не подписывались на события они все равно рассылаются).
P.S. чувствую эту тему будем мусолить пару дней теперь :) :(
Что-то все в крайности кидаются:)
Самый простой пример, когда события мешают: на сцене располагаем Спрайты сеткой с шагом в 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.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.