`

提升您Flex应用性能 (转)

阅读更多

原帖地址:http://blog.csdn.net/xingjunli/archive/2010/01/14/5186058.aspx

 

在RIA应用开发过程中,性能一直是我们关注的一个重点;生成swf文件的大小,内存、cpu资源消耗,事件响应等,都将影响用户在浏览或者使用过程中的体验;
    这就要求我们在平时的开发过程中养成良好的编程习惯,合理使用组件,避开一些较消耗资源的因素。本文将针对这些问题展开一些讨论:
    1、初始化对象时优化:
        1.1、可能的话使用AS来创建你的组件/类(通常通过代码绘制和创建的实例运行效率更高(如使用graphics绘制图形))
        1.2、为property分配初始化默认值:(如:<mx:TextArea text="hi" width="100" />)
        1.3、连接对象:
            1.3.1、将新的对象添加到已显示的列表中
            1.3.2、绑定事件处理函数:<mx:Button click="goNext()" />;
            1.3.3、数据绑定:<mx:label text="{city}" />;
            1.3.4、监听Effect效果:<mx:label showEffect="{fade}"/>;
        1.4、延迟对象创建(默认延迟实例化Flex在启动时不会构建任何子对象视图):
            1.4.1、直到对象需要显示时再创建实例;
            1.4.2、使用Flex中的导航容器(如According、ViewStack、TabNavigator)中内置的推迟实例化功能;
            1.4.3、子ViewStack容器比自定义容器更简单高效
        1.5、依次顺序创建:
            1.5.1、启动过程中错开对象的创建
            1.5.2、使用creationPolicy属性优化启动时间及顺序(如下:顺序依次创建)
            <mx:Applicaion>
            <mx:Panel width="250" heigth="100" creationPolicy="queued"> //顺序创建组件,想插队的话设置creationIndex
                <mx:label text="one" />
            </mx:Panel>
            <mx:Panel width="250" heigth="100" creationPolicy="queued">
                <mx:label text="two" />
            </mx:Panel>
            </mx:Applicaion>
            1.5.3、谨慎使用<mx:Repeater>:
                1.5.3.1、不推荐使用 <mx:Repeater>创建立重复组件
                     糟糕的:<mx:VBox>
                            <mx:Repeater id ="r" dataProvider="{arry}">
                                <mx:Image source="r.currentItem.url" />
                                </mx:Repeater>
                            </mx:VBox>
                 推荐:<mx:List dataProvider ="{arry}">
                            <mx:itemRenderer>
                                <mx:Component>
                                    <mx:Image source="{dataObject.url}" />
                                </mx:Component>
                            </mx:itemRenderer>
                        </mx:List>
                说明:直接创建组件放在Scroll中效率更高
    2、优化你的布局和组件大小:
        2.1、定义:
            尽可能在初始化和创建的过程中为所有组件设置其位置和大小
            <mx:Application>
                <ms:HBox>
                    <mx:Button label="1" />
                    <mx:Button label="2" />
                </ms:HBox>
                <mx:textArea width="100%" height="100%" text="text" />
            </mx:Application>
        2.2、描述(尽可能多的使用绝对定位和缩放):
            2.2.1、设置(需要知道所有动态设置大小,自适应都将涉及到大量的运算):从下至上(从内向外)遍历可视组件树
                2.2.1.1、为类似Button 、TextArea的组件设置大小
                2.2.1.2、为HBox组件设置大小
                2.2.1.3、为主Applicaton设置大小
            2.2.2、布局:从上至下(从外向内)遍历可视组件树:
                2.2.2.1、给Application设置大小,为HBox textArea设置位置
                2.2.2.2、给HBox设置大小,为Button设置位置
            2.2.3、运算法则:设置属性n为数字或者对象
        2.3、减少并避免容器多层嵌套:
            2.3.1、尝试使用HBox 和VBox代替Grid
            2.3.2、避免在Applicaton的VBox外再嵌套一个Panel
            2.3.3、不要在MXML组件的根节点下嵌套一个子容器
            2.3.4、推荐使用Canvas这种效率最高的容器
            2.3.5、警告:一个容器通常推荐只包含一个子节点
        2.4 、避免重复设置和布局:
            2.4.1、场景1:当请求的图片较多时(如超过25个),建议所有图片都装载完成后再循环设置其大小和布局
            2.4.2、场景2:当有多个窗体都需要请求WebService时,循环WebService响应,只改变请求窗体的大小
            2.4.3、备注:将请求延迟到窗体创建完成(在 Layout完成之后),在请求和响应的过程中尽量不要使用几何图形方面的变化,尽可能错开请求或者响应的消息队列
    3、优化呈现(Rendering):
        3.1、重绘区域:
            3.1.1、如果一个对象的属性发生了变化,哪么它的边框是“重绘区”
            3.1.2、可视化“显示重绘区域”(调试播放器适用)
            3.1.3、对象重叠区域的重绘
        3.2、缓存位图保持原有状态(cachePolicy):
            3.2.1、如果缓存位图为true,对象和它的子对象都呈现为屏幕外(内存)视图
            3.2.2、如果对象重叠重绘区和对象没有改变则使用缓存位图
        3.3、缓存位图是一把双刃剑:
            3.3.1、如果对象缓存了位图,当对象改变时开消是昂贵的
            3.3.2、如缓存了位图在应用 resize Effect /resize浏览器窗口时都会损失性能
            3.3.3、建议仅在短时间内缓存位图
        3.4、影响呈现(Rendering)速度的因素:
            3.4.1、重设、重绘区域;建议:重构UI
            3.4.2、缓存位图(帮助/损失)
            3.4.3、所有矢量图重绘区;建议:简化矢量图形状、在重设大小和状态转换过程中隐藏子节点;
            3.4.4、混合文本和矢量图形
            3.4.5、使用剪切遮罩(如加载组合大图剪切应用小图,减少多次图片请求加载)
            3.4.6、合理使用filters(如创建阴影)
            3.4.7、其它后台处理过程(如建议将Effect延迟至后台处理)

    4、其它优化:
        4.1、移除没有使用的UI或者事件监听(或者变成弱应用):
            myViewStack.removeChild(childView);
            childView.removeEventListener("click",clickHandler) ;
        4.2、清除没有被引用或者使用的数据:
            myProperty = null;
            myWebservice.getAddressBook.clear.Result();
        4.3、使用样式:
            4.3.1、改变和重设样式代价最昂贵:
                 StyleManager.styles.Button.setStyle("color",0xff0000);
            4.3.2、内联样式的代价与对象的数量成正比的:
                myVBox.setStyle("color",0xff0000);
            4.3.3、在初始化的过程中尽早的设定样式(在initialize时而不是在createComplete时)初始化设置样式应用使用<mx:Style>标签:
                <mx:Style>Button{color:#0xf0000}</mx:Style>
                <mx:VBox id="myVBox" color="oxffffff"/>
            4.3.4、避免使用setStyle()如确实需要,则应在实例化节点时尽早调用
        4.4、使用内存分析工具(profiling tools)检测资源使用情况查找内存泄露 :
            4.4.1、方法调用频繁
            4.4.2、方法持续时间
            4.4.3、堆栈调用
            4.4.4、对象实例总数
            4.4.5、对象大小
            4.4.6、垃圾收集... ...
        4.5、根据功能模块化动态装载(不要让用户为他可能不会用到的功能模块买单,尽管用户在首次切换时可能需要花费比较多的代价)
    5、减少和压缩SWF体积
        5.1、减少内置资源(如字符集,图片,视频,音频(Embeded)标签)等)的加载;使用外部文件尽量运行时载入而不是编译时嵌入
        5.2、禁止调试,同时删除一些专们为记录调试环境的数据和方法
        5.3、避免引入一些不必要的包和类;
        5.4、使用RSL分离和缓存框架(framework.swc)以减小生成文件体积:




以下是一网络资源记下来参考:
Flex性能优化常用手法总结:
内存释放优化原则
    1. 被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉;
    2. 父对象内部的子对象被外部其他对象引用了,会导致此子对象不会被删除,子对象不会被删除又会导致了父对象不会被删除;
    3. 如果一个对象中引用了外部对象,当自己被删除或者不需要使用此引用对象时,一定要记得把此对象的引用设置为null;
    4. 本对象删除不了的原因不一定是自己被引用了,也有可能是自己的孩子被外部引用了,孩子删不掉导致父亲也删不掉;
    5. 除了引用需要删除外,系统组件或者全局工具、管理类如果提供了卸载方法的就一定要调用删除内部对象,否则有可能会造成内存泄露和性能损失;
    6. 父对象立刻被删除了不代表子对象就会被删除或立刻被删除,可能会在后期被系统自动删除或第二次移除操作时被删除;
    7. 如果父对象remove了子对象后没有清除对子对象的引用,子对象一样是不能被删除的,父对象也不能被删除;
    8. 注册的事件如果没有被移除不影响自定义的强行回收机制,但有可能会影响正常的回收机制,所以最好是做到注册的事件监听器都要记得移除干净。
    9. 父对象被删除了不代表其余子对象都删除了,找到一种状态的泄露代码不等于其他状态就没有泄露了,要各模块各状态逐个进行测试分析,直到测试任何状态下都能删除整个对象为止。
内存泄露举例:
    1. 引用泄露:对子对象的引用,外部对本对象或子对象的引用都需要置null;
    2. 系统类泄露:使用了系统类而忘记做删除操作了,如BindingUtils.bindSetter(),ChangeWatcher.watch()函数 时候完毕后需要调用ChangeWatcher.unwatch()函数来清除引用 ,否则使用此函数的对象将不会被删除;
    类似的还有MUSIC,VIDEO,IMAGE,TIMER,EVENT,BINDING等。
    3. 效果泄露:当对组件应用效果Effect的时候,当本对象本删除时需要把本对象和子对象上的Effect动画停止掉,然后把Effect的target对象置null; 如果不停止掉动画直接把 Effect置null将不能正常移除对象。
    4. SWF泄露:要完全删除一个SWF要调用它的unload()方法并且把对象置null;
    5. 图片泄露:当Image对象使用完毕后要把source置null;(为测试);
    6. 声音、视频泄露: 当不需要一个音乐或视频是需要停止音乐,删除对象,引用置null;
内存泄露解决方法:
    1. 在组件的REMOVED_FROM_STAGE事件回掉中做垃圾处理操作(移除所有对外引用(不管是VO还是组件的都需要删除),删除监听器,调用系统类的清除方法)
    先remove再置null, 确保被remove或者removeAll后的对象在外部的引用全部释放干净;
    2. 利用Flex的性能优化工具Profile来对项目进程进行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用量,创建过程等信息;
总结:关键还是要做好清除工作,自己设置的引用自己要记得删除,自己用过的系统类要记得做好回收处理工作。 以上问题解决的好的话不需要自定义强制回收器也有可能被系统正常的自动回收掉。


代码优化:

FLEX how to reduce the amount of code to reduce memory consumption  


These are some ways to reduce the code or memory, select an author of the network.


1. Avoid the new operator when creating Arrays
    var a = [];
NOT:
    var a = new Array();
2. Arrays are expensive to create, do so conservatively
    var vanityCollection01 : Array = new Array();
    var vanityCollection02 : Array = new Array();
    var vanityCollection03 : Array = new Array();
    var vanityCollection04 : Array = new Array();
3. Fastest way to copy an array:
    var copy : Array = sourceArray.concat();
4. Setting values in Arrays is slow
    employees.push( employee );
    employees[2] = employee;
5. Getting values from Arrays is twice as fast as setting
    var employee : Employee = employees[2];
6. Use static for properties methods that do not require an object instance
    StringUtils.trim( "text with space at end " );
    Class definition:
    package
    {
    public final class StringUtils
    {
    public static function trim( s : String ) : String
    {
    var trimmed : String;
    // implementation...
    return trimmed;
    }
    }
    }
7. Use const for properties that will never change throughout the lifecycle of the application
    public const APPLICATION_PUBLISHER : String = "Company, Inc.";
8. Use final when no subclasses need to be created of a class
    public final class StringUtils
9. Length of method/variable names doesn’t matter in ActionScript 3.0 (true in other langs)
    someCrazyLongMethodNameDoesntReallyImpactPerformanceTooMuch();
10. One line assignments DO NOT buy any performance (true in other langs)
    var i=0; j=10; k=200;
11. No difference in memory usage between an if statement and a switch statement
    if ( condition )
    {
    // handle condition
    }
IDENTICAL MEMORY USAGE:
    switch ( condition ) {      
    case "A":          
    // logic to handle case A      
    break;            
    case "B":          
    // logic to handle case B       
    break;
    }
12. Rank your if statements in order of comparisons most likely to be true
     if ( conditionThatHappensAlot ) {
    // logic to handle frequently met condition
    } else if ( conditionThatHappensSomtimes )  {      
    // handle the case that happens occaisonally } else  {      
    // handle the case that doesn&#8217;t happen that often
    }
13. AVM promotes int to Number during calculations inside loops (VM has been changing, from 9 to 10, so int, uint and number conversions aren’t as slow as they used to be.)
14. Resolve issues of promotion, unknown, or incorrect object types
15. Use uint sparingly, it can be slow (VM has been changing, from 9 to 10, so int, uint and number conversions aren’t as slow as they used to be.)
     var footerHex : uint = 0x00ccff;
16. Use integers for iterations
    (var i: int = 0; i < n; i++)
NOT
    for (var i: Number = 0; i < n; i++)
17. Don’t use int with decimals
    var decimal : Number  = 14.654;
NOT:
     var decimal : int  = 14.654;
18. Multiply vs. Divide: instead of 5000/1000 use: 5000*0.001
19. Locally store function values in for and while statements instead of repeatedly accessing them
     for (..){ a * 180 / Math.PI; }
    declare: toRadians = a*180/Math.PI;
    outside of the loop
20. Avoid calculations and method calls in loops
     var len : int = myArray.lengh;  
     for (var i=0;i<len;i++){}
NOT:
     for (var i=0;i< myArray.lengh;i++){ }
21. Use RegEx for validation, use string methods for searching
     // postal code validation example using regular expressions
    private var regEx:RegExp = /^[A-Z][0-9][A-Z] [0-9][A-Z][0-9]$/i;
    private function validatePostal( event : Event ) : void
    {      
    if( regEx.test( zipTextInput.text ) )
    {
    // handle invalid input case
    }
    // search a string using String methods
    var string : String = "Search me";
    var searchIndex : int = string.indexOf( "me" );
    var search : String = string.substring(searchIndex,searchIndex+2);
22. Reuse objects to maintain a “memory plateau” DisplayObjects, URLLoader objects
23. Follow the Flex component model:
     createChildren(); commitProperties(); updateDisplayList();
24. Only use Datagrids as a last resort (make sure you can’t implement in a regular List first)
25. Avoid Repeaters for scrollable data
26. Avoid the setStyle() method (One of the most expensive calls in the Flex framework)
27. Using too many containers dramatically reduces the performance of your application
    <mx:Panel>
    <mx:VBox>
    <mx:HBox>
    <mx:Label text="Label 1" />
    <mx:VBox>
    <mx:Label text="Label 2" />
    </mx:VBox>
    <mx:HBox>
    <mx:Label text="Label 3" />
    <mx:VBox>
    <mx:Label text="Label 4" />
    </mx:VBox>
    </mx:HBox>
    </mx:HBox>
    </mx:VBox>
    </mx:Panel>
28. You do not need to always use a container tag as the top-level tag of components Totally valid component, no top level container needed:
    <mx:Image xmlns:mx="http://www.adobe.com/2006/mxml"
    source="avatar.jpg" width="200" height="200" />
29. Remove unnecessary container wrappers to reduce container nesting
30. Avoid: The VBox container inside an tag, (eliminates redundancy)
    <mx:Panel>
    <mx:Label text="Label 1" />
    <mx:Label text="Label 2" />
    </mx:Panel>
    <mx:Panel>
    <mx:VBox>
    <mx:Label text="Label 1" />
    <mx:Label text="Label 2" />
    </mx:VBox>
    </mx:Panel>
31. Avoid: VBox container inside an mx:Application tag, (eliminates redundancy)
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx=http://www.adobe.com/2006/mxml>
    <mx:Label text="Label 1" />
    <mx:Label text="Label 2" />
    </mx:Application>
NOT:
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx=http://www.adobe.com/2006/mxml>
    <mx:VBox>
    <mx:Label text="Label 1" />
    <mx:Label text="Label 2" />
    </mx:VBox>
    </mx:Application>
32. Set the recycleChildren property to true to improve a Repeater object’s performance (re-uses previously created children instead of creating new ones)
     <mx:Script>
    <![CDATA[
    [Bindable]         
    public var repeaterData : Array = ["data 1", "data 2"];
    ]]>
    </mx:Script>
    <mx:Repeater id="repeater" dataProvider="{repeaterData}">
    <mx:Label text="data item: {repeater.currentItem}"/>
    </mx:Repeater>
33. Keep framerate set at 60 fps or lower
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx=http://www.adobe.com/2006/mxml  
    frameRate="45">
    </mx:Application>
34. Avoid multiple display manipulations per frame
35. Code against ENTER_FRAME events instead of Timer events
    public function onEnterFrame( event : Event ) : void
    { }
    private function init() : void {
    addEventListener( Event.ENTER_FRAME, onEnterFrame );
    }
NOT:

    public function onTimerTick( event : Event ) : void
    {
    }
    private function init() : void {      
        var timer : Timer = new Timer();
        timer.start();
        timer.addEventListener( TimerEvent.TIMER, onTimerTick );
    }
36. To defer object creation over multiple frames use:
     <mx:Container creationPolicy="queued"/>
37. Alpha = 0 is not the same as visible = false (Objects marked invisible are passed over)
    loginButton.visible = false;
    NOT:
    loginButton.alpha = 0;

分享到:
评论

相关推荐

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

    本文旨在探讨提升 Flex 应用程序性能的方法和技术,分为客户端和服务器端两个方面。 #### 客户端性能优化 ##### 缩短启动时间 启动时间对于用户感知的性能至关重要。为了减少启动时间,可以通过以下几种方法来实现...

    Flex应用程序性能改善技巧

    通过以上这些技巧,开发者可以显著提升Flex应用程序的运行效率,提供更加流畅的用户体验。对于深入学习和实践,可以查阅"Flex应用程序性能改善技巧.pdf"文档,它将提供更多细节和示例。记住,性能优化是一个持续的...

    Flex应用案例.zip

    Flex是Adobe公司开发的一种用于构建富互联网应用程序(RIA)的技术框架,主要基于...通过学习和实践"Flex应用案例",开发者可以更好地掌握Flex的用法,并将其应用到实际项目中,提升软件的用户体验和功能完整性。

    flex企业应用开发实践.pdf

    通过这些优化措施,可以显著提升Flex应用的运行效率和用户体验,为企业级应用的稳定运行和高效运作奠定坚实基础。 总之,《Flex企业应用开发实践》不仅是一本关于Flex+Java企业级应用开发的理论指南,更是一部实战...

    企业应用FLEX开发实战

    第五章和第六章可能会探讨FLEX中的数据服务,如AMF通信、Web服务调用和 BlazeDS/LiveCycle Data Services的使用,让FLEX应用程序能够与后端服务器无缝交互,实现数据的获取和更新。 第七章至第九章可能涉及更高级的...

    17个典型的Flex应用案例介绍

    本篇文章将深入探讨17个典型的Flex应用案例,这些案例展示了Flex在不同领域的广泛应用和卓越性能。 1. **Vook com**:Vook是一款结合了文字、视频和互动元素的创新阅读体验平台。Flex的多媒体功能在此得以充分发挥...

    ArcGIS API for Flex应用开发

    - **Clusterers**:用于处理地图上的大量点数据,通过聚合技术减少地图上的数据量,提升性能。主要包括 GridClusterer 和 WeightedClusterer。 - **Components**:提供了一组可重用的组件,如图例、导航工具栏等,...

    用Flex写的照片旋转

    Flex是一个开源的、基于ActionScript的框架,主要用于构建富互联网应用程序(RIA),它提供了一整套组件和工具,使开发者可以创建具有动态图形、交互性和数据绑定功能的应用程序。 在描述中提到的“Flex开发的,...

    flex立方体旋转

    Flex是一种基于ActionScript的框架,常用于构建富互联网应用程序(RIA),它提供了强大的布局管理和动画功能。 首先,我们要了解Flex中的核心概念——Flex布局。Flex布局允许开发者创建复杂的用户界面,并自动调整...

    flex性能优化文档

    此外,还可以考虑其他优化策略,比如使用位图缓存提高图形渲染效率,优化数据绑定,减少不必要的计算,以及利用Flash Player的多帧特性实现内容的流式加载,以进一步提升Flex应用的性能。 总之,优化Flex应用性能...

    FLEX企业应用开发实战PDF

    9. **部署和发布**:最后,书会讲解Flex应用程序的打包、部署和发布策略,包括在不同的服务器平台(如Tomcat、IIS)上的部署方法。 10. **最佳实践和案例分析**:书中还会包含一些企业级应用开发的最佳实践,以及...

    Flex 性能简介.pdf

    #### Flex应用程序的性能改善 Flex之所以能够在服务器端表现出色,部分原因在于其独特的架构设计。与传统的Web应用程序相比,Flex应用程序通过减少与服务器之间的交互次数,减轻了服务器端的负担。此外,Flex利用了...

    ArcGIS Server Flex 应用视频

    10. **性能优化**:探讨如何提高Flex应用的性能,包括合理使用缓存、减少网络请求、优化地图渲染等技巧。 通过这些视频教程,开发者不仅可以学会如何构建基本的Flex地图应用,还能掌握高级功能的实现,从而充分利用...

    loadrunner for flex引用包

    在进行Flex应用的性能测试时,LoadRunner是一个不可或缺的工具。LoadRunner for Flex是HP公司推出的一款强大性能测试工具,专为Flex应用程序...在实际工作中,还要不断学习和实践,以应对日益复杂的Flex应用性能挑战。

    flex_与JSP性能比较分析

    #### 六、Flex应用程序的性能改善 Flex应用程序之所以能够在服务器端表现出色,主要是因为其独特的架构设计。Flex应用程序通过将大量逻辑处理和数据缓存在客户端,显著减轻了服务器的负担。这种设计模式使得Flex...

    flex应用anychart

    而AnyChart,作为一个跨平台的JavaScript图表库,能够无缝地与Flex结合,为Flex应用提供高质量、高性能的图表功能。 集成AnyChart到Flex应用的过程并不复杂。在提供的压缩包文件“AnyChartFlexComponent.swc”中,...

    flex 性能,查看内存

    Flex应用通常涉及大量的交互和动态数据处理,因此性能优化和内存管理是开发过程中的关键环节。以下是对Flex性能优化和内存查看的深入探讨: 1. **Flex性能优化**: - **代码优化**:减少不必要的计算,避免在循环...

    如何使用flex的profile进行性能分析

    【如何使用flex的profile进行性能分析】 Flex的profile工具是一个强大的性能分析工具,...使用flex profile进行性能分析是提升Flex应用性能的关键步骤之一,它提供了宝贵的数据和洞察力,有助于实现更高效的软件开发。

    构建Flex应用的10大误区

    构建Flex应用时,开发者常陷入一系列误区,这些误区可能导致应用性能下降、用户体验不佳或开发效率...同时,不断学习和适应新的开发趋势和技术,如BlazeDS、FlexUnit和TDD,将有助于提升Flex应用的整体质量和用户体验。

    flex学习笔记 flex学习总结 flex学习教程

    9. **Flex性能优化**:学习如何通过优化组件使用、减少网络请求、缓存策略等方式提升Flex应用的性能。 10. **实践项目**:理论学习后,通过实际项目练习,将所学知识应用于实践中,是巩固和提高技能的最佳方式。 ...

Global site tag (gtag.js) - Google Analytics