Flex性能优化常用手法总结

随着Flex越来越多的被人们所熟知,越来越多的互联网也开始了RIA应用 。众所周知,目前国内的宽带应用并不是像很多发达国 家发达,个人应用带宽基本上都是2M以下的,怎么样能够使你的Flex应用能够流畅的运行在客户端的问题,成为了制约每个Flex应用开发 程序 员的大难题。
在这里,我收集整理了一下网络上关于这方面经验,欢迎大家补充。

基本原则:
1. 从外部加载 媒体(Media)
      Heider提到了一个常用的Flex最佳实践——限制嵌入到应用/SWF文件 中的媒体的数量,如图像、影片及mp3等资源都可以 从外部的SWF文件加载。
Flex框架 可以直接将图片、mp3及字体等资源编译 到SWF中。当你想让最终用户获得全部资源时,这种 方式确实能派上用场,但是这会导致你的应用长时间停留在“Loading”阶段。

2. 在嵌入式字体中限制字符集
Heider建议在嵌入式字体中限制字符集以降低SWF文件的总下载时间:
当你在Flex中嵌入一种字体时,你就会获得该字体的全部字符的支持。尽管这可能是你想要的,但你确信你需要全部字符么?例如,在一个只面向英文的应用 中,你确信你真的想花时间下载中文字符数据 么?
3. 缓存框架
        Heider回顾了Flex 3 support for runtime-shared-libraries (RSL)这篇文章:

从Flex 3开始,你可以将Adobe 签名的框架——RSLs缓存到Flash Player的cache中。这有两个好处。首先,缓存在Flash Player cache中的签名的框架RSLs可由所有配置好的Flex应用共享。换句话说,如果某人的应用已经下载了500k的签名的框架RSL,并且该RSL仍旧 在Flash Player cache中,那么你的应用就可以使用缓存下来的RSL。其次,即使某人清空了其浏览器缓存,对Flash Player cache也没有任何影响。
4. 考虑模块化
Heider谈到了将Flex应用划分成模块的好处:减少字体加载时间的另一种方式就是将你的Flex应用划分成模块。使用模块的一个好处在于当加载和卸 载模块时你能完全操控它。
之所以要划分成模块的最后一个原因是他们更快,而且我能即时加载它们。换句话说,在启动时唯一需要加载的模块就是 Step1.swf 模块。因此,在使用模块的情况下,最终用户节省了启动时间,但是当他从一个模块切换到另一个模块时却需 要花更多时间,因为每个模块都需 要以JIT形式加载。在我的应用中,只有当用户首次在steps 1-5之间切换时需要花更多时间。
5. 推迟实例化
      Heider围绕着Flex组件 的“creationPolicy”属性及何时实例 化应用的不同部分给出了很多建议。
      如果你想减少从数据下载到用户真正可以使用的总时间,当务之急就是推迟实例化。这项技术背后的理念就是直到应用真正使用的时候才在内存中创建对象 。
      尽管推迟实例化技术会在应用的整个使用过程中导致少许——通常不那么明显——的延迟,但与长时间的启动延迟相比,它还是可接受的。推迟实例化的另一个好 处在于内存使用的优化。

以上原则来自Jun Heider在O’Reilly的InsideRIA站点上发表了一篇精彩的文章,该文章就如何加快Flex应用的启动速度 提出了很多建议,以帮助用户减少看见讨厌的“Loading”对话框的出现时 间。他深入探讨了问题的不同方面,并对每种技术的优势和劣势进行了评判。Heider还谈到了一个“实验性”的条款——“使用流”,这是他在讨论Dirk Eismann的帖子(Building monolithic Flex SWFs that still startup quickly.”)时谈及的。Eismann提出一项技术以利用Flash Player中的多个frames以在部分应用中达到流的目的。查看所有的帖子以更多地了解该技术及关于加快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性能优化常用手法总结相关推荐

  1. 前端性能优化常用代码

    前端性能优化常用代码 为什么要做性能优化?性能优化到底有多重要? 网站的性能优化对于用户的留存率.转化率有很大的影响,所以对于前端开发来说性能优化能力也是重要的考察点. 性能优化的点非常的多,有的小伙 ...

  2. linux性能优化常用命令

    作为一名linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行,但是由于硬件问题.软件问题.网络环境等的复杂性 和多变性,导致对系统的优化变得异常复杂,如何定位性能问题出在哪 ...

  3. 性能优化常用工具及经验总结

    文 |齐光 性能问题和 Bug 不同,后者的分析和解决思路更清晰,很多时候从应用日志(文中的应用指分布式服务下的单个节点)即可直接找到问题根源,而性能问题,其排查思路更为复杂一些. 对应用进行性能优化 ...

  4. 以前看flex 性能优化一文后记录

    名称 flex 性能 改善性能 避免多层嵌套容器 一条好经验是避免容器的嵌套超过三层 用 spacer 对象来填充不需要的空白 绝对定位和缩放 每个容器及其子对象大小和位置的计算会占用大量资源 对象位 ...

  5. oracle 性能优化 常用,Oracle數據庫常用性能優化

    1. 查兩張以上表時,把記錄少的放在右邊 2. WHERE子句中的連接順序 ORACLE采用自上而下的順序解析WHERE子句,根據這個原則,那些可以過濾掉最大數量記錄的條件應寫在WHERE子句最后. ...

  6. 一文了解程序员必须要知道的JVM和性能优化知识点

    目录 JVM和性能优化 1.Java内存区域 虚拟机的历史 未来的Java技术一览 运行时数据区域 站在线程角度来看堆和栈 深入辨析堆和栈 方法的出入栈 虚拟机中的对象 堆参数设置和内存溢出实战 2. ...

  7. Apache的压力测试以及web性能优化的常用知识总结

    这篇文章主要介绍了Apache的压力测试以及web性能优化的常用知识总结,笔记由<构建高性能web站点>这本高人气书籍整理而来,需要的朋友可以参考下  什么是带宽? 误解:"数据 ...

  8. 高级SQL优化(三) 常用优化工具 ——《12年资深DBA教你Oracle开发与优化——性能优化部分》...

    目录: Oracle数据完整性和锁机制  索引及优化之表分析  表分析.约束及表间关系  Oracle体系结构1 Oracle体系结构2  海量数据库及分区1  海量数据库及分区2  海量数据库及分区 ...

  9. IDEA最全最常用的配置与性能优化(Java必备)

    IDEA最全最常用的配置与性能优化(Java必备) 简介 一.性能优化 1.JVM启动参数 2.清空缓存并重建索引 二.优化设置 1.显示方法分隔符 2.忽略大小写提示 3.主题设置 4.设置字体 5 ...

最新文章

  1. Mac的移动硬盘不能装载该如何解决?
  2. 在 VMware Clone Ubuntu Server 之后,解决网卡问题
  3. Redis学习与实战之字符串命令
  4. spring-boot基础概念与简单应用
  5. JSP的三六九四七(三大指令、六大标签、九大内置对象、四大作用域、七个动作指令)
  6. MySQL什么是关系_MySQL教程-关系模型
  7. 我国四大常用坐标系及高程坐标系【转载】
  8. 锁屏面试题百日百刷-网络篇(一)
  9. php代码提示助手,laravel自动补全助手ide-helper安置及配置
  10. 【人脸识别】VGGFace2数据集介绍
  11. 云计算实战系列八(存储管理I)
  12. 想学高级软件测试去哪里学,软件测试要学多久
  13. 用唯一的颜色id编号实现OpenGL选择功能(OpenGL Selection Using Unique Color IDs )
  14. ON1 Photo RAW 2022 for Mac(ps/lr滤镜raw图像编辑器)
  15. 04、自学——计算机网络学习任务与进度(物理层)
  16. 电力拖动自动控制系统matlab,基于Matlab的《电力拖动自动控制系统》课程教学改革...
  17. java开源规则引擎比较_常用规则引擎比较分析
  18. MMORPG游戏服务器技术选型参考
  19. 微信小程序创建订单号思路(附将带其它符号字符串转换成纯数字字符串)
  20. d盘无法格式化怎么解决

热门文章

  1. 国开大学计算机基础本性考,王开
  2. Intel e1000 网卡
  3. 专业运动蓝牙耳机品牌、无线蓝牙运动耳机推荐
  4. 从零开始操作系统------MBR直操硬盘、内核加载器
  5. Python人工智能概述——博弈、对抗搜索
  6. 爬虫爬取京东时被拦截到登录界面怎么办?
  7. 5月6-7日,东莞松山湖华为小镇,鲲鹏开发者峰会2023·云和恩墨专场邀您参会
  8. Certified Scrum Master(CSM)题目总结!
  9. ryu实例---ECMP的rr(轮询)算法实现
  10. win10系统开机输入密码黑屏解决方法