Наверно, все, кто пробовали свои силы во Flash, сталкивались с необходимостью ускорения визуализации объектов на сцене флеш-ролика. Особенно остро эта проблема стоит для векторных рисунков, которые сами по себе очень требовательны к ресурсам. Кроме этого, векторные изображения часто содержат градиенты и полупрозрачность. Всё это крайне негативно сказывается на производительности Flash Player-а.
Обозначенную проблему с производительностью пытаются решать по-разному. Одним из способов является кэширование объектов с помощью стандартного свойства cacheAsBitmap. Делает это свойство именно то, что и заложено в его названии - сохраняет объект в виде его растрового представления, а с растром flash-плеер работает быстрее, чем с векторными изображениями. Данное свойство доступно в ActionScript 3.0 для объектов, наследующих от DisplayObject (смотри шпаргалку в «Список отображения в ActionScript 3.0»). А применяется оно невероятно просто...
Код ActionScript 3.0:
import flash.display.Sprite;
var sprite:Sprite = new Sprite();
sprite.graphics.beginFill(0x000000,1);
sprite.graphics.drawCircle(200,200,100);
sprite.graphics.endFill();
addChild(sprite);
/*
включаем кэширование
*/
sprite.cacheAsBitmap = true;
/*
проверяем
*/
trace(sprite.cacheAsBitmap);
Как видите, чтобы включить кэширование, надо просто присвоить свойству cacheAsBitmap булево значение true.
Что же даёт использование cacheAsBitmap на практике? Давайте посмотрим на примере...
Демонстрация работы cacheAsBitmap:
В данном примере имеется флеш-ролик с 1000-ю анимированных MovieClip-ов. Причём эти мувики не только векторные, но ещё имеют и градиентную заливку, и полупрозрачность. Естественно, ролик тормозит. В левом верхнем углу этого ролика, под счётчиком, имеется переключатель. С помощью этого переключателя можно включать/отключать кэширование мувиклипов. По умолчанию стоит false - кэширование отключено. А теперь включите кэширование. Что изменилось?
На самом деле даже без счётчика понятно, что с включённым cacheAsBitmap наш пример стал работать гораздо быстрее. Что и требовалось доказать.
Примечание:
[!] Что до счётчика в левом верхнем углу ролика, то он взят из урока «Мониторинг производительности flash-приложений». Там же расшифровываются все его показатели.
И всё бы было замечательно, если бы не было ограничений на использование cacheAsBitmap. А таких ограничений несколько:
- ограничение на размеры объектов;
В Flash Player имеются ограничения на максимальную ширину и высоту растровых изображений. Эти ограничения разные для разных версий флеш-плеера. Впрочем, и допустимых размеров, как правило, хватает с излишком.
- ограничение на манипуляции с кэшируемыми объектами;
Векторное содержимое кэшируемого объекта должно быть неизменным. Если оно изменяется, то происходит перерисовка растрового представления объекта. А это не только не ускоряет производительность флеш-ролика, а, наоборот, крайне негативно сказывается на производительности. Обратите внимание, что в приведённом выше примере объекты меняют свою позицию относительно системы координат, но их внутреннее содержимое остаётся неизменным.
- возможны ошибки из-за нехватки памяти для кэширования.
Cам пока не встречал, но так утверждается в хэлпе. Впрочем, это вполне понятная рекомендация, если учесть, что растровое изображение, как правило, занимает больше памяти, чем векторное.
Примечания:
[!] Учтите, что флеш-плеер автоматически кэширует те объекты, к которым применены фильтры (и до тех пор, пока к ним применены фильтры).
[!] О том, какие интересные эффекты можно получить, применив cacheAsBitmap к маске, упоминалось в статье «Градиентная маска средствами ActionScript 3.0».
Речь идёт не о размере готового флеш-ролика, а о нагрузке работающего флеш-ролика на ЦП вашего компьютера.
> Если я всё же не прав,поправьте, но флеш изначально работает с вектором
Изначально, да.