Кэширование экранных объектов

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

По мере увеличения размера проектов Flash необходимо учитывать производительность и оптимизацию независимо от того, создаете ли вы приложения или сложные анимации на основе сценариев. Если содержимое остается статическим (как экземпляр прямоугольного объекта Shape), проигрыватель Flash Player и среда AIR не оптимизируют его. Поэтому при изменении позиции прямоугольника Flash Player и AIR отрисовывают весь экземпляр Shape заново.

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

Примечание. Векторные данные можно обновить. При этом подложка будет воссоздана. Исходя из этого, векторные данные, которые кэшированы в подложке, не должны оставаться неизменными для всего SWF-файла.

Присвоение свойству cacheAsBitmap экранного объекта значения true приводит к тому, что объект кэширует собственное растровое представление. Проигрыватель Flash Player и среда AIR создают для экземпляра объект подложки, который представляет собой кэшированное растровое изображение, а не векторные данные. При изменении границ экранного объекта выполняется воссоздание подложки вместо изменения размера. Подложки могут быть вложены в другие подложки. Дочерняя подложка копирует свое растровое изображение на родительскую подложку. Дополнительные сведения см. в разделе «Включение кэширования растрового изображения».

Свойства opaqueBackground и scrollRect класса DisplayObject относятся к кэшированию растрового изображения с помощью свойства cacheAsBitmap. Хотя три этих свойства независимы друг от друга, свойства opaqueBackground и scrollRect лучше всего функционируют, когда объект кэширован в качестве растрового изображения. Выигрыш в производительности при использовании свойств opaqueBackground и scrollRect виден только тогда, когда cacheAsBitmap присвоено значение true. Дополнительные сведения о прокрутке содержимого экранного объекта см. в разделе «Панорамирование и прокрутка экранных объектов». Дополнительные сведения об установке непрозрачного фона см. в разделе «Установка цвета непрозрачного фона».

Сведения о маскировании альфа-канала, которое требует присвоения свойству cacheAsBitmap значения true, см. в разделе «Маскирование экранных объектов».

Когда следует применять кэширование

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

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

Случаи применения кэширования растровых изображений

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

  • Изображение со сложным фоном: приложение, содержащее векторное изображение со сложным и детально проработанным фоном (возможно, изображение, к которому применена команда trace bitmap, или работа, созданная в Adobe Illustrator®). Можно анимировать фоновые символы. Это замедлит анимацию, поскольку для фона необходимо постоянно воссоздавать векторные данные. Чтобы повысить производительность, можно присвоить свойству opaqueBackground фонового экранного объекта значение true. Фон визуализируется как растровое изображение и поддерживает быструю перерисовку, что повышает скорость воспроизведения анимации.

  • Текстовое поле с прокруткой: приложение, отображающее большой объем текста в текстовом поле с прокруткой. Текстовое поле можно разместить в экранном объекте, для которого задана возможность прокрутки с помощью границ прокрутки (свойство scrollRect). Это позволяет быстро прокручивать пикселы в указанном экземпляре. При прокрутке экземпляра экранного объекта все текстовое поле не формируется заново. Вместо этого прокручиваемые пикселы сдвигаются вверх, после чего формируется новая область.

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

  • Маскирование альфа-канала: при использовании маскирования альфа-канал необходимо присвоить свойству cacheAsBitmap значение true. Дополнительные сведения см. в разделе «Маскирование экранных объектов».

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

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

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

Использование данной функции при неверных обстоятельствах может негативно сказаться на производительности SWF-файла. При использовании кэширования растровых изображений запомните следующие рекомендации.

  • Не используйте подложки (экранные объекты с включенным кэшированием) больше, чем это необходимо. Любая подложка требует больше памяти, чем обычный экранный объект. Это означает, что подложки необходимо применять только тогда, когда нужно повысить производительность визуализации.

    Кэшированные растровые изображения могут занимать значительно больше памяти, чем обычный экранный объект. Например, если размер экземпляра Sprite в рабочей области составляет 250x250 пикселов, то кэширование может потребовать 250 КБ вместо 1 КБ в случае обычного (не помещенного в кэш) экземпляра Sprite.

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

  • Подложки следует использовать для тех экземпляров экранных объектов, которые, в основном, статичны (без анимации). Такой экземпляр можно перетаскивать или перемещать, но его содержимое не должно быть анимированным или значительно изменяться. Анимация или изменение содержимого более вероятно в случае экземпляра MovieClip с анимацией или экземпляра Video. Например, если экземпляр вращается или преобразуется, то используется попеременно подложка и векторные данные, что затрудняет расчеты и негативно влияет на работу SWF-файла.

  • Если подложки используются вперемешку с векторными данными, то возрастает объем вычислений, выполняемых приложениями Flash Player и AIR (а иногда и компьютером). Группируйте подложки везде, где это возможно (например, при создании приложений с окнами).

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

Включение кэширования растрового изображения

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

mySprite.cacheAsBitmap = true;

После присвоения свойству cacheAsBitmap значения true можно заметить, что экранный объект автоматически привязывает свои пикселы к целым значениям координат. В ходе проверки SWF-файла видно, что сложные анимированные векторные изображения визуализируются гораздо быстрее.

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

  • Размер растрового изображения превышает 2880 в ширину или в высоту.

  • Не удается найти растровое изображение (ошибка «Недостаточно памяти»).

Матрицы преобразования кэшированных растровых изображений

В приложениях AIR для мобильных устройств следует устанавливать свойство cacheAsBitmapMatrix во всех случаях, когда задается свойство cacheAsBitmap. Установка этого свойства позволит применять более широкий набор преобразований для отображаемых объектов без повторной визуализации.

mySprite.cacheAsBitmap = true; 
mySprite.cacheAsBitmapMatrix = new Matrix();

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

  • Перемещение и перенос без привязки к пикселам

  • Вращать

  • Масштаб

  • Наклон

  • Изменить значение альфа (от 0 до 100 % прозрачности)

Эти преобразования применяются к кэшированному растровому изображению.