Обновления экрана после события Flex - PullRequest
1 голос
/ 26 сентября 2008

Я наткнулся на эту тему сегодня, исследуя что-то очень странное. Выполнение определенных действий в нашем приложении Flex может привести к тому, что количество кадров, отображаемых в ракете, может составлять от 12 кадр / с до ~ 30 кадр / с: загруженные анимации начинают воспроизводиться с высокой скоростью, а графический интерфейс начинает блокироваться.

Поскольку все, что я читал на Flex / Flash, говорит о том, что «частота кадров ограничена частотой кадров, установленной в приложении верхнего уровня», кажется, что эти дополнительные рендеры могут происходить только из-за некоторых событий. вызывая их (никаких программных изменений частоты кадров на сцене не делается). Поскольку это происходит только тогда, когда я помещаю свою логику обновления в обработчик ENTER_FRAME, я пытаюсь выяснить, что может происходить, что, по-видимому, приводит к тому, что Flex сходит с ума.

Гипотеза: что-то в моей функции обновления вызывает немедленное обновление экрана, это немедленно вызывает другое ENTER_FRAME, что означает, что мой цикл обновления вызывается, что вызывает другое немедленное обновление экрана, ...

В нашем графическом интерфейсе используются компоненты Flex, если это имеет значение. Я действительно не знаю, куда идти дальше.

Разъяснения

  • Когда я говорю, что вещи ускоряются, там это проявляется двумя способами.
  • Во-первых, мой обработчик ENTER_FRAME получает звонил гораздо чаще.
  • Во-вторых, загружен Flash SWF с циклом анимация встроена в неожиданные скорости до настоящего момента это выглядит глупо.
  • Я не использую updateAfterEvent, я только обнаружил, что это существовало при исследовании Эта проблема. Видимо, некоторые события на подклассах Sprite автоматически позвоню, и мне интересно если это коренная причина.
  • Я не делаю никаких прямых сообщений о рендеринге вообще. Фоновые анимации воспроизводятся автоматически, поскольку они имеют встроенные временные шкалы из авторизации CS3. Все, что делает наша функция обновления, это изменяет положение DisPlayObjects или добавляет / удаляет их и т. Д.

Обновление: Я добавил ярлык в свое приложение для распечатки stage.frameRate и обнаружил, что в определенные моменты он внезапно меняется с 12 на 1000 (максимально допустимое значение). Хотя добавление строки в мой обработчик ENTER_FRAME для сброса было тривиально, это вряд ли поможет. Кроме того, даже делая это, рендеринг все испортил. Определенные действия (такие как создание всплывающего окна Alert) возвращают его к жизни. К сожалению, я не могу просмотреть источник класса Stage, чтобы установить точку останова для свойства setter.

Это очень интересно насчет загрузки Flex, установленной на 1000 кадров в секунду. У нас есть несколько приложений Flex, которые предоставляют общий интерфейс. Главное приложение отвечает за загрузку этих модулей в соответствии с требованиями класса SWFLoader. Однако процесс загрузки уже учитывает задержку загрузки ... при загрузке SWF-файла мы ждем APPLICATION_COMPLETE из SystemManager. Раз это получено, разве не должно быть выполнено завершение заявки?

Ответы [ 3 ]

4 голосов
/ 29 сентября 2008

Flex устанавливает частоту кадров в 1000 во время «поэтапного создания» компонентов Flex, которое происходит только при начальной загрузке Flex SWF. Это позволяет очень быстро создавать все компоненты.

Вы ожидаете полной загрузки и создания приложения Flex? Вам следует дождаться FlexEvent.CREATION_COMPLETE, прежде чем работать с содержимым Flex.

Если вам нужна ссылка на то, где это происходит, посмотрите в классе Flex LayoutManager, строка 326 (используя Flex SDK 3.0.194161), в установщик для свойства usePhasedInstantiation.

Обновление:

APPLICATION_COMPLETE должен предоставить вам покрытие для начальной загрузки.

На самом деле это происходит каждый раз, когда компоненты создаются непосредственно из MXML. Таким образом, есть несколько других случаев, чтобы искать. Вы используете какие-либо повторители? Используете ли вы какие-либо навигационные контейнеры, которые строят своих детей по требованию?

1 голос
/ 27 сентября 2008

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

  1. Вы также можете попробовать отследить stage.frameRate во время ускорения. Предположительно, ничто не должно изменять частоту смены кадров, но, поскольку это объясняет ваши проблемы, вы также можете исключить это.

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

  3. Одна из проверок работоспособности, которую вы можете попробовать, если это возможно, состоит в том, чтобы скопировать часть содержимого вашей игры в новый проект и попробовать его там. Иногда такие загадочные проблемы возникают из-за того, что какой-то класс или SWC импортируется куда-то, о чем все забыли.

  4. Вы можете попробовать вывести свой код из другого события. Например, насколько я знаю, езда с Event.EXIT_FRAME или Event.FRAME_CONSTRUCTED должна выглядеть одинаково, но если это не так, то это подсказка. В качестве альтернативы, вы можете попробовать управлять им с клавиатуры или с клавиатуры MouseEvent.MOUSE_MOVE. Затем, если обновления происходят, даже если вы не запускаете события, вы будете знать, что что-то еще движет помимо вашего цикла событий.

В любом случае, это то, что я бы попробовал. Надеюсь, вы разыщите это ...

1 голос
/ 27 сентября 2008

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

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

Если последнее, используете ли вы какие-либо updateAfterEvent() методы в своем коде? Это может привести к тому, что фактическое обновление экрана будет происходить быстрее, чем опубликованная частота кадров. Это не должно повлиять на ENTER_FRAME события. Вы все равно должны получить только одно из них за обновление кадра.

С другой стороны, вещи, которые вы анимируете, это просто спрайты и так далее, или вы реализуете их как компоненты Flex и пытаетесь перерисовать их с помощью invalidate() методов и событий RENDER и так далее?

Если бы вы могли уточнить некоторые из этих вопросов в вопросе, ответ мог бы быть более ясным. Спасибо ...

...