Link

首页

Tweet

书单

about me

Command

Category

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


您是否想知道为什么具有较少可用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 方法即从显示列表中删除该实例。

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

矢量图很容易处理,因为它们看起来整齐有序并且矢量资产可缩放。但是,在您希望优化性能时,最好谨慎地使用矢量图作品。矢量图通过一个在每帧中为每行/多 边形执行数学计算的过程来显示。例如,如果舞台fps设置为24,那么数学计算也会每秒处理24次。矢量图越复杂,数学方程式就会越复杂。
对于移动应用程序,我建议在运行时尽量少使用矢量图。但是,我的项目库中的大部分(或许是全部)图形资产都是矢量形式的。Flash Professional支持右键单击一个矢量图并选择选项Convert to Bitmap。在我开发项目时,我创建了一个位图文件夹,其中包含Library面板中每个矢量图的位图版本。此战略能够同时获得需要可调整分辨率的项目 所需的可缩放性和性能。
当您构建移动应用程序时,您可能避免为不移动的对象(比如标题屏幕)使用矢量图。但是当创建动画时,最好坚持使用位图。

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

这一节重点介绍改善您使用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像素的图像,性能会高得多。
子画面表 > 平铺图形实例 > 一个大图像您为改善应用程序的性能投入的时间越多,您可以实现的性能就越高。在过去,开发人员使用平铺的图形而不是一个大图像来减少加载时间和改善性能。现在,您可以在游戏中使用子画面表来优化性能和改善用户体验。