BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Jun (John) Chen 关注 0 他的粉丝 发布于 2011年12月14日. 估计阅读时间: 13 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

目录

需求

预备知识

本文假设您拥有使用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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT