Armazenamento em cache de objetos de exibição

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

Sempre que estiver aumentando o tamanho no Flash, seja para criar um aplicativo ou animações complexas com script, você precisa levar em conta o desempenho e a otimização. O Flash Player e o AIR não otimizam conteúdo que permanece estático (como uma ocorrência de Shape retangular). Desse modo, quando você altera a posição do retângulo, o Flash Player ou o AIR redesenha a ocorrência de Shape inteira.

Você pode armazenar os objetos de exibição especificados em cache para melhorar o desempenho do arquivo SWF. O objeto de exibição é uma superfície , basicamente uma versão de bitmap dos dados vetoriais da ocorrência, que são os dados que não devem mudar muito durante o fluxo do arquivo SWF. Portanto, as ocorrências com o cache ativado não são redesenhadas continuamente à medida que o arquivo SWF é reproduzido, o que aumenta a velocidade da renderização.

Nota: Você pode atualizar os dados vetoriais e, quando isso é feito, a superfície é recriada. Assim, os dados vetoriais armazenados em cache na superfície não precisam permanecer iguais para todo o arquivo SWF.

Se você definir a propriedade cacheAsBitmap do objeto de exibição como true , o cache do objeto de exibição será uma representação em bitmap do próprio objeto. O Flash Player ou o AIR criam um objeto de superfície para a ocorrência, que é um bitmap armazenado em cache em vez de dados vetoriais. Se os limites do objeto de exibição forem alterados, a superfície será recriada em vez de ser redimensionada. As superfícies podem ser aninhadas com outras superfícies. A superfície filho copia seu bitmap na superfície pai. Para obter mais informações, consulte Ativação do armazenamento em cache de bitmaps .

A propriedade opaqueBackground e a propriedade scrollRect da classe DisplayObject estão relacionadas ao armazenamento em cache de bitmaps realizado com a propriedade cacheAsBitmap . Embora essas três propriedades sejam independentes entre si, as propriedades opaqueBackground e scrollRect funcionam melhor quando um objeto é armazenado em cache como um bitmap; você verá a melhora de desempenho das propriedades opaqueBackground e scrollRect somente quando cacheAsBitmap for definido como true . Para obter mais informações sobre como percorrer o conteúdo do objeto de exibição, consulte Visão panorâmica e rolagem de objetos de exibição . Para obter mais informações sobre como configurar um plano de fundo opaco, consulte Definição de uma cor de fundo opaca .

Para obter informações sobre o mascaramento do canal alfa, que requer a definição da propriedade cacheAsBitmap como true , consulte Mascaramento de objetos de exibição .

Quando ativar o armazenamento em cache

A ativação do cache para um objeto de exibição cria uma superfície, o que tem diversas vantagens, como ajudar na renderização rápida de animações vetoriais complexas. Existem diversos cenários nos quais é necessário ativar o cache. Você talvez pense que sempre que o cache é ativado, o desempenho dos arquivos SWF melhora; no entanto, existem situações nas quais a ativação do cache não melhora o desempenho ou pode inclusive piorá-lo. Esta seção descreve cenários nos quais o cache deve ser usado e quando objetos de exibição regulares devem ser usados.

O desempenho global de dados em cache depende da complexidade dos dados vetoriais das ocorrências, quanto foram mudados os dados e se foi ou não definida a propriedade opaqueBackground . Se você estiver mudando regiões pequenas, a diferença entre o uso de superfície e o uso de dados vetoriais pode ser desprezível. Teste o seu trabalho das duas formas, antes de implantar o aplicativo.

Quando usar o armazenamento em cache de bitmaps

A seguir, alguns casos comuns nos quais podem ser vistos benefícios significativos quando se ativa o armazenamento em cache de bitmaps.

  • Imagem de fundo complexa: um aplicativo que contém uma imagem de fundo complexa e detalhada dos dados vetoriais (talvez uma imagem na qual o comando Traçar bitmap tenha sido aplicado ou a arte final criada no Adobe Illustrator®). Você pode animar caracteres no plano de fundo, o que deixa a animação mais lenta porque o plano de fundo precisa gerar regularmente os dados vetoriais mais uma vez. Para melhorar o desempenho, você pode definir a propriedade opaqueBackground do objeto de exibição de fundo como true . O fundo é renderizado como um bitmap e pode se redesenhado rapidamente, de modo que a execução da animação seja muito mais rápida.

  • Rolagem de campo de texto: um aplicativo que exibe uma grande quantidade de texto na rolagem do campo de texto. Você pode colocar o campo de texto em um objeto de exibição definido como rolável com limites de rolagem (a propriedade scrollRect ). Isso agiliza a rolagem de pixel para a ocorrência especificada. Quando o usuário rola a ocorrência do objeto de exibição, o Flash Player ou o AIR move os pixels rolados para cima e gera a região recém-exposta, em vez de gerar novamente todo o campo de texto.

  • Sistema de janelas: um aplicativo com um sistema complexo de janelas sobrepostas. Cada janela pode ser aberta ou fechada (por exemplo, as janelas de navegador da web). Se você marcar cada janela como uma superfície (definindo a propriedade cacheAsBitmap como true ), cada janela é isolada e colocada em cache. Os usuários podem arrastar as janelas de modo que se sobreponham, e as janelas não precisam gerar novamente o conteúdo vetorial.

  • Mascaramento do canal alfa: ao usar o mascaramento do canal alfa, você deve definir a propriedade cacheAsBitmap como true . Para obter mais informações, consulte Mascaramento de objetos de exibição .

A ativação do cache de bitmaps em todos esses cenários melhora a resposta e a interatividade do aplicativo, otimizando os gráficos vetoriais.

Além disso, sempre que um filtro é aplicado em um objeto de exibição, cacheAsBitmap é definido automaticamente como true , mesmo que esteja explicitamente definido como false . Se todos os filtros forem desativados do objeto de exibição, a propriedade cacheAsBitmap retornará ao valor definido pela última vez.

Quando evitar o uso do armazenamento em cache de bitmaps

Usando este recurso nas circunstâncias erradas pode prejudicar o desempenho do arquivo SWF. Ao usar o cache de bitmaps, lembre-se das seguintes orientações:

  • Não use em exagero superfícies (objetos de exibição com o cache ativado). Cada superfície usa mais memória do que um objeto de exibição normal, o que indica que você deve ativar as superfícies apenas quando precisar melhorar o desempenho da renderização.

    Um bitmap em cache pode usar significativamente mais memória do que um objeto de exibição normal. Por exemplo, se uma ocorrência de Sprite no palco tem 250 pixels por 250 pixels de tamanho, pode usar 250 KB em vez de 1 KB em cache quando for uma ocorrência normal de Sprite (não armazenada em cache).

  • Evite o zoom em superfícies em cache. Se usar exageradamente cache de bitmaps, é consumida uma grande quantidade de memória (veja observação anterior) se fizer o zoom do conteúdo.

  • Use superfícies para ocorrências de objeto de exibição em grande parte estáticas (sem animação). Você pode arrastar ou mover a ocorrência, mas o conteúdo da ocorrência não deve ser animado ou mudado muito. A animação ou alteração do conteúdo tem maior probabilidade de acontecer com uma ocorrência de MovieClip que contém animação ou uma ocorrência de Video. Por exemplo, se você girar ou transformar uma ocorrência, ela muda entre a superfície e os dados vetoriais, o que é difícil de processar e afeta negativamente o arquivo SWF.

  • Se misturar superfícies com dados vetoriais, aumenta a quantidade de processamento a ser feita pelo Flash Player e pelo AIR (e algumas vezes o computador). Agrupe as superfícies o máximo possível, por exemplo, quando criar aplicativos em janelas.

  • Não armazene em cache objetos cujas imagens gráficas sejam alteradas com frequência. Toda vez que você dimensiona, inclina, gira o objeto de exibição, altera a transformação de cor ou do alfa, move objetos de exibição filho ou desenha usando a propriedade graphics, o cache de bitmap é redesenhado. Se isso acontecer em cada quadro, o tempo de execução precisa desenhar o objeto em um bitmap e, em seguida, copiar esse bitmap no palco, o que resulta em trabalho extra, quando comparado com o simples desenho no palco do objeto que não está em cache. A escolha em termos de desempenho entre cache e frequência de atualização depende da complexidade e do tamanho do objeto de exibição e pode ser determinada somente pelo teste do conteúdo específico.

Ativação do armazenamento em cache de bitmaps

Para ativar o armazenamento em cache de bitmaps para um objeto de exibição, defina a propriedade cacheAsBitmap como true :

mySprite.cacheAsBitmap = true;

Depois de definir a propriedade cacheAsBitmap como true , você deve perceber que o objeto de exibição realiza o encaixe de pixels automaticamente em coordenadas inteiras. Ao testar o arquivo SWF, você verá que qualquer animação executada em uma imagem vetorial complexa é processada muito mais rápido.

Uma superfície (bitmap em cache) não será criada, mesmo que cacheAsBitmap esteja definido como true , se ocorrer uma ou mais das seguintes situações:

  • O bitmap é muito maior do que 2880 pixels de altura ou largura.

  • O bitmap não consegue ser alocado (produzindo erro de falta de memória).

Matrizes de transformação de bitmap armazenado em cache

Em aplicativos AIR para dispositivos móveis, você deve definir a propriedade cacheAsBitmapMatrix sempre que definir a propriedade cacheAsBitmap . A definição desta propriedade permite aplicar um intervalo mais amplo de transformações ao objeto de exibição sem acionamento de uma nova renderização.

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

Quando você define esta matriz adequadamente, pode aplicar a seguinte transformação adicional ao objeto de exibição sem voltar a armazenar o objeto em cache:

  • Mover ou converter sem encaixe de pixel

  • Girar

  • Dimensionamento

  • Inclinar

  • Alterar o alfa (entre 0% e 100% de transparência)

Essas transformações são aplicadas diretamente ao bitmap no cache.