Adobe Flash Platform * Зменшення завантаження ЦП

  1. Вдосконалені можливості Flash Player 10.1 для використання ресурсів ЦП
  2. Пауза, зниження швидкості і відновлення
  3. управління екземплярами
  4. Сплячий режим
  5. Заморожування і розморожування об'єктів
  6. Активація та відключення подій
  7. Взаємодія з мишею
  8. Порівняння таймерів з подіями ENTER_FRAME
  9. ознака анімації

Іншим важливим напрямком оптимізації є завантаження центрального процесора

Іншим важливим напрямком оптимізації є завантаження центрального процесора. Оптимізація завантаження ЦП впливає на загальну продуктивність, а отже, і на час роботи мобільного пристрою від акумулятора.

Вдосконалені можливості Flash Player 10.1 для використання ресурсів ЦП

У програвачі Flash Player 10.1 представлені дві нові функції, що дозволяють зменшити завантаження центрального процесора. Ці функції дозволяють припиняти і відновлювати відтворення SWF-вмісту, коли воно стає закадровим, і обмежують число примірників Flash Player на сторінці.

Пауза, зниження швидкості і відновлення

Примітка. Стоп-кадр, зниження швидкості і відновлення не застосовується до додатків Adobe® AIR®.

Щоб оптимізувати використання ресурсів ЦП і акумулятора, в програвач Flash Player 10.1 додана нова функція, призначена для роботи з неактивними екземплярами. Вона дозволяє знизити навантаження на ЦП за рахунок того, що коли вміст з'являється або зникає з екрану, відтворення SWF-файлу відповідно призупиняється і поновлюється. Завдяки цій функції програвач Flash Player звільняє всю можливу пам'ять шляхом видалення всіх об'єктів, які можуть бути повторно створені при відновленні відтворення вмісту. Вміст вважається закадровим, якщо весь вміст знаходиться за межами екрану.

SWF-вміст може стати закадровим в двох випадках:

  • Під час прокрутки сторінки користувачем SWF-вміст переміщається за межі екрану.

    У цьому випадку будь-яке відтворення відео або аудіо залишиться активним, але візуалізація зупиняється. Якщо аудіо або відео не програється, щоб відтворення або виконання коду ActionScript не зупиняє, задайте для HTML-параметра hasPriority значення true. Однак пам'ятайте, що візуалізація SWF-вмісту припиняється, якщо вміст є закадровим або прихованим незалежно від значення HTML-параметра hasPriority.

  • При відкритті вкладки в браузері SWF-вміст переміщається на задній план.

    У цьому випадку незалежно від значення тега HTML hasPriority швидкість відтворення SWF-вмісту знижується до 2-8 кадрів в секунду. Відтворення аудіо та відео зупиняється і візуалізація вмісту не обробляється, поки SWF-вміст знову не стане видимим.

У програвачі Flash Player 11.2 і пізніших версій, виконує в браузерах на настільних комп'ютерах Windows і Mac, в додатку можна використовувати подія ThrottleEvent. Flash Player відправляє подія ThrottleEvent в разі паузи, зниження швидкості або відновлення відтворення.

Подія ThrottleEvent - це багатоадресне подія, яка відправляється усіма об'єктами EventDispatcher, для яких зареєстровані прослуховувачі даної події. Додаткові відомості про багатоадресних події см. В описі класу DisplayObject .

управління екземплярами

Примітка. Функція управління екземплярами не застосовується до додатків Adobe® AIR®.

У Flash Player 10.1 з'явився новий параметр HTML - hasPriority.

<Param name = "hasPriority" value = "true" />

Ця функція обмежує кількість примірників Flash Player, що запускаються на сторінці. Це економить ресурси ЦП та акумулятора. Метою є призначення певного пріоритету SWF-вмісту, завдяки чому один вміст стає більш важливим в порівнянні з іншим вмістом на сторінці. Розглянемо простий приклад: користувач переглядає веб-сайт, а на сторінці покажчиків розміщені три різних SWF-файлу. Один з них є видимим, інший - частково видимим на екрані, а останній - закадровим, що вимагає прокрутки. Перші дві анімації запускаються в звичайному режимі, а запуск останньої анімації відкладається, поки вона не стане видимою. Цей сценарій являє поведінка за умовчанням, коли параметр hasPriority відсутня або має значення false. Для забезпечення запуску SWF-файлу, навіть якщо він знаходиться за межами екрану, задайте для параметра hasPriority значення true. Однак незалежно від значення параметра hasPriority візуалізація SWF-файлу, який невидимий для користувача, завжди припиняється.

Примітка. Якщо доступних ресурсів ЦП недостатньо, нові екземпляри Flash Player не запускаються автоматично, навіть якщо для параметра hasPriority задано значення true. Якщо нові екземпляри створюються з використанням JavaScript після завантаження сторінки, ці екземпляри будуть ігнорувати прапор hasPriority. Будь-яке вміст розміром 1x1 або 0x0 пікселів запускається, запобігаючи відкладений запуск SWF-файлів помічника, якщо веб-майстер не включив прапор hasPriority. Однак SWF-файли будуть як і раніше відтворюватися після клацання миші. Це поведінка називається «відтворенням одним помахом» (click to play).

На схемах нижче показано, як працює параметр hasPriority з різними значеннями.

Сплячий режим

У програвачах Flash Player 10.1 і AIR 2.5 представлена ​​нова функція для мобільних пристроїв, що дозволяє зменшити завантаження ЦП і, як результат, продовжити термін служби акумулятора. Ця функція працює разом з підсвічуванням, передбаченої в багатьох мобільних пристроях. Наприклад, якщо мобільний додаток запущено і користувач більше не використовує пристрій, середовище виконання виявляє, коли підсвічування переходить в сплячий режим. Потім він скидає частоту кадрів до 4 кадрів в секунду і призупиняє візуалізацію. Для додатків AIR перехід в сплячий режим виконується, коли додаток переміщається на задній план.

Код ActionScript залишиться активним в сплячому режимі, як якщо б властивості Stage.frameRate було присвоєно значення 4 кадри в секунду. Але етап візуалізації пропускається, тому користувач не бачить того, що програвач працює з частотою 4 кадри в секунду. Частота кадрів, рівна 4 кадрам в секунду, була обрана замість нуля, оскільки вона дозволяє зберігати відкритими всі з'єднання (NetStream, Socket і NetConnection). При встановленні значення, рівного нулю, будуть розірвані всі відкриті з'єднання. Частота оновлення, рівна 250 мс (4 кадри в секунду) була обрана, оскільки багато виробників пристроїв використовують цю частоту в якості частоти оновлення. Використання цього значення дозволяє підтримувати частоту кадрів середовища виконання приблизно на тому ж рівні, що і частота кадрів самого телефону.

Примітка. Коли Виконавча працює в сплячому режимі, властивість Stage.frameRate повертає частоту кадрів вихідного SWF-файлу, а не 4 к / с.

Коли підсвічування знову переводиться в активний режим, візуалізація відновлюється. Для частоти кадрів відновлюється вихідне значення. Розглянемо додаток мультимедійного програвача, в якому користувач відтворює музику. Якщо екран переходить в сплячий режим, Виконавча реагує в залежності від типу відтворюваного вмісту. Далі наводиться список ситуацій, а також описано відповідну поведінку середовища виконання.

  • Підсвічування переходить в сплячий режим, відтворюється вміст, відмінне від A / V. Візуалізація призупиняється, встановлюється частота 4 кадри в секунду.

  • Підсвічування переходить в сплячий режим, відтворюється вміст A / V. Середовище виконання примусово включає підсвічування, забезпечуючи безперервне відтворення.

  • Підсвічування переходить із сплячого режиму в активний режим. Середовище виконання задає для таймера вихідний параметр таймера SWF-файлу і відновлює візуалізацію.

  • Програвач Flash Player припиняє роботу при відтворенні вмісту A / V. Програвач Flash Player відновлює для стану підсвічування системне поведінка за умовчанням, оскільки вміст A / V більше не відтворюється.

  • Мобільний пристрій отримує виклик при відтворенні вмісту A / V. Візуалізація призупиняється, встановлюється частота 4 кадри в секунду.

  • Сплячий режим підсвічування відключений в мобільному пристрої. Середовище виконання працює в звичайному режимі.

Коли для підсвічування включається сплячий режим, візуалізація призупиняється і частота кадрів зменшується. Ця функція дозволяє знизити завантаження ЦП, але на неї не можна покладатися при створенні дійсної паузи, наприклад в ігровому додатку.

Примітка. Коли Виконавча переходить в сплячий режим або виходить з нього, події ActionScript не потрапляють.

Заморожування і розморожування об'єктів

Для оптимізації коду завжди заморожувати і розморожувати об'єкти. Заморожування і розморожування особливо важливі для екранних об'єктів. Навіть якщо екранні об'єкти більше не включені в список відображення і очікують видалення при складанні сміття, вони як і раніше можуть використовувати код, що впливає на завантаження ЦП. Наприклад, вони як і раніше можуть використовувати подія Event.ENTER_FRAME. Таким чином, дуже важливо правильно заморожувати і розморожувати об'єкти. Для цього використовуйте події Event.REMOVED_FROM_STAGE і Event.ADDED_TO_STAGE. Нижче показаний код фрагмента ролика, що програється в робочій області, з функціями управління з клавіатури.

// Listen to keyboard events stage.addEventListener (KeyboardEvent.KEY_DOWN, keyIsDown); stage.addEventListener (KeyboardEvent.KEY_UP, keyIsUp); // Create object to store key states var keys: Dictionary = new Dictionary (true); function keyIsDown (e: KeyboardEvent): void {// Remember that the key was pressed keys [e.keyCode] = true; if (e.keyCode == Keyboard.LEFT || e.keyCode == Keyboard.RIGHT) {runningBoy.play (); }} Function keyIsUp (e: KeyboardEvent): void {// Remember that the key was released keys [e.keyCode] = false; for each (var value: Boolean in keys) if (value) return; runningBoy.stop (); } RunningBoy.addEventListener (Event.ENTER_FRAME, handleMovement); runningBoy.stop (); var currentState: Number = runningBoy.scaleX; var speed: Number = 15; function handleMovement (e: Event): void {if (keys [Keyboard.RIGHT]) {e.currentTarget.x + = speed; e.currentTarget.scaleX = currentState; } Else if (keys [Keyboard.LEFT]) {e.currentTarget.x - = speed; e.currentTarget.scaleX = -currentState; }}

При натисканні кнопки «Видалити» фрагмент ролика видаляється зі списку відображення.

// Show or remove running boy showBtn.addEventListener (MouseEvent.CLICK, showIt); removeBtn.addEventListener (MouseEvent.CLICK, removeIt); function showIt (e: MouseEvent): void {addChild (runningBoy); } Function removeIt (e: MouseEvent): void {if (contains (runningBoy)) removeChild (runningBoy); }

Навіть після видалення зі списку відображення фрагмент ролика і раніше відправляє подія Event.ENTER_FRAME. Фрагмент ролика все ще виконується, але не візуалізується. У цій ситуації необхідно прослуховувати відповідні події і видаляти прослуховувачі, щоб код, що підвищує навантаження на ЦП, вже не виконувався.

// Listen to Event.ADDED_TO_STAGE and Event.REMOVED_FROM_STAGE runningBoy.addEventListener (Event.ADDED_TO_STAGE, activate); runningBoy.addEventListener (Event.REMOVED_FROM_STAGE, deactivate); function activate (e: Event): void {// Restart everything e.currentTarget.addEventListener (Event.ENTER_FRAME, handleMovement); } Function deactivate (e: Event): void {// Freeze the running boy - consumes fewer CPU resources when not shown e.currentTarget.removeEventListener (Event.ENTER_FRAME, handleMovement); e.currentTarget.stop (); }

При натисканні на кнопку «Показати» відтворення відновлюється, знову прослуховуються події Event.ENTER_FRAME, а управління роликом з клавіатури працює коректно.

Примітка. Якщо екранний об'єкт видаляється зі списку відображення, завдання для відповідного посилання значення null після його видалення не забезпечує заморожування об'єкта. Якщо збирач сміття не запускається, об'єкт продовжує використовувати ресурси пам'яті і ЦП, навіть якщо об'єкт більше не відображається. Щоб об'єкт використовував мінімум ресурсів ЦП, переконайтеся, що він повністю заморожений при видаленні зі списку відображення.

Починаючи з версій Flash Player 10 і AIR 1.5 реалізовано наступне поведінка. Якщо точка відтворення виявляє порожній кадр, екранний об'єкт заморожується автоматично, навіть якщо розробник не реалізував поведінку заморожування.

Принцип заморожування також важливий при завантаженні віддаленого вмісту з використанням класу Loader. При використанні класу Loader в програвачі Flash Player 9 і AIR 1.0 потрібно було вручну розморожувати вміст шляхом прослуховування події Event.UNLOAD, відправленого об'єктом LoaderInfo. Кожен об'єкт потрібно було розморожувати вручну, що було нетривіальним завданням. У програвачах Flash Player 10 і AIR 1.5 в класі Loader представлений новий важливий метод unloadAndStop (). Цей метод дозволяє вивантажити SWF-файл, автоматично розморозити кожен об'єкт в завантаженому SWF-файлі і примусово запустити виконання збірки сміття.

У наступному коді SWF-файл завантажується, а потім вивантажується з використанням методу unload (), що вимагає додаткової обробки і заморожування вручну.

var loader: Loader = new Loader (); loader.load (new URLRequest ( "content.swf")); addChild (loader); stage.addEventListener (MouseEvent.CLICK, unloadSWF); function unloadSWF (e: MouseEvent): void {// Unload the SWF file with no automatic object deactivation // All deactivation must be processed manually loader.unload (); }

Найкращим прийомом є використання методу unloadAndStop (), в якому передбачені внутрішня обробка заморожування і примусове включення процесу складання сміття.

var loader: Loader = new Loader (); loader.load (new URLRequest ( "content.swf")); addChild (loader); stage.addEventListener (MouseEvent.CLICK, unloadSWF); function unloadSWF (e: MouseEvent): void {// Unload the SWF file with automatic object deactivation // All deactivation is handled automatically loader.unloadAndStop (); }

При виклику методу unloadAndStop () виконуються наступні дії.

  • Зупиняється відтворення звуку.

  • Прослуховувачі, зареєстровані для основної часової шкали SWF-файлу, видаляються.

  • Об'єкти таймера зупиняються.

  • Апаратні периферійні пристрої (наприклад, камера і мікрофон) звільняються.

  • Кожен фрагмент ролика зупиняється.

  • Відправлення подій Event.ENTER_FRAME, Event.FRAME_CONSTRUCTED, Event.EXIT_FRAME, Event.ACTIVATE і Event.DEACTIVATE зупиняється.

Активація та відключення подій

Дві події (Event.ACTIVATE і Event.DEACTIVATE) допоможуть налаштувати додаток таким чином, щоб для нього було потрібно якомога менше ресурсів ЦП. Ці події дозволяють виявити, коли Виконавча отримує або втрачає фокус. Таким чином, код можна оптимізувати відповідно до змін контексту. Наступний код прослуховує обидві події і динамічно змінює частоту кадрів до нуля, коли додаток втрачає фокус. Наприклад, додаток може втратити фокус, якщо користувач перейде на іншу вкладку або перемістить додаток на задній план.

var originalFrameRate: uint = stage.frameRate; var standbyFrameRate: uint = 0; stage.addEventListener (Event.ACTIVATE, onActivate); stage.addEventListener (Event.DEACTIVATE, onDeactivate); function onActivate (e: Event): void {// restore original frame rate stage.frameRate = originalFrameRate; } Function onDeactivate (e: Event): void {// set frame rate to 0 stage.frameRate = standbyFrameRate; }

Коли додаток знову отримує фокус, відновлюється вихідне значення частоти кадрів. Замість значного зміни частоти кадрів можна застосувати інші способи оптимізації, наприклад заморожування і розморожування об'єктів.

За допомогою активації і відключення подій можна реалізувати аналогічний механізм для функції паузи і відновлення, яка іноді зустрічається на мобільних пристроях і нетбуках.

Взаємодія з мишею

При роботі з інтерактивним об'єктом, таким як фрагмент ролика або спрайт, Виконавча виконує власний код для виявлення і обробки взаємодії з мишею. Якщо на екрані багато інтерактивних об'єктів, тим більше якщо вони накладені один на одного, виявлення взаємодії з мишею вимагає значних ресурсів ЦП. Щоб уникнути непотрібної обробки, вимкніть взаємодія з мишею об'єктів, яким воно не потрібно. Нижче показано використання в коді властивостей mouseEnabled і mouseChildren.

// Disable any mouse interaction with this InteractiveObject myInteractiveObject.mouseEnabled = false; const MAX_NUM: int = 10; // Create a container for the InteractiveObjects var container: Sprite = new Sprite (); for (var i: int = 0; i <MAX_NUM; i ++) {// Add InteractiveObject to the container container.addChild (new Sprite ()); } // Disable any mouse interaction on all the children container.mouseChildren = false;

Відключення взаємодії з мишею економить ресурси ЦП, а отже, і акумулятора на мобільних пристроях, тому по можливості відключайте його.

Порівняння таймерів з подіями ENTER_FRAME

Для неанімірованние вмісту, що виконується протягом тривалого часу, таймери краще подій Event.ENTER_FRAME.

В ActionScript 3.0 передбачено два способи виклику функції через певні інтервали. Перший - за допомогою події Event.ENTER_FRAME, що відправляється екранними об'єктами (DisplayObject). Другий - за допомогою таймера. Розробники ActionScript часто використовують перший спосіб (подія ENTER_FRAME). Подія ENTER_FRAME відправляється в кожному кадрі, тому інтервал виклику функції залежить від поточної частоти кадрів. Частота кадрів задається властивістю Stage.frameRate. Однак в ряді випадків краще використовувати таймер, ніж подія ENTER_FRAME. Наприклад, якщо у вас немає анімації, але вам потрібно, щоб код викликався через задані інтервали, слід використовувати таймер.

Таймер діє подібно події ENTER_FRAME, проте подія може відправлятися без прив'язки до частоти кадрів. Така поведінка дає простір для оптимізації. Розглянемо як приклад програвач відео. У цьому випадку висока частота кадрів не потрібна, так як рух контролюється тільки додатком.

Примітка. Частота кадрів не впливає на відео, тому що, відео вбудовано в тимчасову шкалу. Замість цього відео завантажується динамічно, шляхом послідовної завантаження або потокового відео.

У цьому прикладі частота кадрів становить 10 к / с. Таймер оновлює елементи управління з частотою раз в секунду. Метод updateAfterEvent () об'єкта TimerEvent дозволяє підвищити частоту оновлення. Цей метод викликає оновлення екрану при кожній відправці події. Це проілюстровано в наступному коді.

// Use a low frame rate for the application stage.frameRate = 10; // Choose one update per second var updateInterval: int = 1000; var myTimer: Timer = new Timer (updateInterval, 0); myTimer.start (); myTimer.addEventListener (TimerEvent.TIMER, updateControls); function updateControls (e: TimerEvent): void {// Update controls here // Force the controls to be updated on screen e.updateAfterEvent (); }

Виклик методу updateAfterEvent () НЕ змінює частоту кадрів. ВІН просто змушує середу Виконання оновлюваті на екрані Зміни вмісту. Тимчасова шкала як и Ранее оновлюється з частотою 10 к / с. Майте на увазі, что точність таймерів і подій ENTER_FRAME может зніжуватіся при віконанні на нізкопроїзводітельніх прилаштувати або у випадка, коли Функції обробніка подій містять код, что требует інтенсівної ОБРОБКИ. Як і частота кадрів SWF-файлу, частота оновлення кадрів таймера може залежати від ряду факторів.

Кожен кадр середовища виконання відправляє подія enterFrame всім екранним об'єктів зі списку відображення. Можна зареєструвати прослуховувачі події enterFrame і для декількох екранних об'єктів, проте це призведе до збільшення обсягу коду, що виконується в кожному кадрі. Замість цього використовуйте єдиний централізований обробник enterFrame для виконання всього обсягу коду в кожному кадрі. Централізація коду полегшить управління часто виконуваних кодом.

Аналогічним чином виглядає ситуація і з об'єктами Timer. Створення та надсилання подій безліччю об'єктів Timer сильно навантажують код. Якщо необхідно запустити різні операції з різними інтервалами, нижче наводяться деякі рекомендовані альтернативні варіанти:

  • Скоротіть до мінімуму кількість об'єктів Timer і групових операцій в залежності від частоти їх виконання.

    Наприклад, використовуйте екземпляр Timer для частих операцій, які необхідно виконувати кожні 100 мілісекунд. Потім використовуйте ще один екземпляр Timer для частих операцій, які необхідно виконувати менш часто, кожні 2000 мілісекунд.

  • Використовуйте єдине об'єкт Timer, в якому період виконання різних операцій заданий у властивості delay.

    Наприклад, необхідно, щоб одні операції виконувалися кожні 100 мілісекунд, а інші - кожні 200 мілісекунд. У цьому випадку використовуйте один об'єкт Timer, властивість delay якого налаштоване на 100 мілісекунд. У обробнику подій timer додайте умовну конструкцію, після чого кожна друга операція буде виконуватися з інтервалом 200 мілісекунд. Наступний приклад ілюструє такий підхід:

    var timer: Timer = new Timer (100); timer.addEventListener (TimerEvent.Timer, timerHandler); timer.start (); var offCycle: Boolean = true; function timerHandler (event: TimerEvent): void {// Do things that happen every 100 ms if (! offCycle) {// Do things that happen every 200 ms} offCycle =! offCycle; }

Якщо обробник події timer об'єкта Timer виконує операції тільки за певних умов, викличте метод stop () об'єкта Timer, якщо жодна з умов не приймає значення true.

У кожному кадрі в фазі візуалізації проводиться перерисовка змінилися елементів робочої області. Якщо область перемальовування велика, або якщо область перемальовування невелика, але містить безліч складних екранних об'єктів, середовищі виконання потрібно більше часу для візуалізації. Щоб дізнатися обсяг перемальовування, скористайтеся функцією «Показати область перемальовування» в отладчике програвача Flash Player або AIR.

Додаткові відомості про поліпшення продуктивності повторюваних дій див. У наступних статтях.

ознака анімації

Дизайнери і розробники, які створюють Flash-додатки для настільних комп'ютерів, часто використовують анімацію руху. При створенні вмісту для мобільних пристроїв намагайтеся звести анімацію до мінімуму. Без анімації додатки буде швидше працювати на нізкопроїзводітельних пристроях.