Flex进阶持续学习——性能优化
一. 参考资料
Performance-tuning Adobe AIR applications
// Enable Show Redraw Regions// Blue color is used to show redrawn regionsflash.profiler.showRedrawRegions ( true, 0x0000FF );
??????? b) 要改进性能:
??????????? 将隐藏的运行字符的 visible 属性设置为 false 或将其从显示列表中完全删除;
??????????? 还应该停止其时间轴。
2) 避免将内容放在后台。而是在需要时将对象放在显示列表中。
?
3) 影片品质
a) 使用适当的舞台品质设置可提高呈现性能。
??? 使用 StageQuality.MEDIUM 通常就可以为移动设备提供足够高的品质,但在某些情况下,使用 StageQuality.LOW 也可以提供足够高的品质。
??? Flash Player 8 及更高版本可以精确呈现消除锯齿的文本,甚至将舞台品质设置为 LOW 也可以达到这种效果。
??? 在某些设备上, Flash Player 10.1 可自动切换到 StageQuality.MEDIUM 以提高性能。
b) 在将矢量绘制为位图前后切换舞台品质是一项功能强大的技术,可以在屏幕上获得消除锯齿的内容。无论最终舞台品质如何,此技术都有效。(但使用cacheAsBitmap 属性时不能实现此技术。)
?
4) 尽可能避免使用 alpha 属性。
?
5) 应用程序帧速率
a) 通常,使用尽可能低的帧速率可以提高性能。
b) 如果视频是应用程序中唯一的动态内容,请使用低帧速率。
c) 动态更改应用程序的帧速率。
?? 可以通过设置 Stage.frameRate 属性(或Flex 中的 WindowedApplication.frameRate 属性)来更改帧速率。
d) 在编译 SWF 文件时,应为影片设置特定的帧速率。
?
??? 用于开始确定适用于不同类型活动的合适帧速率的常规指导:
如果使用的是 Flex 框架,将起始帧速率保持为默认值;(对于 Flex 中的内置应用程序, spark.components.WindowedApplication 类已经内置了用于动态更改应用程序的帧速率的支持功能。当应用程序处于非活动状态时, backgroundFrameRate 属性将定义应用程序的帧速率。默认值为 1,该值将使用Spark 框架构建的应用程序的帧速率更改为 1 帧/ 秒。您可以通过设置 backgroundFrameRate 属性来更改后台帧速率。您可以将此属性设置为其他值,或将其设置为 -1 以关闭自动帧速率限制。)?如果应用程序包括动画,适当的帧速率至少是 20 帧/ 秒。通常不必超过 30 帧/ 秒。?如果应用程序不包括动画, 12 帧/ 秒的帧速率可能就足够了。6) 位图缓存
a) 在适当的时候,对复杂的矢量内容使用位图缓存功能。
b) 对显示对象,仅当缓存的位图可以一次生成,且随后无需更新即可使用时,才适合使用位图缓存功能,否则会有反效果。使用位图缓存会占用大量内存,要节省内存,可使用 cacheAsBitmap 属性,并对每个显示对象而不是容器激活该属性。
注:AIR 和 Packager for iPhone 中提供的 DisplayObject.cacheAsBitmapMatrix 属性没有此限制。通过使用
cacheAsBitmapMatrix 属性,您可以旋转、缩放、倾斜显示对象以及更改其 Alpha 值,而不触发重新生成位图。
c) 如果不在各个帧上旋转、缩放或更改缓存的内容,则位图缓存可提高呈现效果。但是,对于 X 和 Y 轴上的平移之外的任何转换,则不会提高呈现性能。
注:AIR 和 Packager for iPhone 中提供的 DisplayObject.cacheAsBitmapMatrix 属性没有此限制。
d) 滤镜依赖每次缓存的影片剪辑的播放头移动时更新的位图。因此,使用滤镜会自动将 cacheAsBitmap 属性设置为 true。应避免在动画内容中使用滤镜,因为这可能导致性能问题。
e) 当在移动 AIR 应用程序中使用缓存位图时,设置 cacheAsBitmapMatrix 属性。
??? 设置此属性后,可以在不重新生成缓存位图的情况下对对象应用任何二维转换(缩放、倾斜、旋转和平移对象),还可以在不重新生成缓存位图的情况下更改 alpha 属性。(cacheAsBitmap 属性必须设置为 true,对象不得设置任何 3D 属性。)
注:如果使用颜色转换,通过 transform.colorTransform 属性更改 alpha 值,转换对象中使用的 alpha 必须位于 0 和 255 之间。以任何其他方式更改颜色转换都会重新生成缓存位图。
f) 使用 BitmapData 类创建自定义位图缓存行为。
g) 使用位图缓存功能和 opaqueBackground 属性可提高文本呈现性能。此技术适用于不随时间更改的内容。
?
7) GPU
a) Flash Player 10.1 一项重要的新功能是它可以使用 GPU 在移动设备上呈现图形内容。
??? 使用GPU 可以优化滤镜、位图、视频和文本的呈现。
??? Flash Player 10.1 还有一个限制,即阻止在屏幕上呈现 Pixel Bender 效果。在使用硬件加速时,这些效果可能呈现为黑色的正方形。
??? 在 Flash Player 10.1中, GPU 用于计算图形,从而大大加快了呈现速度。
b) 通过在应用程序描述符中加入 <renderMode>gpu</renderMode>,在 AIR 应用程序中启用硬件图形加速。
??????????
??? GPU 呈现模式最佳实践:
限制舞台上可见项目的数量。当不再需要显示显示对象时,可将其 visible 属性设置为 false。(不要简单地将其移出舞台、将其隐藏在另一个对象后面或将其 alpha 属性设置为0。)如果彻底不再需要显示对象,使用 removeChild() 将其从舞台删除。重复使用对象,而不是创建和销毁它们。使位图的大小接近但小于 2n 乘 2m 位。尺寸不必正好为 2 的整数次幂,但是应该接近 2 的整数次幂,而不需要更大。(31 乘 15 像素的图像比 33 乘 17 像素的图像的呈现速度更快。)如果可能,在调用 Graphic.beginBitmapFill() 方法时将 repeat 参数设置为 false。不要过分夸张。将背景色作为背景。不要将较大形状进行叠放。每个必须绘制的像素都需要成本。避免使用带有狭长突起、自相交的边缘或边缘周围存在许多细节的形状。呈现这些形状需要的时间比边缘平滑的显示对象8) 推荐使用操作的异步版本,而不是同步版本(如果适用)。
?
9) AIR 应用程序中,考虑使用不透明的矩形应用程序窗口而不是透明窗口。
要为应用程序的初始窗口使用不透明窗口,请在应用程序描述符 XML 文件中设置以下值:
<initialWindow>
<transparent>false</transparent>
</initialWindow>
对于 Flex Window 组件,确保在调用 Window 对象的 open() 方法前,该组件的透明属性已设置为 false (默认值)。
?
10) 对形状进行平滑处理以改进呈现性能。
?
4. 优化网络交互
1) Flash Player 10.1 针对所有平台上的网络优化引入了一组新功能,包括循环缓冲和智能搜索(智能搜索功能要求使用 Adobe? Flash? Media Server 3.5.3。)。
?
2) 只能在缓存流的边界内进行搜索。如果偏移量超出范围, NetStream.seek() 有时会失败,此时将调度
NetStream.Seek.InvalidTime 事件。
?
3) 将应用程序分为多个 SWF 文件。
?
4) 针对 IO 错误提供事件处理函数和错误消息。
??? 最佳做法是谨记为用户提供一种再次加载内容的方式。
?
5) 使用 Flash Remoting 和 AMF 实现优化的客户端- 服务器数据通信。
?
6) 加载资源后将本地缓存,而不是在每次需要时从网络进行加载。
?
??? 可以根据资源的类型和性质通过多种方式缓存资源:
媒体资源(例如图像和视频):使用 File 和 FileStream 类将文件保存到文件系统;单个数据值或小型数据集:使用 SharedObject 类将值另存为本地共享对象;较大数据集:将数据保存到本地数据库或对数据序列化并将其保存到文件中。提示:对于缓存数据值, open-source AS3CoreLib project 包含一个 ResourceCache 类,可为您执行加载和缓存操作。
?
?
5. 处理媒体
1) 有关优化移动设备上的视频性能的信息,详见:优化用于移动传送的 Web 内容的工具
?
2) 在 Flash Player 9.0.115.0 及更高版本中,Flash Player 可播放 AAC 文件(AAC Main、AAC LC 和 SBR)。
??? 使用 AAC 文件代替 MP3 文件可实现简单优化。
??? 在比特率相同的情况下, AAC 格式的文件比 MP3 格式的文件品质更好、文件大小更小。
?
3) 与视频解码类似,音频解码要求高 CPU 周期,并可通过利用设备上提供的硬件来进行优化。
??? Flash Player 10.1 在解码 AAC文件(LC、HE/SBR 配置文件)或 MP3 文件(不支持 PCM)时,可以检测和使用硬件音频驱动程序来提高性能。
?
6. SQL数据库性能
1) 针对数据库性能的应用程序设计
???? a) 不要在执行 SQLStatement 对象后更改其 text 属性。
??? ? ?? 针对每个 SQL 语句使用一个 SQLStatement 实例并使用语句参数提供不同值。
???? b) 使用数据库索引可以提高执行数据比较和排序的速度。
?
???????? 使用下列准则可以计划索引策略:
对连接表、WHERE 子句或 ORDER BY 子句中使用的列编制索引;如果这些列经常一起使用,请在单个索引中对其编制索引;对于包含您检索的、按字母顺序排序的文本数据的列,请为索引指定 COLLATE NOCASE 排序规则。???? c) 考虑在应用程序空闲时间期间预编译 SQL 语句。
???? d) 在一个事务中组合多个 SQL 数据更改操作。
???? e) 使用 SQLStatement 类的 execute() 方法(带有 prefetch 参数)和 next() 方法处理各部分中的大量 SELECT 查询结果。
???? f) 考虑使用共用一个数据库的多个异步 SQLConnection 对象来同时执行多个语句。(不建议对移动设备使用此方法。)
?
提示:Paul Robertson 创建了一个开放源代码库,可以帮助您结合使用多个 SQLConnection 对象的优点并在最大程度上减少潜在缺点。此库使用 SQLConnection 对象池并管理相关联的 SQLStatement 对象。
?
2) 数据库文件优化
???? a) 避免数据库架构更改。
???? b) 在架构更改后,使用 SQLConnection.compact() 方法优化数据库。
???????? 但是, compact() 操作可能需要大量的时间,尤其是数据库文件日益增长时。
?
3) 不是非常必要但推荐的数据库运行时处理
???? a) 在 SQL 语句中使用完全限定的表名称(包括数据库名称)。
???? b) 在 SQL INSERT 和 SELECT 语句中使用显式列名称。
???? c) 除非将该表与其本身进行比较,否则避免在一个语句中多次连接同一个表。
?
?
4) 有效的 SQL 语法
???? a) 使用 JOIN (位于 FROM 子句中)可以在查询中包含表,而不是在 WHERE 子句中包含子查询。
???????? 即使您只需要使用表数据进行过滤而不是生成结果集,该技巧也同样适用。
? ? ?? ? 在 FROM 子句中连接多个表执行操作的效果比在 WHERE 子句中使用子查询的效果要好。
???? b) 避免使用无法利用索引的 SQL 语句。
???????? 这些语句包括使用子查询中的聚合函数、子查询中的 UNION 语句或包含 UNION 语句的 ORDER BY 子句。
???? c) 考虑避免使用 LIKE 运算符,特别是带有前导通配符的运算符。
? ?? d) 考虑避免使用 IN 运算符。
???????? 如果预先知道可能的值,可使用 AND 或 OR 写入 IN 操作以加快执行速度。
? ?? e) 考虑使用 SQL 语句的替代形式以提高性能。
?
5) SQL 语句性能:直接比较替代 SQL 语句以确定哪个速度更快。
??? 比较多个版本的 SQL 语句的性能的最佳方法是直接使用您的数据库和数据对它们进行测试。
?
?
?? 下列开发工具提供了运行 SQL 语句时的执行次数:
Run! (Paul Robertson 提供的 AIR SQL 查询创作工具和测试工具)Lita(David Deraedt 提供的 SQLite 管理工具)?
7. 基准测试和部署
1) 基准测试工具
???? a) Stats 类:在运行时使用 Flash Player 的发行版(而不是外部工具)设置代码。
???? b) PerformanceTest 类:一种可集成到单元测试工作流程中的工具。
???? c) Flash Builder 探查器。
???? d) FlexPMD:通过审核 ActionScript 3.0 或 Flex 源目录来提高代码品质。
?
2) 部署:在 Flash Builder 中导出应用程序的最终版本时,确保导出该应用程序的发行版非常重要。
??? 导出发行版将删除 SWF 文件中包含的调试信息。
??? 删除调试信息将减小 SWF 文件的大小并有助于加快应用程序的运行速度。
?
?
?