如何减小SWF文件的大小

1.关闭编译器的调式功能 默认情况下mxmlc编译器的debug选项是false,但是compc组件编译器的debug选项默认情况下却是true,在用compc编译 SWC的时候一定要把debug选项设为false,否则的话一些与debug相关的功能和代码会被编译进SWC文件中,从而增加了SWC中SWF文件的大小

 

2.检查依赖链接(Examming linker dependencies) 有时候我们会遇到这种情况:在使Flex项目模块化的过程中,我们会在主模块SWF中加载项目需要的其他子模块SWF,而子模块SWF中使用了一些在主模块中已经加载也就是定义的类。打个比方说,主模块SWF大小为100k,加载的子模块的SWF大小为60K,但是大约有30k大小左右的在主模块中定义的类被编译进了子模块中。子模块在编译的时候需要主模块中的类,但是你知道子模块仅仅只被主模块加载,所以没有必要让子模块的SWF中也编译那些在主模块中定义的字节码。 也许你的主模块加载不止一个子模块,而这些子模块都使用和共享了主模块中的类,当我们不把这30k左右的字节码编译进每一个子模块中时,我们的项目SWF 文件就会变小很多。那么在AS3中如何不把这些在主模块中定义的类编译进子模块中呢?AS3中mxmlc编译器有一个link-report编译选项,当 mxmlc编译完成的时候会把编译进SWF文件中所有类列表的信息保存在link-report选项指定的XML文件中,一般命名为 report.xml。在编译子模块的时候,我们可以把在编译主模块时产生的report.xml文件给mxmlc编译器的load-externs编译选项,从而使在编译子模块的时候可以不把在report.xml文件中子模块依赖的类编译进子模块的SWF文件中。关于mxmlc编译器的link- report和load-externs选项的更详细信息可参考Adobe的相关文档。

 

3.避免初始化没有使用的类(avoiding initializing unused classes) 最常见的避免没有必要的类引用的方法包括不要初始化没有使用的类和使用getQualifiedClassName()方法执行类型检查。下面的函数检查是否一个显示对象是按钮控件,这个例子迫使编译器把Button编译进SWF文件中,即使该显示对象不是一个按钮控件而且整个程序没有使用按钮控件。 public function checkChildType():void { var child:DisplayObject = getChildAt(0); var childIsButton:Boolean = child is spark.components.Button; s = "child is spark.components.Button: " + childIsButton.toString(); } 然而,你可以用getQualifiedClassName()方法来完成同样的任务,Button类也不会被强迫 编译进SWF中。下面的函数使用getQualifiedClassName()来完成和上面函数同样的功能。 public function checkChildType():void { var child:DisplayObject = vg1.getChildAt(0); var childClassName:String = getQualifiedClassName(child); var childIsButton:Boolean = childClassName == "spark.components::Button" s = "child class name = Button (" + childIsButton + ")"; t = "child is " + childClassName; } 其它关于减小SWF文件大小的方法,还有很多例如动态加载外部资源(图片,国际化资源), 模块化等等,在此就不一一赘述了。

 

相关链接如下: http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf67110-7ff4.html#WS2db454920e96a9e51e63e3d11c0bf67110-7ff2 http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7fcc.html http://www.bit-101.com/blog/?p=941

你可能感兴趣的:(如何减小SWF文件的大小)