`
mv776mv
  • 浏览: 14201 次
社区版块
存档分类
最新评论

[转载][转]AS代码优化和Flex应用程序的性能

 
阅读更多

[转载][转]AS代码优化和Flex应用程序的性能
2011年07月29日
  一看了第一点,我想弱弱的问:全局变量不是很好么?声明了一次足矣,需要的时候再实例化,这不是很好么?
  不得不承认 在flash强大的表现力下 性能损耗始终是很麻烦的一个问题。下面罗列一些自己常用的一些技巧和一些网上收集的技巧。抛砖引玉,希望大家都能来讨论下自己在flash程序优化方面的 一些经验。 
  OK,直接开始 
  1、在局部变量够用时,不要使用全局变量。类静态变量也要少用。全局变量是开发者的恶梦。实在需要全局变量的话,我建议使用singleton设 计模式来进行管理。 
  2、读取数组中的数据,尽量使用for in 循环来代替传统的 for 或者while循环语法。 
  因为for in的执行效率比起后者提高了30%。其次是选择while循环,传统for循环语法的效率在三者中是最低的。 
  向数组中写入数据,则是while循环稍占优势。 
  3、给所有的MovieClip都多加一个空白帧,当他们不出现在屏幕上时,你能用gotoAndStop()语句跳转到这一帧。为什么呢?因为 播放器仍然要消耗一定的资源来处理这些不可见/屏幕外的mc,哪怕他们是单帧,非播放的状态。简单的设置可见度属性为不可见( _visible = false )是无效的,播放器依然会按照这些MC说停留或播放的帧的复杂度来分配资源。 
  4、能用单行赋值则使用单行赋值。比如: 
  a = 0 
  b = 0 
  c = 0 
  效率就不如: 
  a = b = c = 0 
  5、变量名越短,效率越高。考虑到长变量名也有它的好处(比如,便于维护等),因此建议在关键部位(比如大量循环出现的时候)使用短变量名,最好 就1-2个字符。 
  6、不要过多使用 Object 类型。 数据类型注释应力求精确,这样可以提高性能。只有在没有适当的备选数据类型时,才使用 Object 类型。同时也便于代码管理,时刻知道对象的类型和作用。同时也有利于编译器编译时优化。 
  7、避免使用 eval_r() 函数或数据访问运算符。 通常,较为可取且更有效的做法是只设置一次局部引用。不得已时才用eval,比如转换_droptarget为MovieClip时。 
  8、在开始循环前将 Array.length 赋予变量,尤其是大的循环。 在开始循环前将 Array.length 赋予变量(比如var iLength:Number),将其作为条件使用,而不是使用myArr.length 本身。原因,在循环中,iLength是Number变量,会被放入寄存器使用,效率远比访问Array再得到length高。 
  9、当用到复杂的条件表达式时。把他们打散成为嵌套的独立判断结构是最佳方案。比如if(a&&b&&c)的效 率就低于if(a){if(b){if(c){}}}。当然这样做代码是会比较不美观。 
  10、在用到矢量图的时候,我们要尽可能简化它们的形状,去除多余的端点。这样做将大大降低播放器用于呈现矢量图所要进行的计算量。 
  11、需要呈现比较复杂的场景时,你就最好考虑使用位图实现。 
  虽然Flash在对位图的渲染效率上并不是最优越的(比如和Flash的“兄长”Director比起来),但丰富的视觉内容呈现只能靠位图(与 位图同复杂度的矢量图形渲染速率非常低)了,这也是很多基于区块的游戏中广泛采用像素图作为背景的原因。 
  顺便要提到的是,Flash虽然对GIF,JPG和PNG都有所支持,但是渲染速度上PNG还是占有绝对优势,所以建议flash中的位图都尽可 能采用PNG格式。 
  12、运用线条时,尽量减少和避免冗陈的线条结构,因为它们会直接影响到flash的播放效率。 
  13、当某个实例透明度小于1时,也会对播放速率造成影响。 
  14、尽量使用单独一个onEnterFrame事件,因为如果给过多的MoveClip添加这样的事件,很可能会导致“无头绪码 (spaghetti code)”的出现,并且容易导致程序效率明显下降。 
  15、用乘-1来代替Math.abs()方法。比如 
  var nn:Number = -23; 
  var test:Number= nn >0)来代替。比如 
  var test:uint =1.5>>0,比unit()或int()更快。 
  17、用位运算代替除2或乘2。比如10>>1要比10*2快,而10>1来代替13/2,尽管前者比后 者运算速度更快,但2者的运算结果却不一样。所以还是要看具体情况。 
  18、用乘法来代替除法(当除数可转化为有限数的时候)。比如 
  var n:Number = value * 0.5; 
  要比 
  var n:Number = value / 2;快。 
  但差别并不是很大。只有在需要大量计算情况下,比如3D引擎中差别才比较明显。
  再来说一下提高Flex程序性能的10个秘诀:
  规则 # 1: 打扫代码
  一般来说,保持代码清 洁是一个很好的习惯。这可并不仅是写出的代码很整齐并具有良好可读性的,而且还得不留任何累赘,比如:内存泄露,cpu超载等,这些必须要避免。我们需要 的是可以被GC(垃圾回收)回收的对象。
   1) 管理你的事件监听器 -包含两部分。首先,你必须养成随时删除无用的事件监听器的良好习惯,因为这些监听器带来的对象引用会阻止垃圾回收器从而造成内存泄露,而且它们还很难跟 踪并且影响程序的性能。当然,你可以使用弱引用事件监听器以降低内存泄露的危险,但是你最好还是在它们没用的时候把它们删掉。其次,删除事件监听器失败会 引发性能问题,因为,尽管你有十个不愿意,但是相应的事件处理器可能已经开始工作了。比如,你在子组件里分发了一个事件,父对象中存在处理这个事件的处理 器,然后处理永远不会到来的事件(监听器被删除)。如果你不希望这种事发生,就得及时清理事件处理器;让它们只处理特定的事件类型,当你不用时就删除它 们。
   2) 卸载加载 - 每次你使用加载器(图像,SWFLoader等等)加载对象后,最好调用unloadAndStop()方法来卸载加载的内容,并让GC来回收这些垃圾。这样会 大大节省系统资源和cpu的使用。我甚至每次加载静态图片文件时也会这么做,以便防止内存占用过大。
   3) 清除东西 -我发现在自定义组件,数据管理和视图中使用“dispose()”方法非常有效,它可以用来清除对象资源。虽然在你使用完一个对象时,你必须 明确的调用dispose()方法,但是这个方法却可以处理所有需要清除的对象以便释放资源。比如,停止计时器,移除事件监听器,卸载加载器对象,设置变 量为空等等。简单点说,它可以去掉任何可能导致内存泄露或cpu超载的东西。当然,dispose()本身也需要消耗cpu,但是请相信我,这和耗费时 间,占用计算机资源,跟踪内存泄露和影响性能相比,简直微乎其微。
   Rule #2:   I如果你不必要做某些事,那就别做
  另一个规则就是:如果你不必要做某些事,那就别做。当然这并不代表着你“不用上班”,“不用刷牙”,你当然得干这些事。我的意思是如 果没必要的话,就不要做一些影响计算机性能和增加资源开销的事。
   4) 处理Collection -我总是看到一些东西,我一看到这些东西就有一种想立刻改变它们的冲动。Collection(ArrayCollection,XMLListCollection, 等等)是一种包装了原始集合类(比如array或xmllist)的帮助类,它们使开发人员操作原始集合更加方便和简单,但是同时它们也会消 耗大量cpu资源。绑定collection的原因是因为每次你添加,移除,更新时,事件就会被分发出去。每次你刷新collection时,它们也会分 发事件。
  秘诀1,你必须考虑collection产生的事件。如果你遍历一个集合, 然后更新了10000项数据,那么10000个事件就会被分发出去。这会大大影响性能,还有可能搞死程序的UI。如果集合里的某些事件不必要分发出去,你 可以使用disableAutoUpdate()方法来终止事件的分发,需要时再用enableAutoUpdate()方法来还原。
  秘诀2,如果你没必要使用collection,那就别用。如果你只是简单的遍历10000 项数据,那么用array就可以了。
  在第3个秘诀是关于使用过滤方法过滤 collection。如果在collection中使用过滤方法,那么你就不需要在每次添加新数据时都调用refresh()方法了。当然这也会在你最 不希望的地方产生性能问题。举个例子,你把一个datagrid和一个collection绑定,然后更新这个集合。如果集合中有过滤器,当你调用 additem方法时会被自动过滤,如果你在添加数据后调用refresh()方法,则会导致datagrid中的数据无效,因为整个datagrid都 被重新拿出来校验了一遍。这会在一定程度上影响程序的性能。
   5) 使用延时实例化 - 默认情况下,Flex的所有导航容器(tab nav, accordion, viewstack等等)只会在需要时才创建子容器。这会使程序减少很多冗余的容器,从而提升程序的性能。如果你不小心的话,改变生成规则会带来很多问 题。
  当创建自定义组件时,你要拥有一种延时实例化的意识。不要在构造函数中 创建子对象,而是要覆盖createChildren()方法,然后在这个方法里创建它们。这样,你的组建就会遵循延时实例化规则,从而较少性能的降低。
   6) 对象重用和新对象 - 我以前写过这个话题,但是我在这里还是要重申一遍,重用已经存在的对象比创建新对象要减少很多的开销。你可以参 考这个数据虚拟化。
   7) 如果没有任何改变就不要/删除/重新校验 对象
  如果你创建了一个自定义组件,然后有人改变了一个属性(通过getter/setter),如果传入的值没有改变的化,就不要校验组件 属性了。因为这可能导致组件重新走一遍校验流程。有改变时再校验。这有个例子:
  public function set myProperty( value : Number ) : void
  {
  if ( _myProperty != value )
  {
  _myProperty = value;
  propertiesChanged = true;
  invalidateProperties();
  dispatchEvent( new Event( "change" ) );
  } 
  }
   Rule #3: 合理地利用语言
  AS语言包含很多有关性能的特性,请使用。
   动态/泛型 vs 类型对象- 动态和泛型对象都有自己的位置。它们很灵活,可以被修改成任何属性,能在很多情况下使用。话虽如此,但是如果你不需要使用泛型的特性,那么最好还是定义成 强类型对象。因为使用强类型正是AS速度很快的原因。用强类型定义的对象显然比泛型要快。
   9) 在适当的情况下使用常量 - 如果你有一个不变的值,但是却需要随时引用,那就用常量吧。常量的速度很快,而且开销很小。
   10) 使用静态成员 - 静态属性和函数不需要实例化就能访问和调用,因此能够通过类来直接访问它们,而且不需要占用内存空间来实例化对象。工具函 数,或者不需要实例化属性的函数都可以被定义为静态函数。
  再
分享到:
评论

相关推荐

    Flex 应用程序性能: 改善客户端应用程序和服务器性能的技巧与技术

    ### Flex 应用程序性能:改善客户端应用程序和服务器性能的技巧与技术 #### 概述 随着互联网技术的发展,富互联网应用(RIA)的需求日益增长。Macromedia Flex 是一个强大的平台,它允许开发者创建高性能的 RIA。...

    Flex应用程序性能改善技巧

    Flex应用程序性能改善技巧是开发人员在构建富互联网应用时必须关注的重要领域。Flex作为一个基于ActionScript和Flash Player的开发框架,提供了丰富的用户界面组件和强大的数据处理能力,但如果不加以优化,可能会...

    测试flex应用程序

    在IT行业中,Flex是一种用于构建富互联网应用程序(RIA)的框架,它基于ActionScript和Flash Player或Adobe AIR运行时。Flex应用程序通常具有丰富的用户界面,能够提供动态交互体验。而当我们需要对这些Flex应用程序...

    Adobe Flex编码指南v1.2(AS3 Flex3程序代码编写规范)

    《Adobe Flex编码指南v1.2(AS3 Flex3程序代码编写规范)》是一本针对Adobe Flex开发者的专业指南,旨在提供AS3编程语言和Flex3框架下的代码编写规范和最佳实践。这篇博客链接(https://hereson.iteye.com/blog/190878...

    微信小程序+Flex布局示例源代码

    通过查看和学习这些源代码,开发者可以更好地理解如何在微信小程序中应用Flex布局,解决各种页面布局问题,提升用户体验。 总之,Flex布局是现代前端开发中不可或缺的一部分,特别是在微信小程序这样的跨平台开发...

    flex例子.flex源程序

    2. **Flex Component Lifecycle**: 每个Flex组件都有自己的生命周期,包括创建、初始化、显示、尺寸改变和销毁等阶段,理解这些阶段对于优化性能和处理用户交互至关重要。 3. **MXML**: MXML语法类似于XML,可以...

    Flex4:开发RIA应用程序

    - 提供了改进的性能优化,如异步模块加载、模块化应用程序的快速开发等。 3. 开发环境: - Adobe Flash Builder 4:一个基于Eclipse的集成开发环境(IDE),支持MXML和ActionScript的开发。 - Flex SDK:一套开发...

    flex源代码资料,一些flex源代码的例子

    Chapter_12可能涉及Flex中的高级主题,如自定义组件开发、性能优化和错误处理。开发者可能会学习如何扩展Flex的内置组件,创建自己的UI组件库,以及如何通过优化代码和资源管理来提升应用程序的运行效率。 Chapter_...

    Flex代码格式化 Flash格式化代码 mxml格式化代码 as格式化代码

    常用的Flex、Flash、MXML和AS代码格式化工具有Adobe的Flash Builder自带的代码格式化功能,以及开源的编辑器插件,如FDT、FlashDevelop和Sublime Text的插件。这些工具通常提供了自定义配置选项,允许开发者根据...

    [使用Flex4.5开发Android应用程序].源代码

    《使用Flex4.5开发Android应用程序》的源代码是一份宝贵的资源,它涵盖了Adobe Flex 4.5技术在Android平台上的应用开发知识。Flex 4.5,也被称为Flash Builder 4.5,是一款强大的集成开发环境(IDE),用于创建富...

    12条常用Flex代码 值得收藏

    Flex是一种功能强大且灵活的Rich Internet Application(RIA)开发平台,广泛应用于桌面应用程序、移动应用程序、Web应用程序等。对Flex开发者来说,掌握基本的Flex代码是非常必要的。以下是12条常用的Flex代码,...

    Adobe Flex3 程序设计指南 源代码

    2. **数据绑定**:Flex3支持双向数据绑定,允许界面元素和应用程序数据之间自动同步。通过源代码,我们可以学习如何实现和利用这一特性。 3. **服务调用**:Flex3支持与服务器端进行数据交换,包括AMF(Action ...

    Flex 性能优化全集

    通过对Adobe Flex应用程序进行细致的性能优化,不仅可以提升用户体验,还能有效减少服务器负载,提高整体系统效率。开发者应该密切关注应用的实际运行情况,适时调整优化策略,以应对不断变化的需求和技术环境。

    flex3应用程序示例

    在Flash Builder 3中开发Flex应用程序,用户可以利用其强大的集成开发环境(IDE),包括代码编辑、调试和性能分析工具,简化开发流程。Flash Builder 3是专为Flex和ActionScript开发设计的,提供代码提示、自动完成...

    Flex代码

    而“工具”标签则暗示可能讨论了Flex Builder或其他辅助开发工具的使用技巧,或者是如何结合Greensock AS3这个动画工具提升Flex应用的性能和视觉效果。 【压缩包子文件的文件名称列表】:“greensock-as3” 这个...

    AS3应用程序开发框架实例

    “RIA企业级的AS3应用程序开发框架”标签表明了这个实例的重点在于如何利用AS3和Flex框架构建高性能、用户体验良好的企业级RIA。RIA能够提供与桌面应用类似的用户体验,包括动态交互、实时更新和丰富的图形效果,而...

    flex svg代码生成图片

    使用 Degrafa 框架,可以在 Flex 应用程序中动态显示和操作 SVG 文档。通过解析 SVG 文件,然后通过 Flex 生成图片。动态加载 SVG 图片可以实现大量的 SVG 图形资源直接在 Flex 应用程序中使用。 三、解析 SVG 文件...

    apache Mina和Flex as3.0 交互

    总结起来,Apache Mina和Flex AS3.0的交互涉及到网络通信、数据交换、服务端和客户端API的使用、事件驱动编程以及安全性与性能优化等多个方面。这种交互方式为开发高效、功能丰富的跨平台应用程序提供了可能,使...

Global site tag (gtag.js) - Google Analytics