Задержка анимации ключевого кадра при первом запуске

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


person arundevma    schedule 07.08.2012    source источник
comment
Если вы можете опубликовать больше своего кода, где вы делаете анимацию ключевого кадра, это может помочь. Когда вы делаете это, у вас нет других потоков, выполняющих огромный объем работы? Если это действительно важно для вас, если вы можете запустить небольшой демонстрационный проект с изображениями и опубликовать их в Dropbox, сообщество может поиграть с проектом и, возможно, выяснить, что можно сделать.   -  person David H    schedule 07.08.2012
comment
К сожалению, я не могу размещать изображения, так как они конфиденциальны. но я добавлю код.   -  person arundevma    schedule 07.08.2012
comment
Что ж, возьмите несколько фотографий бутылки или чего-то еще и протестируйте их, а затем опубликуйте. Нам не нужны ваши настоящие изображения, только одного размера. Я понимаю, что это может потребовать некоторых усилий с вашей стороны, но пример проекта, одно представление, воспроизводящее проблему, будет иметь большое значение, позволяя людям с многолетним опытом применить свои навыки и попытаться решить ее.   -  person David H    schedule 07.08.2012
comment
Как сказал @DavidH, опубликуйте свой код. Это нам очень поможет.   -  person NSPunk    schedule 07.08.2012


Ответы (4)


Apple печально известна использованием «ленивых» методов загрузки, и вполне возможно, что размещение изображения, полученного из «[UIImage imageNamed:]», на самом деле не создает кэшированное растровое изображение, а просто квитанцию ​​​​для его создания.

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

CGSize bigSize; // MAX width and height of your images

UIGraphicsBeginImageContextWithOptions(bigSize, YES, 0);
CGContextRef context = UIGraphicsGetCurrentContext();

for(UIImage *image in arrayOfImages) {
    CGContextDrawImage(context, (CGRect){ {0,0}, image.size }, [image CGImage]);
}
UIGraphicsEndImageContext();

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

person David H    schedule 07.08.2012

Этот код предназначен для быстрой версии 2.2!

Попробуйте поместить окончательное изображение, которое вы хотите, до окончания анимации.

Это больше похоже на:

// the animation key is for retrive the informations about the array images
func animation(cicleTime:Int, withDuration: Double, animationKey:String){

    var images = [UIImage]()


    // get all images for animation
    for i in 0...cicleTime {
        let fileName = String(format: "image%d",i)
        let image = UIImage(named: fileName)

        images.append(image!)
    }

    let animation = CAKeyframeAnimation(keyPath: "contents")

    animation.setValue(animationKey, forKey: "animationName")

    animation.duration = withDuration
    animation.repeatCount = 1 // times you want to repeat the animation
    animation.values = images.map{$0.CGImage as! AnyObject}
    animation.delegate = self
    images.removeAll(keepCapacity: false)
    YourViewHere.layer.addAnimation(animation, forKey: "contents")

    YourViewHere.image = UIImage(named: "nameOfYourLastImageOfAnimation")
}

Ну, это работает для меня.

person cotrim149    schedule 03.04.2016

Недавно у меня была эта проблема, и я решил ее, «предварительно запустив» анимацию как можно раньше с продолжительностью 0 и не удаляя ее по завершении. К тому времени, когда я действительно хочу запустить его, вся последовательность загружена и плавна.

let animation: CAKeyframeAnimation = CAKeyframeAnimation(keyPath: "contents")
    animation.calculationMode = kCAAnimationDiscrete
    animation.duration = 0
    animation.values = spritesArray
    animation.repeatCount = 1
    animation.removedOnCompletion = false
    animation.fillMode = kCAFillModeForwards
    layer.addAnimation(animation, forKey: "animateIn")

В моем случае я фактически разделил последовательность на 2 отдельные анимации ключевых кадров для вступления/завершения, и концовка всегда останавливалась перед запуском. Предварительная загрузка всего этого сначала в анимации ключевого кадра продолжительностью 0 предотвратила это.

person bitwit    schedule 04.08.2016

Рассмотрите возможность предварительной загрузки изображений в файл NSArray. Ваша задержка, скорее всего, вызвана тем, что сначала нужно загрузить изображения.

Итак, допустим, у вас есть img1.png, img2.png и т. д. до img10.png:

//do this before your keyframe animation.

NSMutableArray *frames = [NSMutableArray array];
for(int i = 1 ; i <= 10 ; i++)
    [frames addObject:[UIImage imageNamed:[NSString stringWithFormat:@"img%d.png" , i]]];

//now use this array for the animation

Надеюсь это поможет. Ваше здоровье!

person George    schedule 07.08.2012
comment
Я пробовал предварительную загрузку, как упомянул Дэвид, но это помогает только до конца. - person arundevma; 07.08.2012