随着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优化相关的多个知识点。这些知识点主要集中在提高Flex应用程序的性能上,涉及代码优化、资源管理、数据处理等方面。 ### Flex优化全集 #### 1. 数组...
flex builder 优化
【Flex瘦身优化】是针对Flex开发中遇到的项目体积过大的问题进行的一系列优化措施,主要是为了减小Flex应用程序的发布体积,提高加载速度和用户体验。以下是一套可行的优化方案: 1. **关闭编译调试信息**: 添加`...
1. **关闭不必要的项目**:在Eclipse中,确保只开启当前正在开发的Flex项目,避免其他项目的编译过程占用资源。 2. **使用系统字体替代内嵌字体**:内嵌字体会增加编译时间和项目大小,使用系统默认字体可显著减少...
### Flex性能优化全集 #### 引言 随着技术的发展,用户对于应用程序的要求越来越高,不仅在功能上有所期待,更注重应用的响应速度与流畅度。Adobe Flex 是一款用于构建和部署跨平台富互联网应用程序的强大工具,...
Flex性能优化是一个重要的主题,特别是在开发富互联网应用(RIA)时,由于Flex对硬件资源的需求较高,优化显得尤为关键。以下是一些针对Flex性能提升的关键点: 1. **从外部加载媒体**:为了减少SWF文件的大小和加载...
FLEX内存释放优化原则,内存泄露解决方法,内存泄露情况
### FLEX内存释放优化原则详解 #### 一、引言 在FLEX开发过程中,合理的内存管理至关重要。不当的内存管理不仅会导致应用运行效率降低,还可能引发诸如黑屏、模糊显示等问题,严重影响用户体验。本文将针对“FLEX...
老外写的Flex优化指南,内容很精彩,不容错过
1. **Flex基础**:Flex提供了MXML和ActionScript两种编程方式。MXML是一种声明式语言,用于定义界面布局和组件,而ActionScript则是面向对象的脚本语言,用于处理程序逻辑和交互。学习Flex首先要了解这两种语言的...
这个文档可能专注于客户端与服务器之间的性能优化,讨论了如何在Flex应用中实现高效的数据通信、减少延迟、提高响应速度等,对优化Flex应用性能有重要指导价值。 5. **devappsflex.pdf**: 可能是关于开发Flex...
【Flex面试题】Flex面试题主要涵盖Flex的基础概念、开发框架、MVC模式的应用、内存管理、垃圾回收机制、前端性能优化以及与后端通信等多个方面。以下是对这些知识点的详细解析: 1. AS2与AS3的区别: AS2...
1. **环境配置**:确保你已经安装了Flex Builder(或使用IDE如IntelliJ IDEA或Eclipse的插件)、Java SDK以及Apache Tomcat等服务器环境。 2. **创建Flex项目**:在Flex Builder中创建一个新的Flex应用程序,选择...
1. **Flex框架介绍**:Flex框架主要由Flex SDK和Flex Builder两部分组成。SDK是免费的,包含编译器、库和工具,而Builder则是一个集成开发环境(IDE),提供了更友好的图形化界面。Flex SDK的核心是ActionScript编程...
1. **Flex简介** Flex是基于ActionScript 3.0和Flash Player或Adobe AIR运行时的开发框架,允许开发者使用MXML和ActionScript创建动态、交互式的Web应用。它提供了丰富的UI组件库,能够构建功能强大的图形用户界面...
1. **Flex简介**:Flex是一个强大的开发工具,主要用于创建交互式、高性能的Web应用程序。它的核心是Flex SDK,包含了一系列用于开发、编译和调试Flex应用的工具和库。Flex支持事件驱动的编程模型,允许开发者构建...
综上所述,"Flex3学习指南1-8"这个压缩包文件包含了Flex 3从基础到深入的多个章节,覆盖了Flex开发的各个方面,对于想要进入Flex开发领域的初学者来说,是一份非常宝贵的参考资料。通过深入学习和实践,读者可以逐步...
1. **MXML与ActionScript**:Flex应用主要由MXML和ActionScript两种语言编写。MXML是一种声明式语言,主要用于定义用户界面组件和布局,而ActionScript是基于ECMAScript的脚本语言,负责处理程序逻辑和事件处理。 2...
在IT行业中,游戏开发是一项复杂且技术密集型的工作,尤其对于使用Adobe Flex框架进行开发的项目来说,优化是提升用户体验的关键。"test_avatar.rar_flex_游戏优化"这个标题暗示了我们正在探讨一个与Flex相关的游戏...
### PureMVC与Cairngorm对Flex开源框架的优化组合 #### 一、引言 随着Rich Internet Applications (RIA) 的兴起,Flex 技术因其强大的用户界面设计能力和跨平台特性而受到广泛关注。Flex 不仅能提供丰富的用户体验...