优化移动 AIR 应用程序的性能

  • Jun (John) Chen

2011 年 12 月 13 日

话题:语言 & 开发架构

目录

需求

预备知识

本文假设您拥有使用 Flash Professional 的经验。建议还拥有 ActionScript 3 编程经验。

用户水平

所有

需要的产品

示例文件

您是否想知道为什么具有较少可用 CPU 周期的控制台游戏(比如早期的 Sony PlayStation 的版本(PS1 ~33 MHz,PS2 ~300 MHz))的运行性能比具有 600 MHz 到超过 1 GHz 的桌面或移动设备上的一些 Flash 游戏更高?单独基于 CPU 周期来评估平台不是公平的对比,因为在不同平台上实现游戏时,硬件和软件都存在重大差异。要在任何计算机或设备上获得最优性能,一定要最大化硬件功能,以及实现软件开发最佳实践。在本文中,我将介绍有助于改善移动 AIR 应用程序性能的开发实践。

通过更新 AIR SDK 改善性能

优化性能和修复可能延缓移动应用程序运行速度的错误的最快方式涉及到更新您的 AIR SDK。不幸的是,没有.exe 或.app 安装程序可帮助您实现此目的。但是,您可以执行下面列出的一个两步骤流程来迅速且轻松第更新您的 AIR SDK:

第 1 步

下载最新的 AIR SDK 并将其解压到应用程序文件夹 FlashProCS5.5/AIR2.6/ 中,替换其中的内容。不要担心任何文件夹的重命名。

第 2 步

复制解压的 AIR SDK 中的../frameworks/libs/air/airglobal.swc 文件,替换您的 FlashProCS5.5 安装文件夹../Common/Configuration/ActionScript 3.0/AIR2.6/ 中的旧版本。

继续操作,忽略各项将标为 AIR2.6 的事实。尽管您未更新文件夹名称或路径,但您可以确信您的 SDK 已更新来使用较新的版本。尽管可以更改该字符串来匹配 SDK 版本号,更新 Flash Professional 中某个位置的 XML 文件,但这不是必需的。

应用手动垃圾收集

术语手动垃圾收集指的并不是在有时触发在 Flash Professional 中的后台运行的自动垃圾收集。相反,我们建议当您编写移动应用程序时,您必须注意保持调理清除。您创建的每个类都应包含一个 cleanUp 函数,它在不再需要时删除自己的监听器、计时器、加载器和未用的影片剪辑。简单起见,这里是两种向您的代码应用垃圾收集的不同方式:

方法 1

如果您的类能够检测到它何时被用完,则调用它的自定义 cleanUp() 函数。例如,我们假设您的游戏有多个球实例在屏幕上从右向左飞行。您知道一旦球不再在屏幕上可见(x<0),这个球将不再有用。如果属于此情形,您可以在发生该情况时调用 cleanUp()。

方法 2

有时更有效的方法是创建一个计时器,它将检测一批对象中的各个实例是否仍然有用。此方法可节省 CPU 周期,在您的计时器中使用长得多的延迟。例如,您可以设置一个函数来每两秒检查一次对象的适用性,而不是每 100 毫秒。

如下是 cleanUp 函数的示例:

public function cleanUp(){
    removeEventListener(MouseEvent.ROLL_OVER, meRollOver);
    removeEventListener(MouseEvent.ROLL_OUT, meRollOut);
    playTimer.stop();
    playTimer.removeEventListener("timer", playHandler);
}

以下是一个 cleanUp 计时器函数的示例:

private function cleanUpTimerHandler(e:Event){
    var tempNumChildren:int = playContainer.numChildren;
    var tempMovie:MovieClip; 
    for(var i=0; i < tempNumChildren; i++){
        try{
            tempMovie = playContainer.getChildAt(i) as MovieClip;
            if(tempMovie.scaleX < .1){
                tempMovie.cleanUp();
                playContainer.removeChildAt(i);
            }
        }catch(e:Error){break;}
    }
}

cleanUp 函数非常简单,所以让我们看看 cleanUpTimerHandler(),它可在示例文件文件夹中的以下位置找到:cleanTimersAndListners/code/YesClean.as

在此示例应用程序中,会不断地生成三角形对象并将其添加到 playContainer 影片片段中。在 cleanUpTimerHandler 函数中,会分析和测试 playContainer 中的每段影片,检查它是否仍然有用。在本例中,适用性这个此依赖于对象的 x 范围(三角形会在尺寸上不断缩小)。当三角形小到不可见时,cleanUpTimerHandler 方法即从显示列表中删除该实例。

要查看显示垃圾收集的适用性的演示,请观看以下视频:

手动垃圾收集

这些动画在 iPod 4(顶部)和 Nexus One(底部)上可良好地运行,在 playContainer 中保持不到 200 个三角形,并且运行速度从未变慢。

无手动垃圾收集

这些动画在 iPod 4(顶部)和 Nexus One(底部)上运行性能较差,从动画运行过程中 playContainer 中不断增多的三角形数量可以看出。

使用矢量图和位图时的考虑因素

矢量图很容易处理,因为它们看起来整齐有序并且矢量资产可缩放。但是,在您希望优化性能时,最好谨慎地使用矢量图作品。矢量图通过一个在每帧中为每行 / 多边形执行数学计算的过程来显示。例如,如果舞台 fps 设置为 24,那么数学计算也会每秒处理 24 次。矢量图越复杂,数学方程式就会越复杂。

对于移动应用程序,我建议在运行时尽量少使用矢量图。但是,我的项目库中的大部分(或许是全部)图形资产都是矢量形式的。Flash Professional 支持右键单击一个矢量图并选择选项 Convert to Bitmap。在我开发项目时,我创建了一个位图文件夹,其中包含 Library 面板中每个矢量图的位图版本。此战略能够同时获得需要可调整分辨率的项目所需的可缩放性和性能。

当您构建移动应用程序时,您可能避免为不移动的对象(比如标题屏幕)使用矢量图。但是当创建动画时,最好坚持使用位图。

要查看使用位图和矢量图的演示,请观看以下视频:

位图的使用

这些动画在 Nexus One(左侧)和 iPod 4(右侧)上可良好地运行,从较高且一致的 30 帧每秒(fps)的速度可看出,及时出现了越来越多的位图。

矢量图的使用

这些动画在 Nexus One(左侧)和 iPod 4(右侧)上运行性能较差,从随着更多的矢量图出现而降低的性能(低至 12fps)可以看出。

在移动设备上实现更高性能的技巧

这一节重点介绍改善您使用 Flash Professional 构建的移动应用程序中的性能的一些最佳实践。

缩短应用程序启动时间

要最小化加载时间,一定不要一次加载整个应用程序,使应用程序停顿。例如,想象一个游戏有 100 关。甚至在显示标题屏幕之前加载所有 100 关,这毫无意义。这意味着您不应在对象准备好使用之前实例化它们。在每个类中使用 init() 函数来实例化对象和变量,而不将实例化代码放在类构造函数或全局声明中,这样可支持更加受控的环境。在用户体验方面,相比从一开始就执行一个较长的加载流程,拥有多个较短的时间段要好得多。

禁用警告模式来缩短编译时间

在 Flash Professional 中,访问 Advanced ActionScript 设置并找到警告模式选项。默认情况下它已启用,请将它关闭。如果您在库中拥有 400 个类的链接,当打开警告模式时,运行一段测试影片将会花大约 1-2 分钟。当该设置关闭时,测试相同的影片只需花 3-5 秒。

设置“.visible = false”而不是“alpha = 0”属性,隐藏舞台上的实例

尽管在测试时,设置影片片段属性 alpha=0 或 visible=false 的最终结果在舞台上看起来是一样的,但性能结果是不同的。简单来讲,设置为 alpha=0 的对象仍然需要计算之后再在屏幕上绘制,占用了宝贵的 CPU 资源。所以将可视属性设置为 false。

避免使用实时滤镜

发光、模糊、倒角或投影效果等特效看起来很漂亮,但这对性能而言不是好事。这并不是说,您决不应该使用 Flash Professional 中内置的滤镜。但是,您将发现,如果将添加了滤镜的影片片段转换为位图,您可以实现类似的可视结果。而且这样,您可以提升应用程序的性能,同时显示您想要的漂亮效果。

在启用 Allow smoothing 选项时保持谨慎

在舞台上调整之后,位图的 Allow smoothing 选项有助于使图像更加美观,而没有锯齿。当图像调整为更大尺寸时会出现该问题。请记住,Allow smoothing 选项基本上与实时地向位图应用滤镜相同。例如,将启用了平滑效果的 10 × 10 像素图像调整为 2000 × 2000 像素后,它的运行速度像使用具有 2000 × 2000 像素的原始尺寸的图像一样慢,甚至可能更慢。但是,将 10 × 10 像素的图像调整为没有应用平滑效果的 2000 × 2000 像素的图像,性能会高得多。

子画面表 > 平铺图形实例 > 一个大图像

您为改善应用程序的性能投入的时间越多,您可以实现的性能就越高。在过去,开发人员使用平铺的图形而不是一个大图像来减少加载时间和改善性能。现在,您可以在游戏中使用子画面表来优化性能和改善用户体验。

延伸阅读

本文列出了您在创建 Flash 内容来在移动设备上部署 AIR 应用程序时,可用于改善性能的一些战略和最佳实践。尝试实现这些技术并利用更新的硬件功能,以实现可带来最优性能的移动应用程序。

要进一步研究,请查阅以下在线资源:

  • GotoAndLearn是一个视频培训站点,包含关于在 Flash Professional 中使用子画面表的教程
  • Starling framework是一个非常不错的库,为 2D 游戏应用了硬件加速
  • Away3D是一个采用了硬件加速的免费的 3D 游戏引擎
  • Alternativa是一个备用的、高级的 3D 游戏引擎平台

查看原文:Optimizing performance for mobile AIR applications

语言 & 开发架构