Flash 平台技术的优化(十四) 异步操作

来源:互联网 发布:php全局变量作用域 编辑:程序博客网 时间:2024/06/06 00:07

推荐使用操作的异步版本,而不是同步版本(如果适用)。
在代码通知同步操作运行时即立刻开始运行,而且代码会等待此操作完成后才会继续执行其他操作。因此,它们在帧循环的应用程序代码阶段运行。如果同步操作需要的时间太长,它将扩展帧循环的大小,这可能会导致显示冻结或不连贯。
当代码执行异步操作时,不必立即运行。代码和当前执行线程中的其他应用程序代码会继续执行。然后,运行时在尝试阻止呈现问题的同时会尽快执行此操作。在某些情况下,执行操作会在后台发生,且根本不会作为运行时帧循环的一部分运行。最后,当操作完成时,运行时会调度一个事件,且代码可以侦听该事件以执行进一步操作。
安排异步操作并将其拆分为几部分以避免出现呈现问题。因此,使响应应用程序使用操作的异步版本要容易得多。有关详细信息,请参阅第2 页的“ 感知性能与实际性能”。
但是,异步运行操作会产生一些开销。异步操作的实际执行时间可能更长,尤其是那些短时间完成的操作。
在 Flash 平台运行时中,许多操作本身就是同步操作或异步操作,因此您无法选择如何执行这些操作。然而,在 Adobe AIR中,有三种类型的操作可供您选择是采用同步执行还是异步执行:
• File 和 FileStream 类操作
File 类的许多操作既可以同步执行,也可以异步执行。例如,复制或删除文件或目录以及列出目录的内容的方法都采用异步版本。这些方法包含添加到异步版本名称中的后缀“Async”。例如,要异步删除一个文件,请调用 File.deleteFileAsync() 方法,而不是 File.deleteFile() 方法。
当使用 FileStream 对象读取或写入文件时,打开 FileStream 对象的方式决定是否异步执行操作。使用FileStream.openAsync() 方法执行异步操作。采用异步方式执行数据写入。数据读取分区块完成,因此每次只有部分数据可用。相比而言,在同步模式下, FileStream 对象读取整个文件,然后才继续执行代码。
• 本地 SQL 数据库操作

使用本地 SQL 数据库时,通过 SQLConnection 对象执行的所有操作可以在同步模式下执行,也可以在异步模式下执行。
要指定采用异步方式执行操作,请使用 SQLConnection.openAsync() 方法代替 SQLConnection.open() 方法打开到数据库的连接。当数据库操作采用异步方式运行时,将在后台执行。数据库引擎根本不在运行时帧循环中运行,因此数据库操作不太可能导致呈现问题。
有关提高本地 SQL 数据库性能的其他策略,请参阅 第70 页的“SQL 数据库性能”。
• Pixel Bender 独立着色器
ShaderJob 类允许您通过 Pixel Bender 着色器运行图像或数据集以及访问原始结果数据。默认情况下,当调用ShaderJob.start() 方法时,着色器以异步方式执行。执行发生在后台,不使用运行时帧循环。要强制 ShaderJob 对象以异步方式执行(不建议这样做),请将值 true 传递给 start() 方法的第一个参数。
有关使用 Pixel Bender 着色器执行后台处理的详细信息和示例,请参阅 Using Pixel Bender to do heavy lifting calculations,
makes Flash Player multi-thread (作者: Elad Elrom)。
除用于异步运行代码的这些内置机制之外,您还可以构建自己的代码来异步运行而不是同步运行。如果您正在编写的代码用来执行可能会长期运行的任务,您可以构建自己的代码,以便分部分执行。将您的代码拆分为几部分允许运行时在代码执行块之间执行其呈现操作,从而尽可能减少呈现问题。
下面列出了几种用于拆分代码的技术。所有这些技术的主旨是编写的代码在任何时候仅执行其部分工作。可以跟踪代码执行的操作以及停止运行的位置。使用某种机制(例如 Timer 对象)反复检查工作是否仍在进行并分区块执行其他工作,直到完成此工作。
建立了几个模式可用于以此种方式构建代码以拆分工作。下列文章和代码库介绍了这些模式,并提供了代码以帮助您在应用程序中实施这些模式:
• Asynchronous ActionScript Execution (文章作者:Trevor McCauley,其中包括更多背景详细信息以及多个实施示例)
• Parsing & Rendering Lots of Data in Flash Player(文章作者:Jesse Warden,其中包括背景详细信息和两种方法的示例,即“ 构建者模式” 和“ 绿色线程”)
• Green Threads (文章作者:Drew Cummins,其中使用示例源代码介绍了“ 绿色线程” 技术)
• greenthreads(Charlie Hubbard 介绍的开放源代码库,用于在 ActionScript 中实施“ 绿色线程”。有关更多信息,请参阅 greenthreads Quick Start。)
• ActionScript 3 中的线程,网址为 www.adobe.com/go/learn_fp_as3_threads_cn (文章作者:Alex Harui,其中包括实施“ 伪线程” 技术的示例)