Есть ли более эффективный способ анимации последовательности изображений?

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

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 touch из имеющихся.

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

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


person Community    schedule 18.09.2009    source источник


Ответы (2)


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

person Ramin    schedule 18.09.2009

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

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

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

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

person coneybeare    schedule 18.09.2009
comment
(1) В программном обеспечении 3.0 + [UIImage imageNamed:] освобождает кэшированные изображения, если получает предупреждение о нехватке памяти. (2) Даже если он постоянно кэшировал, это имеет значение только в том случае, если вы не ожидаете, что изображения будут жить в течение всего срока службы вашего приложения. Итак, хотя техника, которую вы указали, прекрасна, так и + [UIImage imageNamed:]. Это не зло. - person Ken; 18.09.2009
comment
Вы должны дать ответ. - person willc2; 18.09.2009