Flex性能考虑

13
灵活开发者应记住以下关键要点以提高Flex应用程序的性能:
  1. 从更轻量级的基类(如UIComponent)扩展ItemRenderers。
  2. 对于动画,将suspendBackgroundProcessing设置为true。
  3. 在适当的情况下使用ArrayLists而不是ArrayCollections。
  4. 在Spark DataGroups中使用useVirtualLayout(不幸的是,这一步需要滚动条才能使此建议有效)。
  5. 对于AIR应用程序,使用SQLight性能优化(例如事务)。
  6. 可能将长时间的数据处理分成不同的帧?(虽然我可能会弄错,因为我从未尝试过这样做)
在开发Flex3/Flex4/AIR应用程序时,您尝试遵循以下关键指南以提高其性能:
- 最小化使用深嵌套组件和层叠视图。 - 将重复的代码块封装成可重用的组件。 - 尽可能减少绑定表达式的使用。 - 使用局部变量而不是全局变量来节省内存。 - 优先使用Flash Player本地功能(如Vector和ByteArray)而不是ActionScript库函数。 - 对于大量数据的处理,在后台线程中执行操作以防止阻塞UI线程。
4个回答

7

我觉得很多人在使用itemRenderers时都会遇到性能问题。因此,我的一个建议是尽量不要在itemRenderer中使用绑定。我曾经通过将itemRenderers重写为使用dataChange事件而不是绑定来修复了许多客户的“内存泄漏”问题。

除此之外,我赞同@Wade Mueller的评论,尽可能避免使用嵌套容器。


当你说重写itemRenderer以使用dataChange事件而不是绑定时,你的意思是什么?你是否意味着覆盖set data方法并在那里分配值,而不是在itemRenderers组件中逐个分配值? - Jason Towne
@Jason Towne 在itemRenderer中,添加一个数据改变事件(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/events/FlexEvent.html#DATA_CHANGE)的事件监听器,并在事件处理程序中分配值。这与覆盖setData方法略有不同;但是,无论哪种方式,分配值的概念都是相同的。我更喜欢侦听dataChange事件而不是覆盖setData方法;但我没有选择其中一种方法的好理由。 - JeffryHouser

6

虽然对于轻量级的Spark Groups而言,这个问题并不那么重要,但我总是尽量将嵌套容器的数量降至最低,并在可能的情况下设置明确的位置/大小。复杂的UI界面中,嵌套动态大小的容器会导致大量(通常是不必要的)测量操作。这经常会导致在视图之间切换时出现严重的延迟。


好的,我将把我的<s:DataGroup与ItemRenderer切换到更手动的方法。 - marko

6

我的列表:

  • 尽可能使用局部变量而不是全局变量
  • 尽可能使用ActionScript而不是MXML
  • [Bindable]会生成大量代码,尽量避免使用它

P.S. 作者,你会说俄语吗? :)


哦,我们的人无所不在 ;) - Daniil Moskovtsov

1

我考虑的主要事项,按重要性排序:

  1. 绑定

    • 会创建大量额外的代码,并且当绑定没有被移除时会导致性能严重下降。例如,如果在应用程序中重复使用组件,则监听函数在整个应用程序流程中处于活动状态,消耗不必要的内存和CPU周期。对于较大的应用程序,请考虑使用BindingUtils类。

    • 请注意,您不能取消使用花括号{myVariable}绑定的属性

  2. 验证(使无效)调用是 Flex 中最昂贵的调用之一。在使用它们时要小心。

    validateNow();

  3. 了解 Flex 组件生命周期。覆盖这些方法可以简化实例化过程。

  4. 使用向量对象。更多信息

  5. 整数>数字。优秀的SO答案
一些更基本的提示:
  1. 不要在循环中使用昂贵的操作。

    for(var i:int = 0; i < massiveArray.length; i++)
    

    对于非常大的数组massiveArraylength()可能是一个昂贵的操作。为了提高性能,请分配 var massiveArrayLength:int = massiveArray.length;

  2. http://jacksondunstan.com/拥有大量关于优化代码的文章。这个人是个天才。

  3. 避免创建不必要的变量,因为实例化是昂贵的。如果可能的话,始终重用变量。

    function getComplexValue():int {
        var i:int = complexCalculation(); // 返回计算后的 int
        return i;
    }
    

    相反,立即返回。

    function getComplexValue():int {
        return complexCalculation();
    }
    
  4. 如果可以访问它,Flash Profile 将是您的朋友。它是一个强大的分析器,可以减少优化代码库所需的时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接