Подтвердить что ты не робот

Почему изображения PNG больше в комплекте приложений iOS, чем в моем проекте?

Сейчас я обновляю версию Hungry Helga (версии для iPhone и iPad) для iOS 6, и все PNG файлы в моих новых архивах пакетов приложений на 20-40 процентов больше, чем в моих предыдущих выпусках. Конечно, это ставит меня на ограничение загрузки 3G в 50 МБ, поэтому я действительно хотел бы выяснить, что происходит.

В настоящее время я использую версию 4.5 Xcode на OSX 10.7.5. Если я правильно помню, предыдущая версия была построена с Xcode 4.2. Я попытался включить и выключить сжатие PNG в настройках сборки, но это не повлияло на размеры изображения в комплекте.

Чтобы привести конкретный пример, мое самое большое изображение PNG составляет 1,9 МБ в качестве исходного ресурса. Это 2,1 МБ в старом пакете приложений и 2,5 МБ в новом комплекте приложений.

Яблоко изменило способ работы компрессора PNG или может быть настройка, которую я пропускаю или что-то еще?

4b9b3361

Ответ 1

Используя David H script, я обнаружил, что Xcode также передает параметр командной строки "-f 0" на pngcrush. Страница руководства указывает, что "-f 0" отключит любую фильтрацию IDAT до сжатия, что может привести к большему PNG файлу. Тестирование на моем примере примера с 1,9 МБ подтверждает:

pngcrush -iphone in.png out.png дает результат 2,1 МБ, который я ищу

pngcrush -iphone -f 0 in.png out.png дает нежелательный результат 2,5 МБ

Теперь вопросы: почему Apple изменила это? Как-то это сломает загрузку изображения, если я буду работать вокруг него? Если нет, есть ли параметр для этого в Xcode или мне всегда придется использовать script для фильтрации аргумента "-f 0" ?

Ответ 2

Я не работаю для 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)

Так как я тоже видел, что некоторые большие png, где также намного больше в пакете, чем оригинал (который я раньше раздавил!), я хотел посмотреть, как Xcode использует pngcrush. Я использовал старый трюк UNIX:

  • переместить pngcrush в xpngcrush
  • создать новый исполняемый файл оболочки, который вызывает pngcrush с тем же списком аргументов
  • записать аргументы в текстовый файл в /tmp

Я обнаружил, что Apple вызывает pngcrush как:

pngcrush -q -iphone oldFile newFile

Из этого можно сделать вывод, что эта особенность Apple, характерная для pngrush, была разработана специально для адаптации изображения для iOS. Я говорю, портной, а не раздавить.

Неужели Apple действительно заботится о том, является ли ваш png наименьшим возможным файлом, чтобы сохранить наибольшее пространство? Я бы сказал, на самом деле - устройства имеют довольно большое пространство для хранения файлов. Им действительно интересно, действительно ли ваше приложение загружается очень быстро? Опять же, я бы не стал спорить, так как пользователь собирается предположить, что время связано с размером приложения, а это находится под контролем разработчиков.

Тем не менее, за то, что пользователь собирается удерживать Apple, является скорость запуска. С первого раза, когда приложение начинает что-то делать, люди будут полагать, что это все скорость устройства (что мы, разработчики, знаем, не совсем верно). С новым iPad3 некоторые из изображений запуска теперь очень большие, так что можно сделать, чтобы как можно быстрее загрузить их?

Я не знаю ответа на этот вопрос, но могу представить, что Apple распаковывает исходное изображение, а затем повторно сжимает его с настройками, которые делают загрузку в устройстве как можно быстрее.

PS:

1) Я просто отключил опцию раздавливания и наблюдал, как Xcode 4.5 копирует мои png файлы без изменений.

2) Чтобы уменьшить размер вашего приложения, попытались ли вы использовать JPEG с настройкой высокого качества - даже 1? Такие образы будут выглядеть очень хорошо и быть намного меньше. Практически все изображения в моем приложении - это JPEG. Вы можете поэкспериментировать с Preview для выполнения преобразований.

EDIT: мне пришло в голову, что это может быть элегантное решение. То есть для действительно важных изображений - тех, которые вы хотите показывать как можно быстрее - затем используйте pngcrush с флагом "-iphone". Для других используйте более стандартные параметры pngcrush.

Один из способов сделать это - создать новый каталог изображений и написать файл оболочки, который предварительно обрабатывает каждый png с помощью реальной дробилки или флага tje '-iphone', помещая вывод в исходную папку изображений (где Xcode может получить их). Затем отключите автоматический параметр "Crush PNG Files".

EDIT2: я ввел ошибку на bugreporter.apple.com и опубликовал в списке рассылки Xcode - если у вас есть интерес к этой закладке, вопрос и вернуться, когда она будет обновлена.

EDIT3: кто-то дал мне ссылку, в которой более подробно объясняется, как и почему опция Apple -iphone ImageOptim

EDIT4: Apple ответила на мой отчет об ошибке, подтвердив, что они модифицируют изображения для упрощения обработки iOS, что может сделать их более крупными по намерениям.

Ответ 3

Xcode 5 теперь получил изменения в сжатиях изображений. лучший и сжатый способ - использовать каталоги активов.

Если даже использование Xcode 5 и каталогов активов не подходит для вашего приложения, проверьте другую относительную запись проблему оптимизации PNG с помощью инструмента pngcrush, чтобы получить больше ответов полезно