13

我正在为 iOS 6 更新 Hungry Helga(iPhone 和 iPad 版本),我的新 app bundle 档案中的所有 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 压缩器的工作方式,或者是否有我缺少的设置或其他什么?

4

3 回答 3

20

我不为 Apple 工作,也没有任何内幕消息 - 但是,我确实四处寻找并提出了一些理论。如果你使用终端,你可以 cd 进入 Xcode.app 并在那里找到 pngcrush:

$查找。-name pngcrush ./Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush

如果你然后运行:

./pngcrush -?

你会发现一些有趣的花絮:

| 它是用 LLVM 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-420.0.12) 编译的,并由 Apple 修改,如源代码中所示。

-iphone(针对 iPhone 操作系统进行优化)

因为我也看到一些大的 png 在捆绑包中也比原来的大得多(我之前自己压碎了!),我想看看 Xcode 如何使用 pngcrush。我使用了一个旧的 UNIX 技巧:

  • 将 pngcrush 移动到 xpngcrush
  • 创建一个新的可执行 shell 文件,使用相同的参数列表调用 pngcrush
  • 将参数记录到 /tmp 中的文本文件中

我发现苹果将 pngcrush 称为:

pngcrush -q -iphone oldFile newFile

由此可以推断,pngrush 的 Apple 特有功能是专门为 iOS 定制图像而设计的。我说裁缝,不是暗恋。

Apple 真的在乎你的 png 是否是最小的文件,以节省最大的空间吗?我认为,不是真的-这些设备具有相当大的文件存储空间。他们真的关心你的应用下载速度是否真的很快吗?同样,我认为不是真的,因为用户会假设时间与应用程序的大小有关,并且这是在开发人员的控制之下。

然而,用户要让苹果负责的是启动速度。从第一次点击到应用开始做某事——人们会相信这就是设备的全部速度(我们开发人员知道这并不完全正确)。在新的 iPad3 中,一些启动图像现在非常大,那么如何才能使它们尽可能快地加载呢?

我不知道这个问题的答案,但我可以想象 Apple 会解压缩原始图像,然后使用能够尽可能快地将其加载到设备中的设置重新压缩它。

PS:

1)我刚刚禁用了crush选项,并观察到Xcode 4.5在没有修改的情况下复制了我的png文件。

2)为了缩小应用程序的大小,您是否尝试过使用具有高质量设置的 JPEG - 甚至是 1?这样的图像看起来非常好,而且要小得多。我的应用程序中的几乎所有图像都是 JPEG。您可以尝试使用预览来进行转换。

编辑:我想到可能有一个优雅的解决方案。也就是说,对于非常重要的图像——您希望尽快出现的图像——然后使用带有“-iphone”标志的 pngcrush。对于其他人,使用更标准的 pngcrush 选项。

一种方法是创建一个新的图像目录,并编写一个 shell 文件,使用真正的破碎机或 tje '-iphone' 标志预处理每个 png,将输出放在原始图像文件夹中(Xcode 可以在其中获取它们)。然后关闭自动“粉碎 PNG 文件”选项。

EDIT2:我在 bugreporter.apple.com 上输入了一个错误并发布在 Xcode listserv 上 - 如果您对此书签感兴趣,请在更新时回来。

EDIT3:有人给了我一个链接,更详细地解释了 Apple 的“-iphone”选项ImageOptim的方式和原因

EDIT4:Apple 回应了我的错误报告,确认他们修改了图像以便 iOS 更容易处理,这可能会使它们更大,有意。

于 2012-10-01T12:13:55.577 回答
1

Xcode 5 现在对图像压缩进行了更改。最好的压缩方式是使用资产目录。

如果即使使用 Xcode 5 和资产目录对您的应用程序而言效果不佳,请使用 pngcrush 工具检查其他相关的后 PNG 优化问题以获取更多答案可能会有所帮助

于 2014-04-29T10:26:17.253 回答
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 结果

现在的问题是:为什么苹果要改变这一点?如果我解决它,它会以某种方式破坏图像加载吗?如果没有,在 Xcode 中是否有此设置,或者我是否总是必须使用脚本来过滤掉“-f 0”参数?

于 2012-10-04T05:58:30.377 回答