任何东西如果涉及到高访问量的时候就会对几K的东西比较在意,也会对程序代码比较苛刻,当然会使产品逐步走向完美。其中Flash的瘦身是我研究的第一个问题,其问题根源在于A.swf和B.swf共享一些代码,如何将共享的代码给去掉是我们提供解决方法的一些方式。
- 使用Exculde.xml。在A.fla同目录下建立A_exculde.xml文件,配置排除在外的类。该方法能够解决ActionScript2.0 的问题,却不能解决ActionScript3.0的问题。另外在源代码增加和减少类的情况下,需要增加对Exculde.xml的维护。
- 在 RSL中使用External链接。Flex3.0针对这个问题给出了比较好的解决方法,将B.swf中和A.swf共享的代码做成一个SDK,然后在 B.swf中将SDK的链接设置为external。该方法能解决3.0的问题,却不能解决2.0的问题,另外只能在Flex开发环境中进行,在 FlashCS3中我们并没有找到相同的方法。
- 动态创建对象。在AS3.0中我们可以使用 flash.utils.getDefinitionByName("freewheel.system.fwObject")这样的方式来创建对象,然后动态调用其方法,这样就能避免编译器将对象编译进SWF文件,但是前提是freewheel.system.fwObject这个类已经通过别的SWF 加载进Flash中。在ActionScript2.0中,我们则可以使用Eval("new freewheel.system.fwObject")这样的方法来创建对象。这样能针对2.0和3.0的代码都有相应的解决方法,但是这样做却没有了智能提示,代码的清晰度降低,同时如果涉及到B.swf里面有类继承自A.swf的类的话,这样的方法就不能解决问题。
- 将需要的对象放进SWF中。比如要在B.swf中调用A.swf中的对象,除了上述的方法外,我们还可以在A.swf中提供可使用的接口。比如在A.swf中有方法: function getInstance():classA{return new classA();},然后将A.swf加载到Flash后,就可以在B.swf中调用A.swf的getInstance方法。这种做法比前面一种要好,但是还是不能解决继承的问题。
- 使用intrinsics。如果A.swf先于B.swf加载进入Flash,那么 B.swf里的所有共享的Class,可以将其所有的Private的属性和方法全部去掉,同时将方法体的内容全部拿去,然后再生成B.swf。在编译的时候可以自己写一套工具来生成这个intrinsics,来保证B.swf能够被编译通过。
- 分层结构设计。将A.swf和B.swf本别独立出来,层次结构划分开,可以通过Interface将其联系起来,相互间的联系通过事件传导。这是我比较推荐的做法,分层的设计不仅能够彻底的将无用的代码拿掉,并且还会有友好的智能提示,减少代码的耦合性,可维护性得到加强。当然对于设计者的要求就比较高一点了。
那么除了最后一个瘦身方法外,前面的所有的瘦身方法其实是有一个原理来遵循的。结论如下: 如果先加载A.swf,那么B.swf里的class不会覆盖A.swf里的class。