Есть ли более эффективный способ анимации последовательности изображений? - PullRequest
0 голосов
/ 18 сентября 2009

Боюсь, это злой код:

CGRect iRect = CGRectMake(0.0f, 0.0f, 320.0f, 400.0f);
UIImageView *imgView = [[UIImageView alloc] initWithFrame:iRect];
imgView.animationImages = [NSArray arrayWithObjects:
                [UIImage imageNamed:@"b0001.png"],
                [UIImage imageNamed:@"b0002.png"],
                // 150 more
                [UIImage imageNamed:@"b0152.png"],
                nil];

Я немного помню, что imageNamed: это зло. Если я делаю это таким образом, и у меня есть для предоставления объектов UIImage, то эти объекты UIImage немедленно загружают эти файлы изображений в память, верно? И, кроме того, все эти 152 объемных объекта UIImage занимают большой перерыв в памяти, потому что они автоматически высвобождаются, не так ли?

Итак, в заключение, использование этой техники - отстой. Является ли? Я не знаю. На моем старом iPod touch первого поколения это, кажется, работает без задержки на 25 кадрах в секунду. Очень гладко и приятно. Единственное, чего я боюсь, так это того, что некоторые другие устройства могут думать об этом иначе. Хотя у меня есть самое слабое программируемое касание iPod.

В любом случае, кто-нибудь видит там какие-либо возможности улучшения? Или я не должен использовать это и использовать setImage: из UIImageView в своем собственном алгоритме, который загружал бы и устанавливал эти изображения с отложенными селекторами, используя эту коренастую вещь imageWithContentsOfFile (может быть названа по-другому), без автоматического выпуска? Может быть, какой-нибудь умник написал небольшую библиотеку для высокопроизводительных видеофильмов с большим пальцем, которые состоят из последовательностей изображений?

(нет, видео на iphone недоступно; для этого Apple Framework просто поддерживает полноэкранный режим, и я не знаю ничего другого, что могло бы это сделать)

Ответы [ 2 ]

2 голосов
/ 18 сентября 2009

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

[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image1" ofType:@"png"];

Единственный раз, когда вы хотите использовать imageNamed, это когда

1) Вы снова и снова используете иконку (просмотр таблиц и т. Д.)
2) Вы не внедрили свою собственную систему кэширования

0 голосов
/ 18 сентября 2009

Я бы старался не загружать так много изображений в массив UIImageView. Подобный вопрос был задан здесь . Метод буферизации, который я здесь описываю, также должен применяться к вашей ситуации.

...