Use versões de operações assíncronas em vez de síncronas quando disponíveis
As operações síncronas executam assim que o código dá a instrução e o código aguarda até completar as operações antes de continuar. Como resultado, as operações executam na fase do código do aplicativo do loop de quadros. Se uma operação síncrona demorar muito, ela estica o tamanho do loop de quadros, provavelmente fazendo com a exibição apareça congelada ou cortada.
Quando o código executa uma operação assíncrona, ele não necessariamente executa de imediato. Seu código e outros códigos do aplicativo no encadeamento da execução atual continuam executando. Desta forma, o tempo de execução desempenha a operação o mais rápido possível enquanto tenta evitar problemas de renderização. Em alguns casos, a execução acontece em segundo plano e não executa como parte do loop de quadros do tempo de execução. Finalmente, quando a operação completa, o tempo de execução despacha o evento e seu código pode ouvir esse evento para desempenhar mais trabalhos.
As operações assíncronas são programadas e divididas para evitar problemas de renderização. Como resultado, é muito mais fácil ter um aplicativo responsivo usando versões de operações assíncronas. Consulte
Desempenho percebido versus desempenho real
para obter mais informações).
Contudo, existe alguma folga na execução assíncronas de operações. O tempo de execução real não pode ser mais longo para as operações assíncronas, especialmente as operações que demoram pouco tempo para ser concluídas.
No tempo de execução, muitas operações são inerentemente síncronas ou assíncronas e você não pode escolher como executá-las. No entanto, no Adobe Air, há três tipos de operações que você pode escolher desempenhar síncrona ou assincronamente.
-
Operações da classe File e FileStream
É possível desempenhar muitas operações da classe File síncrona ou assincronamente. Por exemplo, os métodos para copiar ou excluir um arquivo ou diretório e listar o conteúdo de um diretório têm todos versões assíncronas. Esses métodos são identificados pelo sufixo “Async” adicionado ao nome da versão assíncrona. Por exemplo, para excluir um arquivo assincronamente, chame o método
File.deleteFileAsync()
em vez do método
File.deleteFile()
.
Ao utilizar um objeto FileStream para ler um arquivo ou gravar em um arquivo, a maneira como você abre o objeto FileStream determina se as operações de leitura e gravação são executadas assincronamente. Utilize o método
FileStream.openAsync()
para operações assíncronas. A gravação de dados é desempenhada assincronamente. A leitura de dados é feita em blocos de forma que os dados estejam disponíveis uma parte de cada vez. Por contraste, no modo síncrono, o objeto FileStream lê o arquivo inteiro antes de continuar a execução do código.
-
Operações de banco de dados SQL locais
Ao trabalhar com um banco de dados SQL local, todas as operações executadas por meio do objeto SQLConnection executam no modo síncrono ou assíncrono. Para especificar se essas operações executam assincronamente, abra a conexão com o banco de dados utilizando o método
SQLConnection.openAsync()
em vez do método
SQLConnection.open()
. Quando as operações do banco de dados executam assincronamente, são executadas em segundo plano. O mecanismo do banco de dados não executa no loop de quadros do tempo de execução; dessa forma, é menos provável que as operações do banco de dados causem problemas de renderização.
Para ver estratégias adicionais para melhorar o desempenho com o banco de dados SQL local, consulte
Desempenho do banco de dados SQL
.
-
Sombreadores independentes Pixel Bender
A classe ShaderJob permite a você executar uma imagem ou conjunto de dados por meio do sombreador Pixel Bender e acessar os dados brutos do resultado. Como padrão, quando o método
ShaderJob.start()
é chamado, o sombreador executa assincronamente. A execução ocorre em segundo plano, não utilizando o loop de quadros do tempo de execução. Para fazer com que o objeto ShaderJob execute sincronamente (o que não é recomendado), passe o valor
true
para o primeiro parâmetro do método
start()
.
Além desses mecanismos incorporados para executar código assincronamente, você pode também estruturar seu código para executar assincronamente em vez de sincronamente. Se estiver escrevendo código para desempenhar uma tarefa potencialmente de execução longa, você pode estruturar seu código para que execute em partes. Dividir seu código em partes permite que o tempo de execução desempenhe suas operações de renderização no meio de blocos de execução do código, tornando menos provável problemas de renderização.
A seguir são listadas diversas técnicas para dividir o código: A principal ideia pertinente a essas técnicas é que seu código é escrito para desempenhar somente parte de seu trabalho ao mesmo tempo. É possível rastrear o quê o código faz e onde interrompe o trabalho. Utilize um mecanismo como, por exemplo, o objeto do cronômetro para verificar repetidamente se o trabalho continua e desempenha trabalho adicional em blocos até o trabalho completar.
Há poucos padrões estabelecidos para estruturar o código para dividir o trabalho dessa forma. Os seguintes artigos e bibliotecas de códigos descrevem esses padrões e fornecem códigos para ajudar você a implantá-los nos aplicativos: