Minimalizacja wykorzystania procesora

Innym istotnym zagadnieniem optymalizacji jest wykorzystanie procesora. Optymalizacja przetwarzania na procesorze zwiększa wydajność, a w rezultacie wydłuża trwałość baterii urządzeń mobilnych.

Udoskonalenia programu Flash Player 10.1 w zakresie wykorzystania procesora

W programie Flash Player 10.1 wprowadzono dwie nowe funkcje, które umożliwiają ograniczenie użycia procesora. Dostępne funkcje obejmują wstrzymywanie i wznawianie odtwarzania zawartości plików SWF zależnie od tego, czy jest widoczna na ekranie, a także ograniczanie liczby wystąpień programu Flash Player na stronę.

Wstrzymywanie, zmniejszanie przepustowości i wznawianie

Uwaga: Funkcja wstrzymywania, zmniejszania przepustowości i wznawiania nie ma zastosowania do aplikacjach Adobe® AIR®.

W celu zoptymalizowania obciążenia procesora i zmniejszenia poboru mocy w programie Flash Player 10.1 wprowadzono nową funkcję związaną z nieaktywnymi wystąpieniami. Ta funkcja umożliwia ograniczenie wykorzystania procesora poprzez wstrzymywanie odtwarzania pliku SWF, gdy treść znika z ekranu, a następnie wznowienie — gdy treść pojawia się na ekranie. Dzięki tej funkcji program Flash Player zwalnia maksymalną ilość pamięci, usuwając obiekty, które mogą zostać odtworzone po wznowieniu odtwarzania treści. Treść jest traktowana jako niewidoczna na ekranie, gdy nie jest widoczny żaden jej fragment.

Istnieją dwa scenariusze, które powodują, że treść SWF nie jest widoczna na ekranie:

  • Użytkownik przewija stronę i powoduje, że treść SWF przesuwa się poza ekran.

    W tym przypadku, jeśli odtwarzany jest dźwięk lub wideo, będzie ono kontynuowane, ale renderowanie zostanie zatrzymane. Jeśli nie jest odtwarzany żaden dźwięk ani wideo, należy ustawić parametr HTML hasPriority na wartość true, aby upewnić się, że nie wstrzymano odtwarzania ani wykonywania kodu ActionScript. Jednak należy pamiętać, że gdy treść zostanie ukryta lub przesunięta poza ekran, renderowanie treści SWF zostanie wstrzymane — bez względu na wartość parametru HTML hasPriority .

  • W przeglądarce zostaje otwarta inna karta, co powoduje, że treść SWF przesuwa się na drugi plan.

    W takim przypadku — niezależnie od wartości znacznika HTML hasPriority — odtwarzanie zawartości SWF jest spowalniane do 2–8 klatek na sekundę (następuje zmniejszenie przepustowości ). Zostanie zatrzymane odtwarzanie dźwięku i wideo oraz nie będzie przetwarzane żadne renderowanie zawartości, dopóki zawartość SWF nie stanie się ponownie widoczna.

W programie Flash Player 11.2 lub nowszym uruchomionym w przeglądarkach w systemach Windows i Mac można używać w aplikacjach zdarzenia ThrottleEvent. Program Flash Player wywołuje zdarzenie ThrottleEvent, gdy następuje wstrzymanie, zmniejszenie przepustowości lub wznowienie odtwarzania w programie Flash Player.

Jest to zdarzenie ThrottleEvent, co oznacza, że zostanie ono wywołane przez wszystkie obiekty EventDispatcher, których detektor jest zarejestrowany dla tego zdarzenia. Więcej informacji o zdarzeniach broadcast zawiera opis klasy DisplayObject .

Zarządzanie instancjami

Uwaga: Funkcja zarządzania wystąpieniami nie ma zastosowania do aplikacji Adobe® AIR®.
Parametr HTML hasPriority umożliwia opóźnienie ładowania plików SWF niewidocznych na ekranie.

W programie Flash Player 10.1 wprowadzono nowy parametr HTML o nazwie hasPriority :

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

Ten parametr ogranicza liczbę instancji programu Flash Player, jakie są uruchamiane na stronie. Ograniczenie liczby instancji umożliwia minimalizację wykorzystania procesora i baterii. Idea tego parametru jest następująca: do treści SWF należy przypisać określony priorytet, przydzielając w ten sposób pierwszeństwo danej treści wobec pozostałych treści na stronie. Rozważmy prosty przykład: użytkownik przegląda witrynę sieci Web, a strona indeksu zawiera trzy różne pliki SWF. Jeden z nich jest widoczny, drugi jest częściowo widoczny na ekranie, a trzeci nie jest widoczny (konieczne jest przewijanie). Pierwsze dwie animacje są uruchamiane w normalny sposób, ale ostatnia jest opóźniana do momentu, aż stanie się widoczna. Ten scenariusz jest domyślnym sposobem działania, gdy parametr hasPriority jest niedostępny lub ustawiony na false . Aby mieć pewność, że plik SWF zostanie uruchomiony, nawet jeśli jest niewidoczny na ekranie, należy ustawić parametr hasPriority na true . Jednak bez względu na wartość parametru hasPriority , renderowanie pliku SWF, który nie jest widoczny dla użytkownika, jest zawsze wstrzymane.

Uwaga: Jeśli zmniejszy się dostępność zasobów procesora, instancje programu Flash Player nie będą uruchamiane automatycznie, nawet jeśli parametr hasPriority zostanie ustawiony na true . Jeśli nowe instancje będą tworzone za pomocą kodu JavaScript po załadowaniu strony, będą one ignorowały flagę hasPriority . Jeśli administrator strony sieci Web nie uwzględni flagi hasPriority , uruchomiona zostanie każda treść o rozmiarach 1x1 i 0x0 pikseli, co zapobiegnie opóźnianiu plików pomocniczych SWF. Jednak kliknięcie pliku SWF nadal powoduje jego uruchomienie. Takie zachowanie jest określane jako „kliknij, aby odtworzyć”.

Poniższe diagramy przedstawiają wpływ ustawienia parametru hasPriority na różne wartości:

Wpływ różnych wartości parametru hasPriority

Wpływ różnych wartości parametru hasPriority

Tryb uśpienia

W programie Flash Player 10.1 i środowisku AIR 2.5 wprowadzono nową funkcję dostępną na urządzeniach przenośnych, która ogranicza użycie procesora, a w rezultacie wydłuża czas pracy przy zasilaniu akumulatorowym. Ta funkcja steruje podświetleniem ekranu dostępnym w wielu urządzeniach przenośnych. Jeśli na przykład użytkownik korzystający z aplikacji na urządzeniu przenośnym przestanie używać urządzenia, środowisko wykonawcze wykryje przejście podświetlenia w tryb uśpienia. Nastąpi wtedy zmniejszenie szybkości odtwarzania do 4 klatek na sekundę i wstrzymanie renderowania. W przypadku aplikacji AIR tryb uśpienia jest również uaktywniany w momencie, gdy aplikacja przechodzi do działania w tle.

Kod ActionScript będzie nadal wykonywany w trybie uśpienia, podobnie jak przy właściwości Stage.frameRate ustawiona na 4 klatki na sekundę. Jednak krok renderowania zostanie pominięty, dlatego użytkownik nie będzie mógł zobaczyć, że odtwarzacz faktycznie odtwarza z szybkością 4 klatek na sekundę. Wybrano 4 klatki na sekundę zamiast zera, ponieważ taka wartość umożliwia zachowanie wszystkich połączeń jako otwartych (NetStream, Socket i NetConnection). Przełączenie na zero spowodowałoby przerwanie wszystkich otwartych połączeń. Wybrano częstotliwość odświeżania równą 250 ms (4 klatki na sekundę), ponieważ wielu producentów urządzeń stosuje taką szybkość odtwarzania jako częstotliwość odświeżania. Użycie tej wartości powoduje utrzymanie szybkości odtwarzania środowiska wykonawczego w zakresie stosowanym na urządzeniu.

Uwaga: Gdy środowisko wykonawcze działa w trybie uśpienia, właściwość Stage.frameRate odpowiada szybkości odtwarzania oryginalnego pliku SWF — nie jest to wartość 4 klatek na sekundę.

Po ponownym włączeniu podświetlenia ekranu renderowanie jest wznawiane. Liczba klatek na sekundę wraca do wartości wyjściowej. Rozważmy odtwarzacz multimediów, w którym użytkownik odtwarza muzykę. Jeśli ekran zostanie przełączony w tryb uśpienia, środowisko wykonawcze będzie reagować odpowiednio do typu odtwarzanej zawartości. Oto lista sytuacji i odpowiadających im działań środowiska wykonawczego:

  • Podświetlenie przechodzi w tryb uśpienia, a odtwarzana zawartość jest inna niż audio/wideo: Renderowanie zostaje wstrzymane, a szybkość odtwarzania zostaje ustawiona na 4 klatki na sekundę.

  • Podświetlenie przechodzi w tryb uśpienia i jest odtwarzana zawartość audio/wideo: Środowisko wykonawcze wymusza stałe działanie podświetlenia, dzięki czemu użytkownik może kontynuować korzystanie z aplikacji.

  • Podświetlenie przechodzi z trybu uśpienia do trybu włączenia: Środowisko wykonawcze przestawia szybkość odtwarzania na zgodną z ustawieniem pierwotnym dla pliku SWF i wznawia renderowanie.

  • Działanie programu Flash Player zostało wstrzymane podczas odtwarzania zawartości audio/wideo: Program Flash Player zeruje stan podświetlenia (ustawia zachowanie domyślne w systemie), ponieważ zawartość audio/wideo nie jest już odtwarzana.

  • Użytkownik urządzenia przenośnego odbiera połączenie telefoniczne podczas odtwarzania zawartości audio/wideo: Renderowanie zostaje wstrzymane, a szybkość odtwarzania zostaje ustawiona na 4 klatki na sekundę.

  • Tryb uśpienia podświetlenia zostaje wyłączony na urządzeniu przenośnym: Środowisko wykonawcze działa normalnie.

Gdy podświetlenie przechodzi w tryb uśpienia, renderowanie zostaje wstrzymane, a szybkość odtwarzania jest redukowana. Takie działanie zmniejsza obciążenie procesora, ale nie można traktować wstrzymania jako prawdziwej pauzy (jak w grze).

Uwaga: Przy aktywacji lub wyłączeniu trybu uśpienia środowiska wykonawczego nie jest wywoływane żadne zdarzenie ActionScript.

Wstrzymywanie i aktywowanie obiektów

W celu poprawnego wstrzymywania i aktywowania obiektów należy posłużyć się zdarzeniami REMOVED_FROM_STAGE i ADDED_TO_STAGE .

W celu optymalizacji kodu zawsze należy wstrzymywać i aktywować obiekty. Wstrzymywanie i aktywowanie jest istotne dla wszystkich obiektów, ale przede wszystkim dla obiektów wyświetlanych. Nawet jeśli obiekty wyświetlane nie znajdują się na liście wyświetlania i oczekują na usunięcie przez proces czyszczenia pamięci, nadal mogą wymuszać wykonanie kodu intensywnie korzystającego z zasobów procesora. Na przykład nadal mogą korzystać ze zdarzenia Event.ENTER_FRAME. Dlatego poprawne wstrzymywanie i aktywowanie obiektów za pomocą zdarzeń Event.REMOVED_FROM_STAGE i Event.ADDED_TO_STAGE jest tak ważne. Poniższy przykład prezentuje klip filmowy odtwarzany na stole montażowym. Klip reaguje na czynności wykonywane z klawiatury:

// 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; 
    } 
}

Powiększ obraz
Klip filmowy reagujący na naciśnięcia klawiszy

Kliknięcie przycisku Remove powoduje usunięcie klipu filmowego z listy wyświetlania:

// 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); 
}

Po usunięciu z listy odtwarzania klip filmowy nadal wywołuje zdarzenie Event.ENTER_FRAME . Klip filmowy nadal działa, ale nie jest renderowany. W celu poprawnego obsłużenia tej sytuacji należy wykryć odpowiednie zdarzenia i usunąć detektory zdarzeń, aby nie dopuścić do wykonania kodu, który znacznie wykorzystuje zasoby procesora:

// 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(); 
}

Kliknięcie przycisku Show powoduje restart klipu filmowego, ponowne wykrywanie zdarzeń Event.ENTER_FRAME przez klip i sprawia, że klawiatura poprawnie kontroluje klip filmowy.

Uwaga: Jeśli obiekt wyświetlany zostanie usunięty z listy wyświetlania, wówczas ustawienie go na null po usunięciu nie zapewni wstrzymania tego obiektu. Jeśli proces czyszczenia pamięci nie zostanie uruchomiony, obiekt nadal będzie zużywał pamięć i zasoby procesora, nawet jeśli nie będzie już wyświetlany. Aby mieć pewność, że obiekt będzie zużywał możliwie jak najmniejszą ilość zasobów procesora, należy zadbać o to, aby przed usunięciem z listy wyświetlania obiekt został całkowicie wstrzymany.

W oprogramowaniu Flash Player 10 i AIR 1.5 oraz w nowszych wersjach występują również następujące zachowania: Jeśli głowica odtwarzania napotyka pustą klatkę, obiekt wyświetlany jest automatycznie wstrzymywany, nawet jeśli użytkownik nie zaimplementował żadnego działania wstrzymania.

Koncepcja wstrzymania jest również istotna w przypadku wczytywania zdalnej zawartości za pomocą klasy Loader. W przypadku stosowania klasy Loader w programie Flash Player 9 i środowisku AIR 1.0 konieczne było ręczne wstrzymanie zawartości przez wykrycie zdarzenia Event.UNLOAD wywołanego przez obiekt LoaderInfo. Konieczne było ręczne wstrzymanie każdego obiektu, co nie było prostym zadaniem. W programie Flash Player 10 i środowisku AIR 1.5 wprowadzono istotną nową metodę klasy Loader o nazwie unloadAndStop() . Ta metoda pozwala na usunięcie pliku SWF, automatyczne wstrzymanie każdego obiektu w załadowanym pliku SWF oraz wymuszenie uruchomienia procesu czyszczenia pamięci.

W poniższym kodzie plik SWF jest ładowany, a następnie usuwany za pomocą metody unload() , co wymaga większego dodatkowego przetwarzania i ręcznego wstrzymania:

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(); 
}

Dobrą praktyką jest użycie metody unloadAndStop() , która rodzimie obsługuje wstrzymywanie i wymusza uruchomienie procesu czyszczenia pamięci:

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(); 
}

Wywołanie metody unloadAndStop() powoduje wykonanie następujących operacji:

  • Dźwięki zostają zatrzymane.

  • Detektory zarejestrowane w głównej osi czasu pliku SWF zostają usunięte.

  • Obiekty czasomierza zostają zatrzymane.

  • Urządzenia peryferyjne (takie jak aparat i mikrofon) zostają zwolnione.

  • Wszystkie klipy filmowe zostają zatrzymane.

  • Wywoływanie zdarzeń Event.ENTER_FRAME , Event.FRAME_CONSTRUCTED , Event.EXIT_FRAME , Event.ACTIVATE i Event.DEACTIVATE zostaje zatrzymane.

Zdarzenia activate i deactivate

Korzystając ze zdarzeń Event.ACTIVATE i Event.DEACTIVATE , można wykrywać bezczynność programów działających w tle i odpowiednio optymalizować aplikację.

Dwa zdarzenia ( Event.ACTIVATE i Event.DEACTIVATE ) pozwalają dostosować aplikację tak, aby używała możliwie najmniejszej liczby cykli procesora. Zdarzenia te umożliwiają wykrywanie, kiedy środowisko wykonawcze staje się aktywne i nieaktywne. Pozwala to zoptymalizować kod, aby reagował na zmiany kontekstu. Poniższy kod wykrywa oba wymienione zdarzenia i dynamicznie zmniejsza liczbę klatek na sekundę do zera, gdy aplikacja przestaje być aktywna. Animacja może na przykład przestać być aktywna, gdy użytkownik zmieni zakładkę lub przeniesie aplikację do tła.

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; 
}

Gdy aplikacja staje się ponownie aktywna, następuje wyzerowanie szybkości odtwarzania — przywrócenie pierwotnej wartości. Zamiast dynamicznie zmieniać szybkość odtwarzania, można rozważyć inne optymalizacje, takie jak wstrzymywanie i uaktywnianie obiektów.

Zdarzenia activate i deactivate umożliwiają zaimplementowanie mechanizmu podobnego do funkcji wstrzymywania i wznawiania dostępnej niekiedy na urządzeniach przenośnych i netbookach.

Działania wykonywane za pomocą myszy

Jeśli to możliwe, należy rozważyć wyłączenie działań wykonywanych za pomocą myszy.

W przypadku korzystania z obiektu interaktywnego, na przykład klasy MovieClip lub Sprite, środowisko wykonawcze wykonuje kod macierzysty w celu wykrywania i obsługiwania działań wykonywanych za pomocą myszy. Wykrywanie działań wykonywanych za pomocą myszy może znacznie obciążać procesor, szczególnie wówczas, gdy na ekranie znajduje się wiele interaktywnych obiektów, które na siebie nachodzą. Łatwą metodą ograniczenia przetwarzania jest wyłączenie działań wykonywanych za pomocą myszy dotyczących obiektów, które nie wymagają żadnych takich działań. Poniższy kod ilustruje użycie właściwości mouseEnabled i 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;

Jeśli jest to możliwe, należy rozważyć wyłączenie działań wykonywanych za pomocą myszy. Dzięki temu aplikacja będzie zużywać mniej zasobów procesora, co wydłuży czas działania urządzeń przenośnych przy zasilaniu akumulatorowym.

Czasomierze i zdarzenia ENTER_FRAME

W zależności od tego, czy treść jest animowana, należy wykorzystywać czasomierze lub zdarzenia ENTER_FRAME .

W przypadku treści, która nie jest animowana i jest wykonywana przez długi czas, preferowane są czasomierze zamiast zdarzeń Event.ENTER_FRAME .

W języku ActionScript 3.0 istnieją dwa sposoby wywoływania funkcji w konkretnych odstępach czasu. Pierwszy sposób polega na używaniu zdarzenia Event.ENTER_FRAME wywoływanego przez obiekty ekranowe (wystąpienia klasy DisplayObject). Drugi z nich zakłada wykorzystanie czasomierza. Programiści pracujący w kodzie ActionScript często korzystają ze zdarzenia ENTER_FRAME . Zdarzenie ENTER_FRAME jest wywoływane w każdej klatce. W rezultacie częstotliwość wywoływania funkcji jest powiązana z bieżącą liczbą klatek na sekundę. Liczbę klatek na sekundę można określić na podstawie właściwości Stage.frameRate . Jednak w niektórych przypadkach zastosowanie czasomierza może być lepszym rozwiązaniem niż zastosowanie zdarzenia ENTER_FRAME . Na przykład: jeśli nie jest stosowana animacja, ale wymagane jest wywoływanie kodu z określoną częstotliwością, wówczas zastosowanie czasomierza będzie lepszym rozwiązaniem.

Czasomierz może działać w sposób podobny do zdarzenia ENTER_FRAME , ale zdarzenie może być wywoływane bez związku z liczbą klatek na sekundę. Ten sposób działania może zapewniać pewne istotne korzyści w zakresie optymalizacji. Rozważmy przykładową aplikację, która jest odtwarzaczem wideo. W tym przypadku nie ma potrzeby stosowania wysokiej liczby klatek na sekundę, ponieważ ruchome są tylko elementy służące do sterowania aplikacją.

Uwaga: Liczba klatek na sekundę nie wpływa na wideo, ponieważ wideo nie jest osadzone w osi czasu. Zamiast tego wideo jest ładowane dynamicznie poprzez progresywne ładowanie lub przesyłanie strumieniowe.

W tym przykładzie liczba klatek na sekundę jest ustawiona na niską wartość: 10. Czasomierz aktualizuje elementy sterujące jeden raz na sekundę. Wyższa częstotliwość aktualizacji jest możliwa dzięki metodzie updateAfterEvent() , która jest dostępna w obiekcie TimerEvent. Ta metoda wymusza aktualizację ekranu za każdym razem, gdy czasomierz wywołuje zdarzenie (w razie potrzeby). To rozwiązanie przedstawia poniższy kod:

// 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(); 
}

Wywołanie metody updateAfterEvent() nie powoduje modyfikacji liczby klatek na sekundę. Wymusza na środowisku wykonawczym aktualizację tej zawartości na ekranie, która uległa zmianie. Oś czasu nadal działa z liczbą 10 klatek na sekundę. Należy pamiętać o tym, że czasomierze i zdarzenia ENTER_FRAME nie są idealnie dokładne na urządzeniach o niskiej wydajności ani wówczas, gdy procedury obsługi zdarzeń zawierają kod znacznie wykorzystujący zasoby procesora. Częstotliwość aktualizacji czasomierza — podobnie jak liczba klatek na sekundę pliku SWF — może się różnić w niektórych sytuacjach.

Minimalizowanie liczby obiektów Timer i zarejestrowanych procedur obsługi enterFrame w aplikacji.

W każdej klatce środowisko wykonawcze wywołuje zdarzenie enterFrame dla każdego obiektu wyświetlanego z listy wyświetlanej. Mimo, że możliwe jest rejestrowanie detektorów dla zdarzenia enterFrame z wieloma obiektami wyświetlanymi, jednak taka metoda rejestrowania oznacza, że w każdej klatce wykonywana jest większa ilość kodu. Zamiast tego należy rozważyć zastosowanie pojedynczej procedury obsługi enterFrame , która wykona cały kod, jaki ma być wykonywany w każdej klatce. Scentralizowanie tego kodu ułatwia zarządzanie całością kodu, który jest często uruchamiany.

I podobnie — jeśli używane są obiekty Timer, istnieje narzut powiązany z tworzeniem i wywoływaniem zdarzeń z wielu obiektów Timer. Jeśli konieczne jest uruchomienie różnych operacji w różnych odstępach czasu, proponowane są następujące rozwiązania:

  • Należy użyć minimalnej liczby operacji dotyczących obiektów Timer i grup odpowiednio do częstotliwości ich wykonywania.

    Na przykład: należy użyć jednego obiektu Timer dla często wykonywanych operacji i ustawić wyzwalanie z częstotliwością co 100 milisekund. Należy użyć innego obiektu Timer dla operacji wykonywanych z mniejszą częstotliwością i w tle oraz ustawić wyzwalanie co 2000 milisekund.

  • Należy użyć jednego obiektu Timer i wyzwalać operacje przy osiągnięciu określonej wielokrotności wartości właściwości delay obiektu Timer.

    Na przykład: załóżmy, że istnieją operacje, które wg oczekiwań będą wykonywane co 100 milisekund, oraz inne operacje, które będą wykonywane co 200 milisekund. W tym celu należy użyć pojedynczego obiektu Timer z wartością delay równą 100 milisekund. W procedurze obsługi zdarzenia timer należy dodać instrukcję warunkową, która będzie uruchamiała operacje wykonywane co 200 milisekund co drugi raz. Poniższy przykład demonstruje tę technikę:

    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; 
    }
Zatrzymywanie nieużywanych obiektów Timer.

Jeśli procedura obsługi timer obiektu Timer wykonuje operacje tylko w określonych warunkach, a żaden warunek nie jest spełniony, wówczas należy wywołać metodę stop() obiektu Timer.

W zdarzeniu enterFrame lub procedurach obsługi Timer należy zminimalizować liczbę zmian wyglądu wyświetlanego obiektu, które powodują konieczność ponownego wyświetlania ekranu.

W każdej klatce faza renderowania powoduje ponowne wyświetlenie części stołu montażowego, która uległa zmianie podczas tej klatki. Jeśli ponownie rysowany obszar jest duży lub jest mały, ale zawiera dużą liczbę obiektów albo złożone obiekty wyświetlane, wówczas środowisko wykonawcze wymaga dłuższego czasu na renderowanie. W celu sprawdzenia zakresu wymaganego renderowania należy użyć funkcji „Pokaż odrysowane obszary” w programie Flash Player w wersji z debugerem lub w środowisku AIR.

Więcej informacji na temat zwiększania wydajności często wykonywanych operacji zawiera następujący artykuł:

Obciążenia wywołane animacjami

W celu ograniczenia wykorzystania procesora należy ograniczyć stosowanie animacji. Efektem tego ograniczenia jest zmniejszone wykorzystanie procesora, pamięci operacyjnej i zwiększenie trwałości baterii.

Projektanci i programiści tworzący treść Flash na komputery stacjonarne często wykorzystują w aplikacjach wiele animacji ruchu. Podczas tworzenia treści przeznaczonych na urządzenia mobilne o niskiej wydajności należy zminimalizować stosowanie animacji ruchu. Ograniczenie ich stosowania ułatwia wykonywanie treści na urządzeniach o niższym stopniu zaawansowania.