Есть ли более эффективный способ анимации последовательности изображений?
-
10-07-2019 - |
Вопрос
Боюсь, это злой код:
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 просто поддерживает полноэкранный режим, и я не знаю ничего другого, что могло бы это сделать)
Решение
Я бы старался не загружать так много изображений в массив UIImageView. Аналогичный вопрос был задан здесь . Метод буферизации, который я здесь описываю, также должен применяться к вашей ситуации. Р>
Другие советы
Вы правы насчет imageNamed ... вам не следует использовать его во многих случаях, поскольку он внутренне кэширует изображение. Использование:
[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image1" ofType:@"png"];
Единственный раз, когда вы хотите использовать imageNamed, это когда
1) Вы снова и снова используете значок (просмотр таблиц и т. д.)
2) Вы не внедрили собственную систему кэширования р>