Використання cacheAsBitmap для прискорення роботи flash-додатків
Напевно, всі, хто пробували свої сили в 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».