Buforowanie obiektów ekranowych

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Ze zwiększaniem wielkości elementów w programie Flash — niezależnie od tego, czy tworzona jest aplikacja lub złożone animacje skryptowe — wiąże się konieczność pamiętania o wydajności i optymalizacji. Jeśli istnieje treść, która pozostaje statyczna (np. instancja Shape prostokąta), program Flash Player i środowisko AIR nie optymalizuje tej treści. Dlatego po zmianie położenia prostokąta program Flash Player lub środowisko AIR ponownie rysuje całą instancję Shape.

Istnieje możliwość zapisywania w pamięci podręcznej określonych obiektów wyświetlanych w celu zwiększenia wydajności pliku SWF. Obiekt wyświetlany jest powierzchnią — bitmapą danych wektorowych instancji. Tych danych nie należy zanadto zmieniać w całym cyklu życia pliku SWF. Dlatego instancje, dla których włączono zapisywanie w pamięci podręcznej, nie są w rzeczywistości ponownie rysowane podczas odtwarzania pliku SWF, dzięki czemu renderowanie pliku SWF jest szybsze.

Uwaga: Użytkownik może zaktualizować dane wektorowe, co powoduje odtworzenie powierzchni. Dlatego dane wektorowe zapisane w pamięci podręcznej powierzchni nie muszą pozostawać takie same w całym pliku SWF.

Ustawienie wartości true dla właściwości cacheAsBitmap obiektu wyświetlanego powoduje, że obiekt wyświetlany zapisany w pamięci podręcznej staje się bitmapową reprezentacją samego siebie. Program Flash Player lub środowisko AIR tworzy obiekt powierzchni dla instancji i jest to bitmapa zapisana w pamięci podręcznej, a nie dane wektorowe. Zmiana krawędzi obiektu wyświetlanego powoduje, że powierzchnia zostanie odtworzona, a jej wielkość nie zostaje zmieniona. Powierzchnie mogą być zagnieżdżane w innych powierzchniach. Powierzchnia podrzędna kopiuje swoją bitmapę do własnej powierzchni nadrzędnej. Więcej informacji zawiera sekcja Włączanie zapisywania w pamięci podręcznej dla bitmap .

Właściwości opaqueBackground i scrollRect klasy DisplayObject są powiązane z zapisywaniem bitmapy w pamięci podręcznej z wykorzystaniem właściwości cacheAsBitmap . Te trzy właściwości są niezależne od sobie, ale właściwości opaqueBackground i scrollRect działają najlepiej po zapisaniu obiektu w pamięci podręcznej w postaci bitmapy — zalety korzystania z właściwości opaqueBackground i scrollRect są widoczne tylko po ustawieniu dla właściwości cacheAsBitmap wartości true . Więcej informacji o przewijaniu treści obiektu wyświetlanego zawiera sekcja Panoramowanie i przewijanie obiektów wyświetlanych . Więcej informacji o ustawianiu nieprzezroczystego tła zawiera sekcja Ustawianie nieprzezroczystego koloru tła .

Informacje na temat maskowania kanałów alfa, co wymaga ustawienia wartości true dla właściwości cacheAsBitmap zawiera sekcja Maskowanie obiektów wyświetlanych .

Warunki, w jakich należy włączyć zapisywanie w pamięci podręcznej

Włączenie zapisywania w pamięci podręcznej dla obiektu wyświetlanego powoduje utworzenie powierzchni, co wiąże się z pewnymi korzyściami, takimi jak szybsze renderowanie złożonych animacji wektorowych. Istnieje kilka scenariuszy, w których włączenie zapisywania w pamięci jest pożądane. Może się wydawać, że włączenie zapisywania w pamięci podręcznej jest zawsze konieczne w celu zwiększenia wydajności plików SWF; jednak istnieją sytuacje, w których zapisywanie w pamięci podręcznej nie zwiększa wydajności, a nawet może ją pogarszać. W niniejszej sekcji przedstawiono scenariusze, w których zapisywanie w pamięci podręcznej powinno być stosowane. Przedstawiono również scenariusze, w których należy korzystać z normalnych obiektów wyświetlanych.

Całkowita wydajność danych zapisanych w pamięci podręcznej zależy od takich czynników jak złożoność danych wektorowych obiektów, intensywność zmian danych oraz ustawienie właściwości opaqueBackground . Jeśli zmiany dotyczą niewielkich obszarów, różnica między stosowaniem powierzchni i wykorzystywaniem danych wektorowych jest minimalna. Przed wdrożeniem aplikacji zalecane jest przetestowanie obydwu scenariuszy.

Warunki, w jakich należy korzystać z zapisywania w pamięci podręcznej

Poniżej wymieniono typowe scenariusze, w których zapisywanie bitmap w pamięci podręcznej może przynieść zauważalne korzyści.

  • Złożony obraz w tle: aplikacja, która zawiera szczegółowy i złożony obraz tła w postaci danych wektorowych (np. obraz, dla którego zastosowano polecenie obrysowania bitmapy albo obiekt graficzny utworzony w programie Adobe Illustrator®). Tło może zawierać animowane znaki, co znacznie spowalnia animację, ponieważ tło musi stale regenerować dane wektorowe. W celu zwiększenia wydajności należy ustawić dla właściwości opaqueBackground tła obiektu wyświetlanego wartość true . Tło zostanie zrenderowane jako bitmapa, dzięki czemu będzie można je szybko odświeżać; dzięki temu z kolei animacja będzie szybciej odtwarzana.

  • Przewijanie tekstu: aplikacja, która zawiera znaczną ilość tekstu w przewijanym polu tekstowym. Pole tekstowe można umieścić w obiekcie wyświetlanym ustawionym jako przewijalnie za pomocą przycisków do przewijania (właściwość scrollRect ). To umożliwia szybkie przewijanie pikselowe dla określonej instancji. Gdy użytkownik przewinie instancję obiektu wyświetlanego, program Flash Player lub środowisko AIR przesunie przewijane piksele w górę i wygeneruje nowy wyświetlany region — nie będzie generował od nowa całego pola tekstowego.

  • System z oknami: aplikacja ze złożonym systemem nachodzących na siebie okien. Każde z okien można zamknąć lub otworzyć (np. mogą to być okna przeglądarki). Jeśli każde okno zostanie oznaczone jako powierzchnia (poprzez ustawienie wartości true dla właściwości cacheAsBitmap ), każde okno zostanie odizolowane i zapisane w pamięci podręcznej. Użytkownicy będą mogli przeciągać okna, również nakładać je na siebie, przy czym nie będzie konieczności ponownego generowania wektorowej zawartości okien.

  • Maskowanie kanałów alfa: jeśli stosowane jest maskowanie kanałów alfa, należy ustawić dla właściwości cacheAsBitmap wartość true . Więcej informacji zawiera sekcja Maskowanie obiektów wyświetlanych .

Włączenie zapisywania bitmapy w pamięci podręcznej w każdym z tych scenariuszy zwiększa szybkość odpowiedzi i powiększa interaktywność aplikacji poprzez optymalizację grafiki wektorowej.

Ponadto zastosowanie filtru do obiektu wyświetlanego powoduje, że dla właściwości cacheAsBitmap automatycznie zostaje ustawiona wartość true , nawet jeśli użytkownik jawnie ustawi wartość false . Gdy wszystkie filtry obiektu wyświetlanego zostaną wyczyszczone, właściwość cacheAsBitmap uzyskuje wartość, którą ustawiono dla niej ostatnim razem.

Kiedy należy unikać buforowania bitmap?

Użycie tej funkcji w niewłaściwych okolicznościach może obniżyć wydajność pliku SWF. Jeśli stosowane jest zapisywanie bitmapy w pamięci podręcznej, należy pamiętać o poniższych wskazówkach:

  • Nie należy używać zbyt wielu powierzchni (obiekty wyświetlane, dla których włączono zapisywanie w pamięci podręcznej). Każda powierzchnia korzysta z większej ilości pamięci niż normalny obiekt wyświetlany, co oznacza, że należy włączać powierzchnie tylko wówczas, gdy wymagane jest przyspieszenie renderowania.

    Bitmapa zapisana w pamięci podręcznej może zużywać o wiele więcej pamięci niż zwykły klip filmowy. Na przykład: instancja Sprite na stole montażowym ma wielkość 250 x 250 pikseli, a po zapisaniu w pamięci podręcznej może zajmować 250 kB pamięci zamiast 1 kB — taką ilość pamięci zajmuje normalna instancja Sprite (nie zapisana w pamięci podręcznej).

  • Należy unikać powiększania powierzchni zapisanych w pamięci podręcznej. Zbyt intensywne stosowanie funkcji zapisywania bitmap w pamięci podręcznej przyczynia się do dużego obciążenia pamięci (zobacz poprzedni punkt), zwłaszcza w przypadku powiększania obiektów.

  • Powierzchnie należy stosować dla instancji obiektów wyświetlanych, które są głównie statyczne (nie animowane). Klip może być przeciągany lub przesuwany, ale jego zawartość nie powinna w zbyt dużym stopniu się zmieniać. (Animacja i zmiana treści jest bardziej prawdopodobna w przypadku instancji MovieClip zawierających animację lub instancję Video). Na przykład, jeśli klip zostanie obrócony lub przekształcony, niektóre dane powierzchni staną się danymi wektorowymi, co będzie miało negatywny wpływ na wydajność pliku SWF.

  • Przemieszanie danych powierzchni z danymi wektorowymi powoduje, że programy Flash Player i AIR (a czasami i inne programy na komputerze) muszą wykonywać zbyt wiele operacji przetwarzania. Powierzchnie należy w miarę możliwości grupować ze sobą — np. podczas tworzenia aplikacji z oknami.

  • Nie należy buforować obiektów, których grafika jest często zmieniana. Bufor bitmapy będzie rysowany ponownie podczas każdego skalowania, pochylania i obracania obiektu ekranowego, zmiany przezroczystości alfa, przekształcenia kolorów, przesuwania potomnych obiektów ekranowych lub rysowania za pomocą właściwości grafiki. Jeśli dzieje się tak co klatkę, środowisko wykonawcze musi rysować obiekt w bitmapie, a następnie kopiować bitmapę na stół montażowy. Oznacza to konieczność wykonania dodatkowych obliczeń w porównaniu do zwykłego rysowania na stole montażowym niebuforowanego obiektu. Różnica wydajności buforowania w stosunku do częstotliwości aktualizowania zależy od złożoności i rozmiaru obiektu ekranowego i można ją określić tylko przez testy konkretnej zawartości.

Włączanie zapisywania w pamięci podręcznej dla bitmap

Aby umożliwić zapisanie bitmapy w pamięci podręcznej w przypadku obiektu wyświetlanego, należy ustawić dla właściwości cacheAsBitmap wartość true :

mySprite.cacheAsBitmap = true;

Po ustawieniu dla właściwości cacheAsBitmap wartości true może się zdarzyć, że obiekt wyświetlany zostanie przyciągnięty (piksele) do współrzędnych całkowitych. Podczas testowania pliku SWF użytkownik zauważy, że animacja wykonywana w przypadku skomplikowanego obrazu wektorowego będzie renderowana szybciej.

Jeśli spełniony jest jeden z poniższych warunków, powierzchnia (bitmapa zapisana w pamięci podręcznej) nie zostanie utworzona, nawet jeśli dla właściwości cacheAsBitmap zostanie ustawiona wartość true :

  • Bitmapa ma wysokość lub szerokość większą niż 2880 pikseli.

  • Alokacja bitmapy nie powiodła się (z powodu braku pamięci).

Macierze przekształceń buforowanych bitmap

W aplikacjach AIR dla urządzeń przenośnych za każdym razem, gdy jest ustawiana właściwość cacheAsBitmap , należy ustawić właściwość cacheAsBitmapMatrix . Ustawienie tej właściwości umożliwia zastosowanie większej liczby przekształceń względem obiektu ekranowego bez wyzwolenia renderowania.

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

Podczas ustawiania tej właściwości macierzy można zastosować następujące dodatkowe przekształcenie obiektu ekranowego bez ponownego buforowania tego obiektu:

  • Przesunięcie lub konwersja bez przyciągania do pikseli

  • Obrót

  • Skala

  • Pochylenie

  • Zmiana wartości alfa (od 0 do 100% przezroczystości)

Te przekształcenia są stosowane bezpośrednio do buforowanej bitmapy.