Какая самая простая техника покадровой анимации в iPhone SDK? - PullRequest
4 голосов
/ 14 июня 2009

Я занимаюсь разработкой для платформы iphone уже около 3 недель, и я пытаюсь настроить покадровую анимацию с 16 изображениями 1000x1000 png (с прозрачностью) и планирую анимировать примерно с 100 позже, поэтому Сначала я попытался использовать imageNamed для анимации всех изображений, как это

-(IBAction)startClick1:(id)sender { cloud.animationImages = [NSArray arrayWithObjects: [UIImage imageNamed: @"g0000.png"], [UIImage imageNamed: @"g0001.png"], [UIImage imageNamed: @"g0002.png"], [UIImage imageNamed: @"g0003.png"], [UIImage imageNamed: @"g0004.png"],

Теперь это работало нормально в симуляторе, но когда оно доходило до устройства, оно просто перезагружалось при первой попытке анимации, возможно, из-за известных проблем с памятью в imageNamed, поэтому после некоторых исследований я обнаружил, что imageWithContentsOfFile предполагается не кэшировать изображения и, надеюсь, не заставит iphone перезагружаться при запросе анимации, поэтому я изменил свой код на что-то вроде этого:

- (IBAction)startClick:(id)sender { gordon.animationImages = [NSArray arrayWithObjects: [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"g0001.png" ofType:nil] ], [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"g0002.png" ofType:nil] ], [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"ge0003.png" ofType:nil] ], [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"g0004.png" ofType:nil] ], [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"g0005.png" ofType:nil] ], [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"g0006.png" ofType:nil] ],

Теперь он работает с ошибками в симуляторе и не работает на устройстве так же, как метод imageNamed. Итак, каков наилучший и самый простой способ анимировать последовательность изображений, которые будут нормально работать на устройстве? Ох, и при ответе помните, что я новичок в этой платформе.

Ответы [ 4 ]

3 голосов
/ 14 июня 2009

Одно существенное различие между imageNamed: и imageWithContentsOfFile: в том, что imageNamed возвращает изображение, предварительно распакованное.

Вы можете создать свою собственную "оптимизированную" версию, не требуя кэширования изображений, посмотрев на этот ответ .

Теперь я заметил, что вы загружаете 1000x1000 изображений, но размер экрана составляет всего 320x480. Вы уменьшаете изображение, кадрируете или как? Если вы уменьшаете масштаб, рассмотрите возможность предварительного уменьшения изображения. Кроме того, ваша анимация должна быть 30 кадров в секунду, или это больше похоже на анимацию слайд-шоу?

Наконец, я бы рекомендовал загружать кадры анимации по требованию. Как вы можете видеть, 1000x1000 изображений занимают слишком много памяти для оптимизации загрузки. Если вы сохраняете в памяти только одну запись, вы не потерпите крах, но тогда вам нужно быть очень осторожным с любыми паузами в вашем коде. Если вы выполняете эффект типа «Кен Бернс» в слайд-шоу, вы можете предварительно оптимизировать (распаковать) одно изображение для рисования на время слайда.

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

1 голос
/ 14 июня 2009

Apple рекомендует всегда использовать программу для изменения размера изображений вместо устройства. Это требует изрядного количества вычислительной мощности. Это может стать серьезным замедлением, если изменить размер 24 изображения за секунду.

0 голосов
/ 23 мая 2011

Я использовал этот код, который отлично работает - www.mode (здесь нет пробелов) jong.com/iPhone/ - Поиск "PNG Animation" (ТАК не позволил бы мне добавить точную ссылку)

Загружает файлы PNG по мере необходимости, а не заранее.

Это решает проблему с памятью (вы можете даже использовать кадры 1000x1000) - Однако вы все еще сталкиваетесь с проблемой дискового пространства. Программа будет огромна для больших / многих анимаций.

НТН,

Одед.

0 голосов
/ 14 июня 2009

У меня были проблемы с получением 3 прозрачных слоев размером 400x400 На iphone нет способа заставить работать 16 изображений такого размера, поэтому сначала необходимо выполнить переоценку, а затем, что касается анимации, я использую повторяющийся таймер, который вызывает каждые 24 секунды для рендеринга и установки рендера на поверхности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...