我试图通过优化嵌入式PNG图形(使用ImageOptim工具)来进一步减少SWF文件的文件大小。令我惊讶的是,这并没有产生任何影响,因此我创建了两个测试图像:
Original(433883字节)
Optimized(273723字节)
将这些资源中的任何一个嵌入到一个简单的ActionScript项目中时,编译的SWF大小约为274kb。这提出了一个问题:Flex是否在编译期间优化嵌入式PNG资产?如果是,是否有一些关于优化的文档? 它不能仅仅因为SWF压缩,因为压缩图像根本不会减少文件大小。
以下是完整性代码:
package
{
import flash.display.Sprite;
public class SizeTest extends Sprite
{
[Embed("/assets/original.png")]
private var ImageAsset:Class;
public function SizeTest(){
}
}
}
答案 0 :(得分:4)
答案是是,flex编译器使用其中一个inbult算法(可能是ZLIB)自动压缩数据,并在它允许您访问之前在另一侧(flash player)透明地解压缩数据未压缩的数据。
我正在将一个ByteArray嵌入到SWF中,虽然外部字节很大(200 KB),但当嵌入到SWF中时,它变成30 KB,产生与使用{{1}手动压缩它的结果几乎完全相同的结果}。
然后我尝试手动压缩PNG / JPEG位图,结果比使用ByteArray.compress("zlib")
标记(172 KB作为压缩ByteArray而不是168 KB作为嵌入图像)明显地嵌入它更大。让Flex编译器处理嵌入式数据压缩实际上比在ByteArray端尝试自己的技巧要好。
编辑:要回答有关PNG嵌入的问题,很难说出flex编译器/ flash播放器内部的情况。虽然以正确的文档而闻名,但Adobe也因许多“未记录的功能”而闻名。您的具体问题最好发送给Flash播放器架构师(例如Tinic Uro)或adobe福音传道者(例如Lee Brimelow),其中一些人可以轻松地在Facebook上访问(请参阅此list)
答案 1 :(得分:2)
swf格式内部有32位PNG(具有alpha通道的PNG)的特殊格式,它们被分割成24位png和灰度alpha蒙版,从而alpha蒙版被JPEG压缩。不完全确定Flex Builder是否进行了这种优化,因为我记得至少在旧版本的嵌入式PNG中没有进行优化。
尽管如此,如果您正在寻找可以优化swfs中嵌入图像的工具,您应该查看Joa Ebert的“Reducer”:http://blog.joa-ebert.com/2009/08/08/reducer/