13

iOS6用にHungryHelga(iPhoneおよびiPadバージョン)を更新中です。新しいアプリバンドルアーカイブ内のすべてのPNGファイルは、過去のリリースよりも20〜40パーセント大きくなっています。もちろん、これは私に50 MBの3Gダウンロード制限を超えさせているので、私は本当に何が起こっているのかを理解したいと思います。

現在、OSX10.7.5でバージョン4.5のXcodeを使用しています。正しく思い出せば、以前のバージョンはXcode4.2でビルドされていました。ビルド設定でPNG圧縮のオンとオフを切り替えてみましたが、バンドル内の画像サイズには影響しませんでした。

具体的な例を挙げると、私の最大のPNG画像はソースアセットとして1.9MBです。古いアプリバンドルでは2.1MB、新しいアプリバンドルでは2.5MBです。

AppleはPNGコンプレッサーの動作方法を変更しましたか、それとも私が欠けている設定などがありますか?

4

3 に答える 3

20

私はAppleで働いておらず、内部情報も持っていませんが、私はいろいろと調べて、いくつかの理論を持っています。ターミナルを使用している場合は、Xcode.appにcdして、そこにpngcrushを見つけることができます。

$検索。-name pngcrush ./Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush

次に実行する場合:

./pngcrush -?

あなたはいくつかの興味深い一口を見つけます:

| LLVM4.2.1互換のAppleClang4.0(tags / Apple / clang-420.0.12)でコンパイルされ、ソースに示されているようにAppleによって変更されました。

-iphone(iPhone OS用に最適化)

バンドル内で元の(以前に自分で粉砕したものよりもはるかに大きい)いくつかの大きなpngも見たので、Xcodeがpngcrushをどのように使用するかを確認したいと思いました。私は古いUNIXのトリックを使用しました:

  • pngcrushをxpngcrushに移動します
  • 同じ引数リストでpngcrushを呼び出す新しい実行可能シェルファイルを作成します
  • 引数を/tmpのテキストファイルに記録します

私が見つけたのは、Appleがpngcrushを次のように呼んでいることでした。

pngcrush -q -iphone oldFile newFile

このことから、このpngrushのApple固有の機能は、iOS用に画像を調整するために特別に設計されたものであると推測できます。私は仕立て屋と言いますが、つぶすのではありません。

Appleは、スペースを最大限に節約するために、pngが可能な限り最小のファイルであるかどうかを本当に気にしますか?私は主張しますが、実際にはそうではありません-デバイスにはかなり大きなファイルストレージスペースがあります。あなたのアプリが本当に速くダウンロードされるかどうか、彼らは本当に気にしますか?繰り返しになりますが、ユーザーは時間がアプリのサイズに関連していると想定し、それは開発者の管理下にあるため、実際には議論しません。

ただし、ユーザーがAppleに責任を負わせるのは、起動速度です。最初のタップからアプリが何かを開始するまで-人々はそれがデバイスのすべての速度であると信じるでしょう(私たちの開発者はそれが厳密には真実ではないことを知っています)。新しいiPad3では、いくつかの起動画像が非常に大きくなっているので、それらをできるだけ速くロードするために何ができるでしょうか。

その質問に対する答えはわかりませんが、Appleが元の画像を解凍してから、デバイスへの読み込みをできるだけ速くする設定で再圧縮することは想像できます。

PS:

1)クラッシュオプションを無効にしたところ、Xcode4.5が変更なしでpngファイルをコピーしているのが観察されました。

2)アプリのサイズを小さくするために、1つでも高品質の設定でJPEGを使用してみましたか?このような画像は非常に見栄えがよく、はるかに小さくなります。私のアプリの実質的にすべての画像はJPEGです。プレビューを試して変換を行うことができます。

編集:これにはエレガントな解決策があるかもしれないと私は思いました。つまり、非常に重要な画像(できるだけ速く表示したい画像)の場合は、「-iphone」フラグを指定してpngcrushを使用します。その他の場合は、より標準的なpngcrushオプションを使用します。

これを行う1つの方法は、新しい画像ディレクトリを作成し、すべてのpngを実際のクラッシャーまたはtje'-iphone'フラグで前処理するシェルファイルを作成し、出力を元の画像フォルダー(Xcodeが取得できる場所)に配置することです。 )。次に、自動の「PNGファイルのクラッシュ」オプションをオフにします。

EDIT2:私はbugreporter.apple.comにバグを入力し、Xcode listservに投稿しました-このブックマークに興味がある場合は、質問を更新して戻ってきてください。

EDIT3:誰かが私にAppleの「-iphone」オプションImageOptimの方法と理由をより詳細に説明するリンクをくれました

EDIT4:Appleは私のバグレポートに応答し、iOSでの処理を容易にするために画像を変更することを確認しました。これにより、意図的に画像が大きくなる可能性があります。

于 2012-10-01T12:13:55.577 に答える
1

Xcode5で画像圧縮が変更されました。最適で圧縮された方法は、アセットカタログを使用することです。

Xcode 5とアセットカタログを使用してもアプリでうまくいかない場合は、pngcrushツールを使用して他の相対的なPNG後の最適化の問題を確認してください。

于 2014-04-29T10:26:17.253 に答える
0

David Hのスクリプトを使用して、Xcodeがコマンドラインパラメーター「-f0」もpngcrushに渡していることがわかりました。マニュアルページには、「-f 0」を使用すると、圧縮前にIDATフィルタリングが無効になり、PNGファイルが大きくなる可能性があることが示されています。上記の1.9MBのサンプルファイルでテストすると、次のことが確認されます。

pngcrush -iphone in.png out.pngは、私が探している2.1MBの結果を提供します

pngcrush -iphone -f 0 in.png out.pngは、望ましくない2.5MBの結果を生成します

さて、質問は次のとおりです。なぜAppleはこれを変更したのですか?私がそれを回避した場合、それは何らかの方法で画像の読み込みを中断しますか?そうでない場合、Xcodeにこれの設定がありますか、それとも常にスクリプトを使用して「-f0」引数を除外する必要がありますか?

于 2012-10-04T05:58:30.377 に答える