Быстрее iPhone PNG Анимации - PullRequest
4 голосов
/ 08 ноября 2010

В настоящее время у меня есть анимация PNG по таймеру, который срабатывает каждые 0,01 секунды.Тем не менее, производительность не является оптимальной, а анимация заметно медленной.У меня есть более 2000 изображений.Есть ли лучший способ сделать это?Ниже я опубликовал нечто похожее на мой подход.

timer_ = [NSTimer scheduledTimerWithTimeInterval:.01 target:self
selector:@selector(switchImage) userInfo:nil repeats:YES];


-(void)switchImage 
{
   p = [p stringByAppendingFormat:@"/Movie Clipping 1 000%i.png",i];
   imageView_.image = [UIImage imageWithContentsOfFile:p];
   i = i++;
}

Ответы [ 3 ]

7 голосов
/ 09 ноября 2010

точно, какого размера (я имею в виду КБ, а также точный размер пикселя) ваши PNG?

Мы проделали большую работу над этим и без проблем воспроизводим анимацию на панели размером, скажем, 500x500. Так что мне просто интересно, спасибо.

Одной из непосредственных проблем является то, что вы пытаетесь работать с частотой 100 Гц, 100 раз в секунду ??!

Это абсолютно невозможно. Ничто не работает на 100 кадров в секунду. 20 кадров в секунду - это «чрезвычайно плавный», 30 кадров в секунду - «потрясающе плавный», 40 кадров в секунду - «ошеломляющий уровень человеческого зрения и исследований, если это возможно», а 100 кадров в секунду - невозможно.

Это абсолютно не имеет ничего общего с OpenGLES.

Обычная среда очень быстро загрузит кадры.

Итак, сначала вернитесь к 30 кадрам в секунду (максимум!) И выбросьте каждое 2-е и 3-е изображение, чтобы анимация выглядела одинаково. т.е. "i = i ++" становится "i + = 3" в вашей строке кода.

Вполне вероятно, что это огромная проблема, которая разрушает ваши усилия!

Следующая проблема! Если вы загружаете каждое изображение таким же образом, вам почти наверняка понадобится отпустить их все на лету , когда вы будете использовать пару строк, что-то вроде ...

[happy.image release];
happy.image = [[UIImage alloc] initWithContentsOfFile:
    [[NSBundle mainBundle] pathForResource:@"blah" ofType:@"png"]];

Если вы этого не сделаете, это просто не сработает.

Следующая проблема! Идея использования видео бесполезна, но не могли бы вы просто использовать повседневное анимированное изображение? Таким образом ...

#define BI(X) [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@X ofType:@"tif"]]

    happyDays  = [[NSArray alloc] initWithObjects:
            BI("hh00"), BI("hh01"), BI("hh02"), BI("hh03"), BI("hh04"), BI("hh05"), BI("hh06"), BI("hh07"), BI("hh08"), BI("hh09"), 
            BI("hh10"), BI("hh11"), BI("hh12"), BI("hh13"), BI("hh14"), BI("hh15"), BI("hh16"), BI("hh17"), BI("hh18"), BI("hh19"), etc etc etc
            nil];

    animArea.animationImages = happyDays;
    animArea.animationDuration = 2.88;
    // that is overall seconds. hence: frames divided by about 30 or 20.
    [animArea startAnimating];

Не подходит для вашей ситуации?

В любом случае, одним словом, ваша проблема - 100 кадров в секунду. Измените на 20 кадров в секунду, и у вас не возникнет проблем. И сообщите нам точный размер изображения (КБ / х.у).

1 голос
/ 09 ноября 2010

Как насчет CADisplayLink для управления частотой кадров?

OpenGLES необходимо потратить время на преобразование изображения в текстуру, а текстурам требуется тщательное управление памятью.Когда памяти недостаточно, генерируется целая белая текстура.

0 голосов
/ 08 ноября 2010

Кодируйте анимацию как видео и воспроизводите видео.

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