Почему изображения 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 или может быть настройка, которую я пропускаю или что-то еще?
Ответы
Ответ 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, чтобы получить больше ответов полезно