热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

您是否想知道为什么具有较少可用CPU周期的控制台游戏(比如早期的SonyPlayStation的版本(PS1~33MHz,PS2~300MHz))的运行性能比具有600MHz到超过1GH

您是否想知道为什么具有较少可用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 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=0visible=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游戏引擎平台

推荐阅读
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
author-avatar
麦穗的小婷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有