随着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来对项目进程进行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用 量,创建过程等信息;
总结:关键还是要做好清除工作,自己设置的引用自己要记得删除,自己用过的系统类要记得做好回收处理工作。以上问题解决的好的话不需要自定义强制回收器也 有可能被系统正常的自动回收掉。
本文来自CSDN博客,转载请标明出 处:http://blog.csdn.net/justdo2008/archive/2009/09/11/4544632.aspx
二.
Flex做的越久就越感觉性能问题的 重要性,这是程序编写人员应该非常重视的问题。
Flex性能问题上我想大概有几点:
一、FLEX的文件体积问题。
Flex生成的文件体积相对比较大。这是一个最令人头痛的问题!如果文件比较大,用户在浏览的时候就会等待一段时 间,就仅这一点就会让用户体验大打折扣,也许你做的应用很Cool,但是有可能用户还没有看到你的应用就离开了,当然,你的忠实Fans或技术研究者除 外。
如何给文件体积减肥呢?个人认为可以从两个方面:
一是从你的写的程序本身去优化:尽可能少的使用图片,即使使用也要先对图片在不影响浏览质量的情况下进行优化(至于 图片怎么优化,参看其他相关文章);一些序列性的数据不要放在程序中,可以通过XML文件读取。尽量不要把其他文件包含在程序里,可能Load进入。
二是分离运行库,使用RSL减小FLEX生成文件的体积。
步骤如下:
1.在项目文件夹中点右建,选择"properties"-"Flex BuildPath"-"Library Path"
2.该选项卡上我们看到"FrameWork linkage",默认是选中"Merged into cdoe"
3.点开下拉,选择"runtime shared library(RSL)",点"OK"
个人的经验是,一个450多KB的文件,经过RSL后变成了140多KB,文件大小有明显的减少。在bin- debug目录下我们发现多了两个文件:framework_3.1.0.2710.swf,framework_3.1.0.2710.swz;
大致的原理是:当客户端有运行库的时候不会再从服务器端下载,如果没有运行库再从服务器上下载。
需要注意的是:在把文件上传服务器的时候需要将生成的两个文件与项目swf放在一目录下一同上传。
如果出现RSL error..主要有三个原因:
1.使用低于9.0.115版本的FLASH PLAYER,,
2.没有把framework_3.1.0.2710.swf和framework_3.1.0.2710.swz 上传到服务器,以至于无法加载类库。
3.还有可能是你把文件也放到服务器了,但是你的服务器不支持swz格式。以IIS为例,添加一MIME类 型.swzapplication/x-shockwave-flash
二、Flex性能优化
1、程序上能写As3程序的尽可能写as3.
2、写变量的时候,坚持声明类型,尽量减少成员变量和成员方法的定义, 多使用局部变量和方法 .
3、不在控件的createComplete阶段处理过多代码
4、尽可能少的创建实例。
5、容器不要过多的嵌套,最好不要超过3层。不需要的空白用spacer填充。
6、对象的位置、大小用代码控制,减小计算机对此运算负荷。
7、避免常见容器的冗余。如panel中的vbox.
8、推迟程序实例化。在需要页面跳转的时候,能用state的尽可能的用state.Flex 中的导航条容器ViewStack、Accordin、TabNavigator中内置了推迟实例化.
9、如果涉及到样式,尽可能的使用CSS文件。
三、FLEX与3D结合的性能优化。
最近一直在做flex与3D之间的工作,采用的papervision3d。主要关键在于3D模型的读取及动作的控 制上,下面谈谈如何对程序进行优化的经验:
3D文件模型。主要支持.DAE和.MD2格式的文件。这两种格式的文件都有骨骼动画,可以进行对模型动作的控制。 DAE格式的动作主要通过帧进行控制,而MD2可以通过动作名称进行控制。(研究了一下,发现DAE也是通过动作名称来控制,通过帧控制需要额外的类包)
无论哪种文件格式在制作模型的时候都要注意:不要把模型做的过于精细,面数越多加载越慢,最重要的是把3D模型加载到flex之后,几万面已经卡的不行 了。3D模型的质量可以通过质量较高的贴图进行弥补。
另外关于贴图的质量和数量。在不影响视觉效果的前提下尽可能的降低图片质量。模型的贴图尽可能做成一张图(MD2文件似乎不支持多张贴图)。
与其在程序写完了之后臃肿得跑不动,不如平时注意这些关键点,时时提醒自己。翻译出来,以便以后时时查阅。
1 创建新数组时避免使用它的构造函数。
这样做:var a = [];
而不要这样做:var a = new Array();
2 创建数组是一个消耗量很大的操作,所以请谨慎进行以下类型的操作:
var vanityCollection01 : Array = new Array();
var vanityCollection02 : Array = new Array();
var vanityCollection03 : Array = new Array();
var vanityCollection04 : Array = new Array();
3 复制一个数组最快的方式是:
var copy : Array = sourceArray.concat();
4 无论你用哪种方式,为数组的元素设置值都是一个慢的操作。
employees.push( employee );
employees[2] = employee;
5 在数组中获得一个值的速度是设置一个值的二倍。
var employee : Employee = employees[2];
6 将属性函数设置为静态函数,这样你在使用它的时候就不用实例化一个该类的对象。
StringUtils.trim( "text with space at end " );
类定义:
package
{
public final class StringUtils
{
public static function trim( s : String ) : String
{
var trimmed : String;
// 逻辑实现代码
return trimmed;
}
}
}
7 使用常量关键字constbackground: #d9d9d9; font-size: 1
分享到:
相关推荐
### Flex性能优化全集 #### 引言 随着技术的发展,用户对于应用程序的要求越来越高,不仅在功能上有所期待,更注重应用的响应速度与流畅度。Adobe Flex 是一款用于构建和部署跨平台富互联网应用程序的强大工具,...
总之,Flex性能优化是一个综合性问题,需要从多个维度进行考虑。上述提到的从外部加载媒体资源、限制嵌入式字体的字符集、框架缓存、模块化设计、推迟实例化以及内存释放优化等都是实践中行之有效的优化策略。开发者...
以下是对Flex性能优化和内存查看的深入探讨: 1. **Flex性能优化**: - **代码优化**:减少不必要的计算,避免在循环中创建对象,合理使用缓存,以及优化事件处理。 - **布局优化**:明智地使用布局管理器,避免...
9. **Flex性能优化**:学习如何通过优化组件使用、减少网络请求、缓存策略等方式提升Flex应用的性能。 10. **实践项目**:理论学习后,通过实际项目练习,将所学知识应用于实践中,是巩固和提高技能的最佳方式。 ...
#### Flex性能优化:使用Adobe Flex Profiler Adobe Flex Profiler是一款功能强大的工具,可以帮助开发者识别Flex应用程序中的性能瓶颈或内存泄漏问题。通过本教程,我们将详细介绍如何利用Adobe Flex Profiler进行...
8. **Flex性能优化** 在实际项目中,了解如何优化Flex应用的性能至关重要。这包括减少组件数量、正确使用数据绑定、优化绘图操作等方法。 9. **Flex与源码控制** 对于团队开发,将Flex代码纳入源码控制系统(如...
9. **Flex性能优化**:包括减少组件数量、优化数据处理、使用位图缓存等技巧,以提升应用性能。 10. **Flex测试和调试**:使用Flex Builder的内置工具进行代码调试,查找并修复错误,进行性能分析。 以上只是Flex...
Flex编译优化方法是提升开发效率的关键,尤其是在大型Flex项目中,编译时间长和Eclipse性能问题可能严重影响开发流程。...同时,保持Eclipse和Flex SDK的更新也很重要,因为新版本通常会包含性能优化和bug修复。
【Flex性能测试】是针对基于Flex技术构建的富互联网应用程序(RIA)进行的性能评估过程。Flex是由Adobe公司开发的一种支持RIA开发和部署的技术,它主要用于创建具有高度交互性和动态用户体验的企业级应用。Flex的...
- **代码优化**:删除无用的代码和资源,精简XML和CSS,优化算法,减少不必要的计算和内存分配,都有助于提高程序性能和减少体积。 通过以上方法,可以有效优化Flex项目的大小,提高加载速度,提升用户体验。在...
**Flex性能优化**: - **代码优化**:减少不必要的对象创建,避免过度使用动态类型,合理使用事件处理机制等。 - **资源管理**:优化图像和媒体资源的加载,减少网络延迟,提高加载速度。 - **缓存策略**:利用...
根据提供的标题、描述、标签及部分内容,我们可以总结出与Flex优化相关的多个知识点。...以上内容涵盖了Flex开发过程中常见的一些性能优化技巧。通过对这些技巧的理解和应用,可以显著提高Flex应用程序的性能。
Flex性能优化常用手法总结可能包括以下几个方面: 1. **减少重绘和重排**:尽量避免不必要的组件更新,因为这会导致整个UI的重绘和重排,消耗性能。 2. **优化数据绑定**:避免使用实时数据绑定,考虑使用变更侦听...
【LoadRunner 9.5 Flex性能测试】 LoadRunner是一款强大的负载和性能测试工具,9.5版本对于Flex应用的支持使得它能够对基于Adobe Flex技术构建的Web应用程序进行深入的性能评估。性能测试是确保系统在高并发用户...
【Flex性能分析】Flex是一种基于ActionScript的开源框架,用于构建富互联网应用程序(RIA)。它提供了丰富的用户界面组件和强大的数据绑定能力。在开发过程中,性能优化是必不可少的一环,而`Flex Profile`就是用于...
通过遵循上述内存释放优化原则,开发者可以显著提升FLEX应用程序的性能和稳定性。合理管理内存不仅可以提高用户体验,还能减少开发过程中的调试时间和成本。因此,在开发过程中始终关注内存管理的最佳实践是非常必要...
"test_avatar.rar_flex_游戏优化"这个标题暗示了我们正在探讨一个与Flex相关的游戏项目,其中包含了对游戏性能的改进措施,特别是针对矢量图形的优化,以提高游戏的速度。 Flex是一种基于ActionScript 3.0的开源...
通过以上步骤,开发者可以深入分析Flex应用程序的性能瓶颈,优化代码,减少内存泄漏,提升应用程序的运行效率。使用flex profile进行性能分析是提升Flex应用性能的关键步骤之一,它提供了宝贵的数据和洞察力,有助于...