FLASHCS5中应用RSL共享库~
2010-06-12 16:35 宝宝合凤凰 阅读(1633) 评论(1) 编辑 收藏 举报FLASHCS5中应用RSL共享库~
1 条评论 | 2010年05月23日,星期天 1:13 上午 作者:L4cd.Net
用过flex的童鞋应该都用过或了解过rsl...
它可以在我们电脑硬盘里缓存经验证的swz共享库文件...
当你的项目使用到相应的库时..就不需要重新下载..
并且不怕受浏览器清除缓存影响..因为fp会将它们存在硬盘上..
现在我们在cs5中也可以应用rsl技术...
cs5中新增了fl.rsl包..
我们可以使用它进行swf库(未经验证~)或swz库(经验证)的加载...
下面的例子中..我们尝试加载flex 3.5 sdk中的framework_3.5.0.12683.swz..
并调用mx.formatters::DateFormatter进行对日期的格式化操作..
当打开flash后你可能会看到加载进度..
或者什么都看不到就已经提示加载成功(因为你可能曾经加载过framework_3.5.0.12683.swz,而且fp已经帮你缓存于硬盘当中...)
注:正常浏览需要fp10.1~只因fl.rsl包需要fp10.1支持(在flash上点击右键可查看你的fp版本)
刚刚重装了fp9..依然可以正常访问..验证中..
这里有几点需要说明一下...
1.当你只加载swf的库时,直接使用RSLInfo即可..代码如下
它可以在我们电脑硬盘里缓存经验证的swz共享库文件...
当你的项目使用到相应的库时..就不需要重新下载..
并且不怕受浏览器清除缓存影响..因为fp会将它们存在硬盘上..
现在我们在cs5中也可以应用rsl技术...
cs5中新增了fl.rsl包..
我们可以使用它进行swf库(未经验证~)或swz库(经验证)的加载...
下面的例子中..我们尝试加载flex 3.5 sdk中的framework_3.5.0.12683.swz..
并调用mx.formatters::DateFormatter进行对日期的格式化操作..
当打开flash后你可能会看到加载进度..
或者什么都看不到就已经提示加载成功(因为你可能曾经加载过framework_3.5.0.12683.swz,而且fp已经帮你缓存于硬盘当中...)
刚刚重装了fp9..依然可以正常访问..验证中..
这里有几点需要说明一下...
1.当你只加载swf的库时,直接使用RSLInfo即可..代码如下
var rsl:RSLPreloader = new RSLPreloader(this);//这里的this为文档类,不传留空亦可~ var info:RSLInfo = new RSLInfo(); info.addEntry("framework_3.5.0.12683.swf");//这里的第二个参数可设置一个跨域文件路径~下方的加载SWZ的代码同理 rsl.addRSLInfo(info); rsl.start();
2.当你需要加载SWZ的库时..需要使用SWZInfo.并且需要注意的时..SWZInfo的构造函数中..需在提供你请求加载的SWZ的"摘要(digest)"
该digest将验证你下载的SWZ文件是否正确~~
而digest是一个 SHA-256 哈希字符串值..
如果你使用flex的话可以直接使用SHA256.computeDigest(bytes)获取...
另外提醒一下..
这里的bytes并不是framework_3.5.0.12683.swz的bytes~而是framework_3.5.0.12683.swf的bytes~
这里很重要喔~~(ps:试了很久才试出来~汗一个~帮助没写清楚)..
那么详细代码如下:
var rsl:RSLPreloader = new RSLPreloader(this); //3c82b2a2455b252b8595fd0113249aa19d7e8bdd516b2f6ea43244aa6d543d58为framework_3.5.0.12683.swf的SHA-256值~ var info:SWZInfo = new SWZInfo("3c82b2a2455b252b8595fd0113249aa19d7e8bdd516b2f6ea43244aa6d543d58"); info.addEntry("framework_3.5.0.12683.swz"); rsl.addRSLInfo(info); rsl.start();
3.当我们加载SWZ时...fp会优先用摘要(digest)从你的电脑硬盘里查找有没有相应的swz文件..
如果你确保swz文件存在...你甚至可以这么写..
var rsl:RSLPreloader = new RSLPreloader(this); var info:SWZInfo = new SWZInfo("3c82b2a2455b252b8595fd0113249aa19d7e8bdd516b2f6ea43244aa6d543d58"); info.addEntry(""); rsl.addRSLInfo(info); rsl.start();
FP将一样返回加载成功...
下面是上边的flash的完整代码...
直接往CS5里贴即可...
import fl.rsl.*; import fl.rsl.RSLPreloader; import fl.events.*; import flash.utils.getDefinitionByName; import flash.text.TextField; import flash.display.SimpleButton; import flash.events.MouseEvent; //code by l4cd.net var button:SimpleButton; button.enabled = false; button.alpha = 0.5; button.addEventListener(MouseEvent.CLICK,_test); function _test(e:MouseEvent):void { if(!button.enabled)return; var DateFormatter:Class = getDefinitionByName("mx.formatters::DateFormatter") as Class; var format:Object = new DateFormatter(); format.formatString = "YYYY年MM月DD日 HH/NN/SS"; var txt:String = 'Class: mx.formatters::DateFormatter'; txt += '\nFormatString: YYYY年MM月DD日 HH/NN/SS'; txt += "\nOutput: "+format.format(new Date()); txt += "\nby: l4cd.net"; output.text = txt; } var output:TextField; output.background = true; output.backgroundColor = 0xeeeeee; var rsl:RSLPreloader = new RSLPreloader(this); var info:SWZInfo = new SWZInfo("3c82b2a2455b252b8595fd0113249aa19d7e8bdd516b2f6ea43244aa6d543d58"); //这里的地址改成相应的地址~~ info.addEntry("http://www.l4cd.net/rsl/framework_3.5.0.12683.swz","http://www.l4cd.net/crossdomain.xml"); rsl.addRSLInfo(info); rsl.addEventListener(RSLEvent.RSL_LOAD_COMPLETE,_rslComplete); rsl.addEventListener(RSLEvent.RSL_PROGRESS,_rslProgress); rsl.addEventListener(RSLErrorEvent.RSL_LOAD_FAILED,_rslFailed); rsl.start(); function _rslProgress(e:RSLEvent):void { var txt:String = "Framework_3.5.0.12683.swz loading..."; txt += '\n .rslsLoaded = ' + e.rslsLoaded; txt += '\n .rslsFailed = ' + e.rslsFailed; txt += '\n .rslsTotal = ' + e.rslsTotal; txt += '\n .bytesLoaded = ' + e.bytesLoaded; txt += '\n .bytesTotal = ' + e.bytesTotal; output.text = txt; } function _rslComplete(e:RSLEvent):void { button.enabled = true; button.alpha = 1; output.text = "framework_3.5.0.12683.swz loaded!\n点下面的按钮进行测试!"; } function _rslFailed(e:RSLErrorEvent):void { output.text = "Framework_3.5.0.12683.swz\n"+e; }
==========================
FLEX RSL 应用注意事项
抢沙发!! | 2008年07月24日,星期四 4:00 上午 作者:L4cd.NetFLEX发布体积过大是每个使用FLEX开发的朋友都知道的
那是因为FLEX在发布的时候会带一个框架文件,框架文件包含了所有的Flex内置类...
该文件大小大概是500多K,以致一个空的FLEX项目.发布后就有500多K
所以FLEX提供了RSL(runtime shared library)(运行共享库??),
让用户只需要下载相同版本的框架文件一次,然后存在FlashPlayer指定的cache目录中..
当下次再浏览应用了RSL的FLEX项目时,就不需要重新下载..从而加快加载速度.
....理论的东东不大会表达..差不多是这样吧...下面实际操作一下..
要应用RSL.我们执行下面的步骤:
1.在项目文件夹中点右建,选择"properties"-"Flex BuildPath"-"Library Path"
2.该选项卡上我们看到"FrameWork linkage",默认是选中"Merged into cdoe"(打包在里边..大概这意思)
3.点开下拉,选择"runtime shared library(RSL)",点"OK"
这样~我们的项目就已经使用RSL~把框架文件分离出来..
我们点开项目的bin(bin-debug)文件夹.
会看到已经生成了framework_3.0.0.477.swf和framework_3.0.0.477.swz两个文件(0,0,447是版本号).
再看看项目的swf..已经变成了50k左右(只有两三个组件)
当我们发布项目时..
只需要把framework_3.0.0.477.swf和framework_3.0.0.477.swz两个文件
跟项目swf放在一目录下传到服务器上即可...
ps:在这里说说两个值得注意的问题..
第一个是发布项目后出现RSL error..主要有两个原因:
1.使用低于9.0.115版本的FLASH PLAYER,,
2.没有把framework_3.0.0.477.swf和framework_3.0.0.477.swz传到服务器上..以至类库无法下载....
说第二个问题前..先介绍一下framework_3.0.0.477.swf和framework_3.0.0.477.swz,
其中framework_3.0.0.477.swz加载时会优先加载的..当加载成功后..会放到flash player的cache目录下.(完成RSL...).
当framework_3.0.0.477.swz下载失败的话..flashplayer会自动下载framework_3.0.0.477.swf,该文件只能下载到ie缓存..并不能达到RSL功能.,只保证项目可正常运行.
很从朋友反映..在本地浏览的时候..framework_3.0.0.477.swz可以正常加载到player的cache目录..
可是当放到服务器后..即会加载不成功..只能靠加载swf来运行..
出现这个情况..是因为服务器的IIS不支持swz后缀的文件的下载..
(以前flv没盛行之前也出现过这类情况),
如果是自己的服务器.我们只需要配置一下iis.添加一MIME类型即可..
详细操作就不说了..MIME类型如下..
那是因为FLEX在发布的时候会带一个框架文件,框架文件包含了所有的Flex内置类...
该文件大小大概是500多K,以致一个空的FLEX项目.发布后就有500多K
所以FLEX提供了RSL(runtime shared library)(运行共享库??),
让用户只需要下载相同版本的框架文件一次,然后存在FlashPlayer指定的cache目录中..
当下次再浏览应用了RSL的FLEX项目时,就不需要重新下载..从而加快加载速度.
....理论的东东不大会表达..差不多是这样吧...下面实际操作一下..
要应用RSL.我们执行下面的步骤:
1.在项目文件夹中点右建,选择"properties"-"Flex BuildPath"-"Library Path"
2.该选项卡上我们看到"FrameWork linkage",默认是选中"Merged into cdoe"(打包在里边..大概这意思)
3.点开下拉,选择"runtime shared library(RSL)",点"OK"
这样~我们的项目就已经使用RSL~把框架文件分离出来..
我们点开项目的bin(bin-debug)文件夹.
会看到已经生成了framework_3.0.0.477.swf和framework_3.0.0.477.swz两个文件(0,0,447是版本号).
再看看项目的swf..已经变成了50k左右(只有两三个组件)
当我们发布项目时..
只需要把framework_3.0.0.477.swf和framework_3.0.0.477.swz两个文件
跟项目swf放在一目录下传到服务器上即可...
ps:在这里说说两个值得注意的问题..
第一个是发布项目后出现RSL error..主要有两个原因:
1.使用低于9.0.115版本的FLASH PLAYER,,
2.没有把framework_3.0.0.477.swf和framework_3.0.0.477.swz传到服务器上..以至类库无法下载....
说第二个问题前..先介绍一下framework_3.0.0.477.swf和framework_3.0.0.477.swz,
其中framework_3.0.0.477.swz加载时会优先加载的..当加载成功后..会放到flash player的cache目录下.(完成RSL...).
当framework_3.0.0.477.swz下载失败的话..flashplayer会自动下载framework_3.0.0.477.swf,该文件只能下载到ie缓存..并不能达到RSL功能.,只保证项目可正常运行.
很从朋友反映..在本地浏览的时候..framework_3.0.0.477.swz可以正常加载到player的cache目录..
可是当放到服务器后..即会加载不成功..只能靠加载swf来运行..
出现这个情况..是因为服务器的IIS不支持swz后缀的文件的下载..
(以前flv没盛行之前也出现过这类情况),
如果是自己的服务器.我们只需要配置一下iis.添加一MIME类型即可..
详细操作就不说了..MIME类型如下..
============================================
FLEX的SWC与RSL
1.SWC简述 SWC实质是将事先做好的公共程序封装到一个包内发布,提供给其他开发人员使用,类似于JAVA的类库。 SWC可以封装以下内容: .图片、声音等素材文件 .程序 .控件或自定义控件 SWC有两种使用方式 1.将源代码编译到SWF文件中,SWF运行时不需要外部程序包。 2.利用RSL技术,SWF文件在运行时才调用SWC中的程序,因此,必须将外部程序包方在SWF能够找到的地方。供其动态调用。这种技术类似于DLL技术。 2.RSL简述 RSL是与Flex程序物理分离的独立swc文件。当客户通过浏览器下载Flex程序之后,由FlashPlayer负责解释执行。 FlashPlayer在解析Flex程序结构的时候,发现该Flex程序使用了某个RSL,于是FlashPlayer就马上从服务器端下载该RSL,并存放在浏览器缓存中或FlashPlayer指定的客户机硬盘的某个地方。 如果存放在浏览器内,则只在浏览器内有效 如果存放在硬盘中,则永久有效 目前,永久缓存只能是Flex Framework。浏览器缓存则可以是自定义的Flex公共程序集合指,比如SWC framework4的大小约为955K,只要不重装操作系统,只需下载一次。 3.FLEX4使用SWC 开发工具flash builder4 beta2 (1)新建一个FLEX库项目,在SRC目录下存放图片或程序。完成后,直接在FLEX库项目名上通过“右键”点击"构建项目",生成的SWC文件在bin目录下。 (2)在将生成的SWC复制到开发项目中的libs目录下,则SWC自动被引入到项目中。 如果想将SWC中的源代码编译到SWF文件中 点击"项目名"->"FLEX构建路径"->"libs"中的链接类型,设置成"合并到代码" 这种方式的缺点是:只是从程序结构上进行了优化,并没有减轻SWF文件的大小 如果利用RSL技术,SWF文件在运行时才调用SWC中的程序 理论上可以点击"项目名"->"FLEX构建路径"->"libs"中的链接类型,设置成"外部"。然后再将SWC文件复制到WEB目录下,与SWF文件同一目录。 实际上,这种方式是行不通的,不知道为什么,只能通过以下方式实现。 在同一个flash buider4 beta2工具下新建两个项目一个是开发项目,一个是FLEX库项目 点击"开发项目名"->"FLEX构建路径"->"库路径",点击"添加项目",将FLEX库项目添加进来。 再将"链接类型"改在RSL方式。如下所示: 4.SWC和RSL优化小结 本人首先自定义了一个Panel和一个Link控件,代码就不说了。 再将代码复制到一个新建的FLEX库项目中,分别做了二个主程序进行调用。 结果如下 框架是否使用RSL SWC是否使用RSL SWF文件大小 直接调用 否 941K 直接调用 是 150K SWC调用 否 否 941K SWC调用 否 是 770K SWC调用 是 否 150K SWC调用 是 是 144K 从上面结果可以看出框架是否使用RSL对于SWF的文件大小的影响太大了,第一次要下载955K的framework的代价是完全值得的。 SWC是否使用RSL总的来看,如果少量复用,意义不大。 上例代码中共使用了一个自定义panel和二个自定义link控件的大小约3K,反复使用四次, 不优化的大小是150K,而优化之后的大小是144K,减小了约6K,远远小于一个FLEX空白页的大小(约130K)。 |
=========================