Решения по повышению эффективности анимации iPhone, вопросы наложения слоев - PullRequest
2 голосов
/ 01 декабря 2009

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

Вид разделен на две части, нижняя 1/5 - это только одно изображение, которое никогда не меняется. В остальном именно там воспроизводится анимация. В настоящее время это делается путем загрузки 32 изображений в массив и последующего воспроизведения через них (8 кадров в секунду). Это делает это в общей сложности 4 раза, проходя каждую анимацию. Картинки не большие, но все же довольно большие. Мне также было интересно, какой формат файла лучше всего их хранить, как с точки зрения общего размера, так и требуемых накладных расходов.

Это очень простой подход, и он работает, но, похоже, он просто не режет, а использует слишком много.

Мое предложение состояло в том, чтобы разделить анимацию на несколько слоев, потому что есть несколько вещей, которые, я думаю, можно сделать по-другому:

  • Сделайте фон одним статичным изображением, чтобы он не был частью анимации
  • Уберите несколько «дудов», таких как движущиеся графики и индикатор выполнения, и сделайте их своими частично прозрачными слоями поверх анимации или под ней. Это также открыло бы дверь, насколько творческая свобода идет в будущем для меня.
  • Вырежьте текст сверху и используйте iPhone для программного отображения текста. Лучше использовать iPhone, чтобы нарисовать текст или загрузить изображение с текстом в нем? Будучи в первую очередь веб-разработчиком, я считаю глупым загружать любые изображения с текстом в них.
  • Воспроизведите то, что осталось после того, как эти вещи вырезаны в виде анимации, которая будет значительно меньше.

Итак, в общем, мы рассматриваем 1 статический фон, 3-5 маленьких анимаций и одну большую. Могу ли я использовать слои, чтобы разделить эти элементы, и больше полагаться на iPhone, чтобы нарисовать окончательное изображение? Вот где я думал, что мог бы сделать это немного лучше, кажется глупым объединять все в одну большую картинку, которую вы пролистываете, как книжка, когда вместо этого вы можете загрузить несколько более мелких элементов, которые используются в приложении, и делать вещи немного более эффективно.

Или я полностью усложняю это, и есть ли лучший способ сделать это?

Edit: я просматривал, и кажется, что использование слоев будет более эффективным. У меня тоже есть другой вопрос. Лучше ли иметь каждый кадр анимации в виде отдельного файла и загружать в массив для анимации, либо иметь одно изображение гигантского листа спрайта со всеми кадрами, и iPhone должен захватывать каждый кадр из листа спрайта с помощью координат программно?

Редактировать 2: С тех пор мы все уладили, проверьте это в магазине приложений.

Ответы [ 2 ]

1 голос
/ 01 декабря 2009

Предполагая, что общая последовательность анимации является статической, лучше всего скомпилировать ее как фильм и использовать для ее воспроизведения каркас проигрывателя фильмов:

MPMoviePlayerController

Это позволит iPhone использовать нестандартное оборудование для дисплея и поддерживать низкий уровень заряда батареи. Что касается взаимодействия с пользователем, вам просто нужно установить свойство movieControlMode, чтобы пользователь не мог взаимодействовать с фильмом:

MPMovieControlModeHidden Do not отображать любые элементы управления. Этот режим не позволяет пользователю контролировать воспроизведение.

Доступно в iPhone OS 2.0 и более поздних версиях.

Объявлено в MPMoviePlayerController.h.

0 голосов
/ 04 декабря 2009

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

Таймер теряет способность работать вовремя @ <0,1 секунды, поэтому, если вы установите его, скажем, на 28 кадров в секунду, с изображениями, отображаемыми для 28 кадров в секунду, он пропустит кадры, но довольно незаметно. </p>

    - (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"VDL");
    [animationFrame initWithInteger:1];
    [self animation];
    NSLog(@"VDL Completed");
}

- (void)animation {
    CGRect animationRect = CGRectMake(0, 0, 320, 384);
    //NSLog(@"animationRect defined");
    animationImages = [[UIImageView alloc] initWithFrame:animationRect];
    [self.view addSubview:animationImages];
    //NSLog(@"animationImages allocated, init'd");
    animationTimer = [NSTimer scheduledTimerWithTimeInterval:0.0357 target: self selector:@selector(blah) userInfo:nil repeats:YES];
    [animationImages setImage:[UIImage imageNamed:[NSString stringWithFormat:@"SCAN%d.jpg", animationFrame]]];
    //NSLog(@"animationTimer started");
    animationTimer = nil;
    //NSLog(@"animationTimer set to nil");
}

- (void)blah {
    if (animationFrame <= 336){
        animationFrame += 1;
        [animationImages setImage:[UIImage imageNamed:[NSString stringWithFormat:@"SCAN%d.jpg", animationFrame]]];
        NSLog(@"%d", animationFrame);
    }
    else {
        animationFrame = 1;
        NSLog(@"restart");
    }
}
...