2014-02-07 4 views
1

Я представляю 60 изображений и получаю предупреждение о памяти. Есть ли лучший подход к моему коду ниже?Рендеринг 60 изображений, вызывающих предупреждение памяти

- (void)change{ 
    for (int aniCount = 1; aniCount < 60; aniCount++) { 
     if ([UIScreen mainScreen].bounds.size.height == 568) { 
      self.renderString = [NSString stringWithFormat: @"%i_5.png", aniCount + 1]; 
      self.imageView.image = [UIImage imageNamed:@"1_5.png"]; 
     }else{ 
      self.renderString = [NSString stringWithFormat: @"%i.png", aniCount + 1]; 
     } 
     // here is the code to pre-render the image 
     UIImage *frameImage = [UIImage imageNamed:self.renderString]; 
     UIGraphicsBeginImageContext(frameImage.size); 
     CGRect rect = CGRectMake(0, 0, frameImage.size.width, frameImage.size.height); 
     [frameImage drawInRect:rect]; 
     UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     [self.menuanimationImages addObject:renderedImage]; 
    } 

    self.imageView.animationImages = [NSArray arrayWithArray: self.menuanimationImages]; 
} 

Этот метод вызывается в моем - (void)viewDidLoad

примере того, что экран приложения выглядит следующим образом: https://www.youtube.com/watch?v=2f80UcLhOW8

+0

Все ли 60 изображений отображаются на экране одновременно? Если это кешировать изображения с размером, необходимым для отображения, если не только нарисовать видимые изображения. – Joe

+0

Не происходит того, что после нажатия кнопки изображение меняет отображение каждого изображения в анимации по одному за раз. – DevC

+0

Ваше предложение хорошее, но я не слишком разбираюсь в кешировании. Можете ли вы предложить? – DevC

ответ

2

ли мы выводим из проверки разрешения экрана, что это полноэкранные изображения? Если это так, для полноэкранной анимации с 60 изображениями требуется необычайный объем памяти, и я не удивлен, что вы получите предупреждения о памяти. Каждое изображение, используемое в UIImageView, потребует не менее четырех байтов на пиксель.

Для изображений без сетчатки на 4-дюймовом экране, для которых требуется 60 изображений в полноэкранном режиме, требуется примерно 42 МБ. Если это изображения сетчатки (с удвоенной разрешающей способностью), которые перескакивают до 166 мб. Не смотрите на размер PNG-файлы при рассмотрении объема используемой памяти, потому что файлы PNG имеют некоторое сжатие, но они будут несжаты, если вы используете их в своем приложении.

Как правило, вы не хотите, чтобы анимация использовала много полноэкранных изображений. хотелось бы, вероятно, рассмотреть программную анимацию представления с использованием анимации UIKit или Core Animation (или других подобных технологий). Или, если вам действительно нужно использовать последовательность изображений, посмотрите, можете ли вы ограничить часть, которая анимирована на меньшую часть экран, используя меньшие изображения и требуя f меньше памяти.

Трудно сказать, не зная, как выглядит анимация. Если вы описываете анимацию (или покажете нам снимок экрана или два), мы, возможно, предложим гораздо меньше подходов к работе с памятью.


В комментариях вы поделились link to a video, который показывает желаемый калейдоскопической эффект. Несколько мыслей:

  1. Сначала я обратил внимание на программные способы визуализации калейдоскопических эффектов. Учитывая сложность здесь, это может привести меня к исследованиям подходов «OpenGL ES» для рендеринга этого калейдоскопического эффекта. У вас может быть даже шанс на некоторые существующие реализации.

  2. Я заметил, что есть Основные фильтры изображений для CIKaleidoscope и CITriangleKaleidoscope, которые могут быть полезны при создании эффекта, который вы ищете (см Core Image Filter Reference для получения информации об этих двух фильтрах). Я не думаю, что они будут здесь совершенно правы, но работа проверяется.

  3. Неспособность выполнить вышеуказанные попытки программно отображать калейдоскоп, мне кажется, что, по крайней мере, вы могли бы уменьшить требования к памяти вашей текущей реализации в четыре раза, учитывая, что эффект калейдоскопа как бы горизонтально и вертикально-симметрично. Таким образом, теоретически вы можете иметь последовательность изображений для верхнего левого квадранта, а затем отображать другие три в качестве преобразований одного и того же изображения.

  4. Или вы также можете создать полноэкранное видео и использовать media player framework, чтобы воспроизвести его.

Я бы, вероятно, исчерпал эти линии запроса, прежде чем преследовать анимацию с помощью последовательности полноэкранных изображений.Полноэкранные изображения просто станут неэффективным способом решения этой проблемы, и вы почти наверняка столкнетесь с проблемами. И если вы когда-либо рассматриваете исполнение iPad приложения или хотите рассмотреть более длинные последовательности, то подход серии полноэкранных изображений, вероятно, будет полностью несостоятельным.

+0

Анимация действительно полноэкранная, вы правы. Это необходимо для полноэкранного просмотра, поэтому у меня нет альтернативы уменьшению размера изображения. Изображение - это размер экрана, с версиями не сетчатки и сетчатки, после нажатия кнопки он просматривает все изображения. Почти так же, как фильмы были сделаны много лет назад. – DevC

+0

ее пример того, что делает приложение: https://www.youtube.com/watch?v=2f80UcLhOW8 – DevC

+0

@Gman Спасибо, что поделились ссылкой на видео. Я бы определенно рассмотрел программный способ генерации этого калейдоскопического эффекта. Если ваши исследования в этих областях не дают результатов, я бы предложил вам опубликовать новый вопрос, посвященный калейдоскопическим эффектам, изложив то, что вы исследовали и попробовали, и попросите рекомендации о том, как действовать. Но мне кажется маловероятным, что серия полноэкранных изображений всегда будет плодотворным (хотя я понимаю, почему вы начали с нее, так как она имеет определенную простоту). – Rob