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

#iphone #ios #crash #core-animation

#iPhone #iOS #сбой #ядро-анимация

Вопрос:

Как я могу создавать анимацию в iOS, не потребляя много памяти (или эффективно), поскольку в настоящее время я сталкиваюсь с проблемами сбоя?

Для одной анимации у меня есть последовательность из 100 изображений, и каждое изображение имеет размер около 40 КБ; таким образом, имеется около 7 анимаций общим объемом почти 700 изображений.

Например, здесь я показал пример анимации с двумя изображениями.Это мой текущий код для создания анимации.

 /*First taking two images into an Array*/
NSArray *imageArray = [NSArray arrayWithObjects:[UIImage imageNamed:@"img1"],[UIImage imageNamed:@"img2"],nil];  
/*Creating an image view as a layer for performing the animation */
imgView = [UIImageView alloc];
[imgView initWithFrame:CGRectMake(110,245,100,100)];
/*Setting the images for performing animations*/
imgView.animationImages = imageArray;
imgView.animationDuration = 8.5 ;//delay for performing the animation
imgView.animationRepeatCount = 1;
/* ..and finally adding the animation to the current view */
[self.view addSubview:imgView];
[imgView startAnimating];
[imgView release];
[imgView stopAnimating];
imageArray = nil;
[imageArray release];
  

Может ли кто-нибудь предложить какое-либо улучшение в коде, чтобы можно было эффективно выполнять анимацию, или есть какая-либо другая альтернатива, такая как OpenGL или Core Animation, если да, может ли кто-нибудь предложить пример кода для этого.

Ответ №1:

Я предлагаю использовать Cocos2d, который представляет собой фреймворк, основанный на Open GL, специально разработанный для игр.

В вашем случае преимущества, которые вы получите, заключаются в следующем:

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

  2. используйте формат PVR для ваших изображений (по сравнению с PNG); PVR — это собственный формат графического чипа iPhone / iPad, и это позволит больше экономить память;

  3. вы также могли бы попробовать использовать формат меньшего размера для ваших изображений (например, RGB565 вместо RGB8888, 16 бит на пиксель вместо 32).

Если вы думаете, что это может сработать для вас, взгляните на это руководство.

Вы могли бы сделать то же самое, используя Open GL или Core Animation напрямую, но я думаю, что лучше позволить Cocos2d разбираться с низкоуровневыми материалами.

Для получения базового руководства по анимации для выполнения того же самого, взгляните на этот пост. Как вы увидите, вы будете реализовывать несколько классов для выполнения вещей, которые Cocos2d уже предлагает вам (вместе со многими другими функциями).

Комментарии:

1. Не могли бы вы предложить эквивалентный код для выполнения того же самого с использованием Core Animation или OpenGL

2. 40 КБ x 100 = огромный лист спрайтов… Вы не сможете использовать это для содержимого слоя.

Ответ №2:

Ссылка mysterycoconut выше хороша, поскольку она позволяет избежать рефлексивного сообщения «использовать Cocos2D», которое всегда появляется, когда люди задают вопрос, связанный с анимацией CoreGraphics на SO. Корень проблемы, с которой вы столкнулись, заключается в плохо продуманном API animationImages, который потребляет слишком много памяти приложения и никогда не должен использоваться. Вы можете прочитать подробное описание проблемы при использовании видео и памяти на устройствах iOS. Там описано мое собственное решение проблемы. По сути, вы хотите распаковать данные изображения в файл, а затем перенести содержимое на видеокарту. В iOS это выполняется очень-очень быстро, а в CoreGraphics используется оптимизированная текстурная логика на уровне видеокарты, которая ограничивает копирование в буфер, так что процессор устройства используется очень мало. При таком подходе можно получить очень быструю анимацию (от 45 до 60 кадров в секунду) сотен изображений, не используя всю память приложения, используя только CoreGraphics.