Utilice las versiones asíncronas de las operaciones en lugar de las sincrónicas, siempre que sea posible.
Las operaciones sincrónicas se ejecutan cuando el código se lo indica y el código espera a que se completen antes de continuar. Por lo tanto, se ejecutan en la fase del código de la aplicación del bucle de fotograma. Si una operación sincrónica tarda demasiado, amplía el tamaño del bucle de fotograma, por lo que es probable que la visualización presente bloqueos o irregularidades.
Cuando el código ejecuta una operación asíncrona, no necesariamente se ejecuta de forma inmediata. Su código y el código de la aplicación del subproceso de ejecución actual continúa ejecutándose. El motor de ejecución realiza la operación lo antes posible mientras intenta evitar problemas de representación. En algunos casos, la ejecución se produce en segundo plano y no se ejecuta como parte del bucle de fotograma del motor de ejecución. Finalmente, una vez completada la operación, el motor de ejecución distribuye un evento y su código puede detectar ese evento para seguir ejecutando más tareas.
Las operaciones asíncronas se programan y se dividen para evitar problemas de representación. Por lo tanto, resulta mucho más sencillo disponer de una aplicación con un buen nivel de respuesta utilizando versiones asíncronas de las operaciones. Consulte
Rendimiento percibido frente a rendimiento real
para obtener más información.
Sin embargo, existe cierta sobrecarga asociada a la ejecución de operaciones de forma asíncrona. El tiempo real de ejecución puede ser mayor en las operaciones asíncronas, especialmente en aquellas operaciones que tardan poco tiempo en completarse.
En el motor de ejecución, diversas operaciones son sincrónicas o asíncronas de forma inherente y no se puede seleccionar cómo ejecutarlas. Sin embargo, en Adobe AIR, existen tres tipos de operaciones para las que se puede optar por una ejecución sincrónica o asíncrona:
-
Operaciones de la clase File y FileStream
Muchas operaciones de la clase File se pueden llevar a cabo de forma sincrónica o asíncrona. Por ejemplo, los métodos para copiar o eliminar un archivo o directorio y el listado del contenido de un directorio tienen todos versiones asíncronas. Estos métodos se identifican mediante el sufijo “Async” añadido al nombre de la versión asíncrona. Por ejemplo, para eliminar un archivo de forma asíncrona, llame al método
File.deleteFileAsync()
en lugar del método
File.deleteFile()
.
Cuando se utiliza un objeto FileStream para leer o escribir en un archivo, el modo en que se abre el objeto determina si las operaciones de lectura y escritura se ejecutan de forma asíncrona. Utilice el método
FileStream.openAsync()
para las operaciones asíncronas. La escritura de datos se realiza de forma asíncrona. La lectura de datos se realiza en segmentos, por lo que los datos están disponibles una parte cada vez. Por el contrario, en el modo sincrónico, el objeto FileStream lee todo el archivo antes de continuar con la ejecución de código.
-
Operaciones de base de datos SQL local
Al trabajar con una base de datos SQL local, todas las operaciones ejecutadas mediante un objeto SQLConnection se ejecutan en modo sincrónico o asíncrono. Para especificar que las operaciones se ejecuten de forma asíncrona, abra la conexión a la base de datos utilizando el método
SQLConnection.openAsync()
en lugar del método
SQLConnection.open()
. Si las operaciones de base de datos se ejecutan de forma asíncrona, lo harán en segundo plano. El motor de la base de datos no se ejecuta en el bucle de fotograma del motor de ejecución, por lo que es mucho menos probable que las operaciones de base de datos causen problemas de representación.
Para obtener estrategias adicionales para mejorar el rendimiento con la base de datos SQL local, consulte
Rendimiento de la base de datos SQL
.
-
Sombreados independientes de Pixel Bender
La clase ShaderJob permite ejecutar una imagen o un conjunto de datos mediante un sombreado de Pixel Bender y acceder a los datos de resultado sin formato. De forma predeterminada, cuando se llama al método
ShaderJob.start()
, el sombreado se ejecuta de forma asíncrona. La ejecución se produce en segundo plano y no se utiliza el bucle de fotograma del motor de ejecución. Para provocar que el objeto ShaderJob se ejecute sincrónicamente (lo cual no se recomienda), transmita el valor
true
al primer parámetro del método
start()
.
Además de estos mecanismos incorporados para la ejecución asíncrona de código, es posible estructurar el propio código para realizar la ejecución de forma asíncrona en lugar de sincrónicamente. Si se está escribiendo código para realizar tareas de una posible ejecución larga, el código puede estructurarse para que se ejecute en partes. La división del código en partes permite al motor de ejecución realizar sus operaciones de representación entre los bloques de ejecución de código, lo que reduce la posibilidad de que aparezcan problemas de representación.
A continuación se indican varias técnicas para la división del código. La idea principal de estas técnicas radica en que el código se escribe para realizar únicamente parte de su trabajo en cualquier momento. Se realiza un seguimiento de lo que hace el código y del momento en que deja de trabajar. Por ejemplo, se utiliza un mecanismo como el siguiente: un objeto Timer comprueba reiteradamente si el trabajo continúa y realiza tareas adicionales en segmentos hasta que el trabajo finalice.
Existen unos cuantos patrones establecidos para estructurar el código y dividir el trabajo de este modo. Los siguientes artículos y bibliotecas de código describen estos patrones y proporcionan código para ayudarle a implementarlos en sus aplicaciones:
-
Asynchronous ActionScript Execution
(Ejecución asíncrona de ActionScript; en inglés.) (Artículo de Trevor McCauley con más información general, así como varios ejemplos de implementación.)
-
Parsing & Rendering Lots of Data in Flash Player
(Análisis y representación de muchos datos en Flash Player; en inglés.) (Artículo de Jesse Warden con información general y ejemplos, “builder pattern” y “green threads”).
-
Green Threads
(Artículo de Drew Cummins donde se describe la técnica “green threads” con código fuente de ejemplo; en inglés).
-
greenthreads
(Biblioteca de código fuente abierto de Charlie Hubbard, para la implementación de “green threads” en ActionScript; en inglés. Para obtener más información, consulte la guía de inicio rápido sobre greenthreads
greenthreads Quick Start
.)
-
Subprocesos en ActionScript 3
http://www.adobe.com/go/learn_fp_as3_threads_es
(Artículo (en inglés) de Alex Harui, donde se incluye una implementación de ejemplo de la técnica “pseudo threading”).