我有100张png图片,我正在使用CAKeyframeAnimation
生成一个可以播放动画的图层。
代码如下:
CAKeyframeAnimation *kfa = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
kfa.values = animationImages; //CGImage type
kfa.removedOnCompletion = NO;
kfa.duration = 3.f;
kfa.repeatCount = CGFLOAT_MAX;
[layer addAnimation:kfa forKey:nil];
每个图像均为1338 * 1338像素,因此在渲染此动画时,内存将变得很高。 (1338 * 1338 * 4B)
那么如何减少内存使用并获得可接受的性能?
答案 0 :(得分:0)
这样做时,我会避免使用关键帧动画。一个简单的计时器应该可以完成您的工作,但是您也可以研究UIImageView
的本机功能。有一个属性animationImages
。请查看this post。尽管这也会消耗大量的内存。
无论如何,如果您选择手动执行此操作,仍请确保尽快释放内存。您可能仍需要一些内部自动释放池:
@autoreleasepool {
// Code that creates autoreleased objects.
}
我会尝试以下操作(它甚至不需要多余的自动释放池)
+ (void)animateImagesWithPaths:(NSArray *)imagePaths onImageView:(UIImageView *)imageView duration:(NSTimeInterval)duration {
int count = (int)imagePaths.count;
if(count <= 0) {
// No images, no nothing
return;
}
// We need to add the first image instantly
imageView.image = [[UIImage alloc] initWithContentsOfFile:imagePaths[0]];
if(count == 1) {
// Nothing not animate with only 1 image. We are all done
return;
}
NSTimeInterval interval = duration/(NSTimeInterval)(count-1);
__block int imageIndex = 1; // We need to start with one as first is already consumed
[NSTimer timerWithTimeInterval:interval repeats:true block:^(NSTimer * _Nonnull timer) {
if(imageIndex < count) {
imageView.image = [[UIImage alloc] initWithContentsOfFile:imagePaths[imageIndex]];
imageIndex++;
}
else {
// Animation ended. Invalidate timer.
[timer invalidate];
}
}];
}