Анимация медленная на iPhone - PullRequest
0 голосов
/ 06 мая 2010

Я разрабатываю приложение, которое будет отображать изображения и изменять их в соответствии с действиями пользователя. Я создал подкласс UIView, который будет содержать изображение, порядковый номер и массив имен изображений. Код такой:

@interface CustomPic : UIView {
    UIImageView *pic;
    NSInteger index;
    NSMutableArray *picNames;  //<-- an array of NSString
}

А в части реализации есть метод для изменения изображения с использованием эффекта растворения.

- (void)nextPic {
    index++;
    if (index >= [picNames count]) {
    index = 0;
    }
    UIImageView *temp = pic;
    pic.image = [UIImage imageNamed:[picNames objectAtIndex:index]];
    temp.alpha = 0;

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    [UIView setAnimationDuration:0.25];
    pic.alpha = 0;
    temp.alpha = 1;
    [UIView commitAnimations];
}

В viewController есть несколько CustomPic, которые изменят изображения в зависимости от выбора пользователя. Изображения будут меняться, как и ожидалось, с эффектом постепенного исчезновения, но производительность анимации действительно плохая. Я тестировал его на iPhone 3G, инструменты показывают, что анимация составляет всего 2-3FPS! Я перепробовал много методов, чтобы упростить и изменить коды, но без надежды. Что-то не так в моем коде или в моей концепции? Спасибо за любую помощь.

P.S. все изображения в формате PNG 320 * 480 с максимальным размером 15 КБ.

Ответы [ 4 ]

1 голос
/ 06 мая 2010

Попробуйте изменить

[UIView setAnimationDuration:0.25];

до

[UIView setAnimationDuration:0.025];

и посмотрите, ищите ли вы это ...

1 голос
/ 06 мая 2010

В этом фрагменте кода вы используете только один UIImageView:

UIImageView *temp = pic;

Итак, эта строка ничего не делает:

pic.alpha = 0;

Чтобы добавить одно изображение и другое изображение, вам нужно два экземпляра UIImageView.

Чтобы ускорить процесс, вы можете загрузить следующее изображение раньше времени. Установите делегата для анимации и, когда он завершится, загрузите изображение, которое будет отображаться при следующем вызове nextPic.

Edit:

Если изображения не прозрачны, попробуйте установить pic.opaque = YES;, чтобы представление могло игнорировать базовые виды. Если это не вариант, попробуйте иметь как можно меньше видов между исчезающим видом и полноэкранным непрозрачным видом. На каждом этапе постепенного изменения вид должен быть объединен с каждым нижележащим видом, пока не будет найден непрозрачный вид.

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

1 голос
/ 06 мая 2010

Вы используете iPhone OS 4 beta? Я считаю, что бета-версия намного медленнее на устройствах старшего поколения, таких как iphone 3g

0 голосов
/ 06 мая 2010

При длительности анимации 0,25 секунды вы можете гарантированно получить <4 FPS. На какой FPS вы ориентируетесь? </p>

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