2009-12-19 2 views
0

Недавно я узнал, что есть несколько вещей, которые можно сделать для массового замедления приложения Flex. Одна из таких вещей - использование множества вложенных макетов. Еще одна вещь, которая очень проблематична, - использование относительного позиционирования и размеров лота.Производительность Flex Rendering

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

Почему? И что я могу сделать с этим (не переделывая весь макет)?

Большое спасибо!

+0

Попробуйте запустить профилировщик Flex Builder в своем приложении и посмотрите, что является основной причиной проблем с производительностью. –

ответ

0

Наконец-то я узнал, в чем проблема с нашим приложением!

Проблема заключалась не в том, что мы использовали лоты вложенных макетов. Я узнал, что мы использовали сторонний компонент, который прикрепляет прослушиватель событий к событию ENTER_FRAME-Event. К сожалению, этот компонент не отключается должным образом, поэтому прослушиватель событий никогда не удаляется. Одна вещь, вызываемая этим событием, - вызов invalidateDisplayList(). Я узнал, что событие ENTER_FRAME-событие происходит очень часто (я до сих пор не знаю, почему именно это происходит), и из-за этого весь макет пересчитывается снова и снова. Из-за вложенной структуры наших макетов это очень трудоемкая вещь, и поэтому процессор становится очень занятым!

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

+0

был компонентом третьей части коммерческого продукта? если это так, вы должны подать с ними отчет об ошибке. Также, если это так, пожалуйста, сообщите нам, какой продукт и детали вашего решения, если другие проблемы с ним возникнут. ~ Спасибо. И хорошая работа, наконец, выяснение вашей проблемы. – invertedSpear

+0

Нет, сторонний компонент не является общедоступным. Это просто компонент, разработанный специально для приложения, над которым мы работали. – zlajo

3

Верно, что вложенные контейнеры замедляют работу, но пока я еще не смог получить процессор до 100%. Структура должна только пересчитывать компоновку компонента после вызова invalidateDisplayList(). Вызов этого графика вызывает вызов updateDisplayList, в котором вычисляется макет контейнера. Следовательно, списки отображения дочерних элементов компонента также недействительны.

Помимо выполнения этого самостоятельно, displayList может быть аннулирован каркасом по целому ряду причин. Например, он всегда недействителен после invalidateProperties(). Возможно, что у вас есть что-то, что случайно лишает список отображения какого-либо контейнера высокого уровня все время, таким образом распространяя его на своих детей.

Есть ли у вас код для публикации? И какая система вы используете?

+0

Что именно вы подразумеваете под «invalidateProperties()»? Вы говорите о методе, который может быть вызван PropertyChangeEvents? – zlajo

+0

Прошу прощения, потребовалось время, Рождество и все такое.В любом случае invalidateProperties делает расписание фрейма вызовом commitProperties, как и в случае invalidateDisplayList. Это внутренний способ для компонента узнать некоторые из его значений, которые изменились, и ему нужно не только обновить, как он выглядит, но и как он себя ведет - и после того, как поведение изменилось, Flex предполагает, что внешний вид тоже должен был измениться, тем самым вызывая updateDisplayList. Свойства могут быть недействительными, т.е. при настройке dataProviders и т. д. PropertyChangeEvents относятся к привязке данных, которая не связана с этим. – tehmou

1

Любое другое решение, кроме рефакторинга вашего макета и не использующего много вложенных элементов, означает изменение способа работы adobe framework, и вы не хотите этого делать! Мое предложение, хотя может быть болезненным, изменить компоненты просмотра, использовать по возможности абсолютный размер и местоположение, не вставлять слишком много элементов. Причина для горлышка бутылки с вложенными компонентами заключается в том, что функции invalidate идут в 2 направлениях, сначала дерево от измененного компонента до корня, а затем от корня до всех его вложенных элементов, что заставляет ваш процессор.

Смежные вопросы