Выполнение оптимизации iPhone на внешне загруженных PNG - PullRequest
7 голосов
/ 13 марта 2009

Когда PNG добавляется в проект iPhone XCode, компилятор оптимизирует его с помощью pngcrush. На устройстве скорость рендеринга изображения очень высокая.

Моя проблема заключается в том, что мое приложение загружает свои PNG-файлы из внешнего источника во время выполнения (из веб-альбомов Picasa, используя API данных Google). К сожалению, производительность этих изображений довольно плохая. Когда я делаю пользовательский рендеринг поверх изображения, он кажется в 100 раз медленнее, чем его внутренне сохраненные аналоги. Я сильно подозреваю, что это потому, что загруженные изображения не были оптимизированы.

Кто-нибудь знает, как я могу оптимизировать загруженный извне PNG во время выполнения на iPhone? Я надеюсь на класс, который делает это. Я даже подумал о добавлении исходного кода pngcrush в мое приложение, что выглядит радикально. Я не смог найти достойного ответа сам. Буду очень признателен за любую помощь.

Спасибо!

Обновление: Некоторые люди предположили, что это может быть связано с размером файла, но это не так. Во время моих тестов я добавил кнопку переключения, чтобы переключаться между использованием встроенной версии и загруженной версии точно такого же PNG. Разница лишь в том, что во время компиляции встроенный был оптимизирован с помощью pngcrush. Это делает некоторую замену байтов (от RGBA до BRGA) и предварительное умножение альфа. (http://iphonedevelopment.blogspot.com/2008/10/iphone-optimized-pngs.html)

Кроме того, речь идет не о загрузке, а о рендеринге. Я накладываю пользовательское рисование поверх изображения (переопределяя метод drawRect в UIView), и оно очень изменчиво, когда фон является загруженной версией, и очень плавным, когда это встроенная (и поэтому оптимизированная) версия. Опять же, это точно такой же файл. Единственное отличие - оптимизация, которую я надеюсь выполнить на образе во время выполнения, на устройстве после его загрузки.

Еще раз спасибо за помощь всем!

Ответы [ 7 ]

7 голосов
/ 13 марта 2009

Ссылка, которую вы разместили, в значительной степени отвечает на ваш вопрос.

В процессе сборки XCode предварительно обрабатывает ваш png, поэтому он находится в формате, более удобном для графического чипа в iPhone.

Png, которые не были обработаны подобным образом, вероятно, будут использовать более медленный путь рендеринга, тот, который имеет дело с неродным форматом, и тот факт, что альфа должна быть вычислена отдельно для каждого цвета.

Итак, у вас есть два варианта;

  1. Выполните ту же работу, что и pngcrush, и поменяйте местами порядок / предварительное умножение альфа. Ускорение может быть связано с одним или обоими из них.

  2. После того, как вы загрузили свое изображение, вы можете «создать» новое изображение из него. Это новое изображение должно быть в родном формате iPhone и поэтому должно работать быстрее. Недостатком является то, что он может занять немного больше памяти.

1019 * Е.Г. *

CGRect area = CGRectMake(0, 0, width, height);
CGSize size = area.size;
UIGraphicsBeginImageContext(size);

[oldImage drawInRect:area];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
3 голосов
/ 13 марта 2009

Тот факт, что вы говорите, что «кажется» в 100 раз медленнее, указывает на то, что вы не проводили никаких экспериментов, но сделали предположение (это должна быть оптимизация PNG) и теперь идете по пути, основанному на догадке.

Вы должны потратить время на подтверждение проблемы, прежде чем пытаться ее решить. Моя интуиция говорит, что оптимизация PNG не должна быть проблемой: это в основном влияет на загрузку изображений, но как только они находятся в памяти, не имеет значения, в каком формате они изначально были.

В любом случае, вы должны попробовать сравнение A-B, либо получить код для загрузки оптимизированного PNG откуда-то еще и посмотреть, как он сравнивается, либо создать тестовое приложение, которое просто рисует на двух типах PNG. После того, как вы подтвердите, в чем проблема, вы сможете выяснить, нужно ли вам скомпилировать pngcrush в ваше приложение.

2 голосов
/ 13 марта 2009

На первый взгляд, здесь звучит что-то еще. Любые дополнительные манипуляции с изображениями должны только добавлять время, пока оно не отобразится на экране ...

Можно ли вообще заставить сервер сжать изображения, отправив соответствующий заголовок HTTP? (Если это даже сильно помогает размеру файла, то есть.)

Временное использование источника pngcrush также может быть хорошим тестом, просто для получения некоторых измерений.

1 голос
/ 08 октября 2010

попробуйте pincrush для преобразования обычного png-файла в сжатый png-файл

1 голос
/ 13 марта 2009

Что ж, похоже, что хороший способ сделать это (поскольку вы не можете запустить pngcrush на iPhone и ожидать, что это ускорит его) - это отправлять запросы через прокси-сервер, который запускает pngcrush. У прокси была бы хорошая лошадиная сила, которая могла бы дать вам некоторую выгоду от 100-кратной боли, которую вы чувствуете.

1 голос
/ 13 марта 2009

Вы сохраняете png в оригинальном загруженном размере? Если это большое изображение, его рендеринг займет значительно больше времени.

0 голосов
/ 13 марта 2009

Вы говорите, что рисуете поверх изображения, переопределяя метод drawRect: UIView. Вы пытаетесь сделать некоторую анимацию, многократно рисуя изображение целиком со своими собственными материалами поверх него?

Вы можете получить лучшие результаты, если поместите свои пользовательские элементы в отдельное представление или слой и позволите ОС справиться с наложением результата на фон. ОС будет обновлять только те части экрана, которые вы фактически изменили, и не будет перекрашивать все изображение так часто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...