частота кадров и количество кадров в iphone - PullRequest
2 голосов
/ 11 мая 2009

Я работаю над приложением, в котором клиент хочет анимировать большие изображения (305x332). Клиент хочет, чтобы анимация в цикле состояла из 50 кадров за 1,75 секунды. Я обнаружил, что приложение очень медленно с такой большой обработкой. Он медленно запускается, реагирует на прикосновения и выключается. На iPhone само приложение часто зависает или блокирует телефон. Смотрите код ниже. Мой вопрос (ы):

  1. Я что-то делаю, чтобы снизить производительность или 50 кадров слишком много, чтобы спросить?
  2. Существуют ли рекомендации по количеству кадров в анимации и скорости анимации?
  3. Есть ли рекомендации по размеру изображений в анимации?

Пожалуйста, дайте мне знать. Вот код ...

NSMutableArray *tempArray = [[NSMutableArray alloc] init];
for(int i = 1; i <= 50; i++)
{

    [tempArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%@-%d-%04d.JPG",[constitution getConstitutionWord], constitution.getAnimationEnum, i]]];  
}


backgroundImage.animationImages = tempArray;
[tempArray release];
backgroundImage.animationDuration = 1.75; // seconds 
backgroundImage.animationRepeatCount = 0; // 0 = loops forever 
[backgroundImage startAnimating];   

Ответы [ 3 ]

5 голосов
/ 12 мая 2009

Я провел несколько тестов некоторое время назад. Удалось максимизировать около 40 кадров из примерно 20K PNG до того, как анимация UIImageview перестала работать и потерпела крах.

Если вам нужно больше, вы можете переключиться на использование видео или написать собственный движок рендеринга анимации. Движок рендеринга довольно прост. Он будет работать по таймеру, который выбирает уже загруженный UIImage из заголовка очереди, обновляет представление, а затем выпускает изображение. Отдельный поток предварительно загружает несколько кадров впереди в хвостовой части очереди. Таким образом, у вас есть не более N кадров в памяти в любой момент времени. Вы можете настроить его, чтобы найти оптимальный баланс между задержкой таймера и количеством кадров для предварительной загрузки вашего приложения.

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

Несколько советов:

  • Используйте CALayers как можно больше.

  • Не делайте НИКАКОГО масштабирования при отображении каждого кадра. Попробуйте сделать каждое исходное изображение точного размера, который вы хотите отобразить.

  • Старайтесь не закрывать анимацию другими видами. Это замедлит ход событий.

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

  • Синхронизация звука становится немного рискованной. Вам придется придумать свой собственный способ обозначить, когда начинать / останавливать звуки. Если у вас есть звук, и вам нужно, чтобы он был точным (например, синхронизация губ), видео-маршрут может быть более практичным.

Удачи.

4 голосов
/ 11 мая 2009

Я думаю, что это слишком много, чтобы спросить у iPhone. Распакованные изображения занимают около 21Mb в соответствии с моим пакетом. Это, вероятно, приведет к тому, что ваше приложение будет прервано на телефоне только из-за использования памяти. Перенос такого большого количества данных в кадровый буфер также вызовет проблемы с телефоном.

Я думаю, вам нужно использовать более подходящую технологию анимации. ~ 30 кадров в секунду при 305 * 322 для меня звучит как видео. Видео сжимается таким образом, что вам не нужно одновременно хранить все распакованные кадры в памяти. К сожалению, если вы хотите отображать видео, не передавая весь экран встроенному элементу управления, вам придется создать свой собственный проигрыватель - VLC был перенесен на iPhone, поэтому может стать хорошей отправной точкой.

0 голосов
/ 13 ноября 2009

То, как мне это объяснили, то, как OS X, включая iPhone OS, отображает его, изображения будут постоянно накладываться друг на друга. Возможно, вы захотите попробовать большое спрайт-изображение, которое включает все кадры, обрезанные по одному за раз и привязывающиеся к каждому кадру по мере необходимости. Это также снижает накладные расходы на файл изображения и скорость рендеринга, как это делают спрайты CSS в веб-приложениях. Это хорошо работает в анимациях HTML5 / CSS3, которые я делал на iPhone, и может иметь такой же успех в анимации фоновых изображений.

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