我正在为iOS 6更新Hungry Helga(iPhone和iPad版本),我的新应用程序包存档中的所有PNG文件都比我以前的版本大20%到40%。当然,这让我超过了50 MB的3G下载限制所以我真的想知道发生了什么。
我目前在OSX 10.7.5上使用Xcode 4.5版。如果我没记错的话,之前的版本是用Xcode 4.2构建的。我尝试在构建设置中打开和关闭PNG压缩,但这对包中的图像大小没有影响。
举一个具体的例子,我最大的PNG图像是1.9 MB作为源资产。旧应用程序包中为2.1 MB,新应用程序包中为2.5 MB。
Apple是否改变了PNG压缩器的工作方式,或者可能是我缺少的设置或其他什么?
答案 0 :(得分:19)
我不为Apple工作,也没有任何内部信息 - 但是,我确实在寻找并有一些理论。如果你使用终端,你可以进入Xcode.app并在那里找到pngcrush:
$ find。 -name pngcrush ./Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush
然后运行:
./pngcrush -?
你发现了一些有趣的花絮:
|它是使用LLVM 4.2.1兼容的Apple Clang 4.0编译的 (标签/ Apple / clang-420.0.12)并由Apple修改,如图所示 源。
和
-iphone(针对iPhone OS进行优化)
因为我也看到了一些大的pngs,其中包含的内容也比原来的大得多(我以前曾压碎过自己!),我想看看Xcode如何使用pngcrush。我使用了一个旧的UNIX技巧:
我发现Apple称pngcrush为:
pngcrush -q -iphone oldFile newFile
可以从中推断,pngrush的这个Apple特定功能是专门为iOS定制图像而设计的。我说裁缝,而不是暗恋。
如果您的png是最小的文件,Apple真的关心,以节省最大的空间吗?我认为,不是真的 - 设备有相当大的文件存储空间。如果您的应用下载速度非常快,他们真的关心吗?同样,我认为不是真的,因为用户将假设时间与应用程序的大小相关,并且这是由开发人员控制的。
但是,用户要对Apple负责的是启动速度。从第一次点击到应用程序开始做某事时 - 人们会相信这是设备的全部速度(我们开发人员知道并非严格意义)。使用新的iPad3,一些发布图像现在非常大,那么可以做些什么来尽可能快地加载它们呢?
我不知道这个问题的答案,但我可以想象Apple会解压缩原始图像,然后使用尽可能快地将其加载到设备中的设置重新压缩它。
PS:
1)我刚刚禁用了crush选项,并观察到Xcode 4.5没有修改就复制了我的png文件。
2)为了降低您的应用尺寸,您是否尝试过使用高质量设置的JPEG - 甚至1?这样的图像看起来非常好并且要小得多。实际上我的应用中的所有图像都是JPEG。您可以尝试预览来进行转换。
编辑:我觉得可能有一个优雅的解决方案。也就是说,对于非常重要的图像 - 您希望尽可能快地显示图像 - 然后使用带有'-iphone'标志的pngcrush。对于其他人,请使用更多标准的pngcrush选项。执行此操作的一种方法是创建一个新的图像目录,并编写一个shell文件,该文件使用真正的破碎机或tje' -iphone'标志对每个png进行预处理,将输出放在原始图像文件夹中(其中Xcode可以得到他们)。然后关闭自动'Crush PNG Files'选项。
EDIT2:我在bugreporter.apple.com上输入了一个错误,并在Xcode listserv上发布了 - 如果您对此书签感兴趣,请在更新后再回来。
EDIT3:有人给了我一个链接,详细解释了Apple的'-iphone'选项ImageOptim
的方式和原因EDIT4:Apple回复了我的错误报告,确认他们修改了图片以便iOS更容易处理,这可能会让他们变得更大。
答案 1 :(得分:1)
Xcode 5现在改变了图像压缩。最好和压缩的方法是使用资产目录。
如果即使使用Xcode 5和资产目录对您的应用程序效果不佳,请查看其他相对帖子PNG optimization issue using pngcrush tool以获取更多答案可能会有所帮助
答案 2 :(得分:0)
使用David H的脚本,我发现Xcode也将命令行参数“-f 0”传递给pngcrush。手册页指示“-f 0”将在压缩之前禁用任何IDAT过滤,这可能导致更大的PNG文件。从上面测试我的1.9 MB示例文件确认:
pngcrush -iphone in.png out.png 给出了我想要的2.1 MB结果
pngcrush -iphone -f 0 in.png out.png 会产生不需要的2.5 MB结果
现在的问题是:为什么Apple会改变这个?如果我解决它会以某种方式破坏图像加载吗?如果没有,Xcode中是否有此设置,或者我是否总是必须使用脚本来过滤掉“-f 0”参数?