2015-09-14 43 views
1

我正在创建一个键盘扩展,它显示动画GIF图像,但它一次只显示最多2MB分布在20个GIF中的图像。消耗8 MB内存的2 MB GIF图像

每当加载GIF时,内存消耗增加超过8MB,这导致内存压力,并且键盘在加载后立即终止。

我使用SDWebImage来显示GIF。

任何人都可以建议我,我应该如何使用GIF,或者是在键盘扩展中显示动画GIF的好主意?为什么扩展占用这么多的内存?

谢谢。

+1

GIF被压缩。 2MB GIF图像通常包含2MB以上的原始信息。 –

+0

@TheParamagneticCrosissant是的,但多少钱?如果它高达4MB仍然OK。 – iphonic

回答

3

SDWebImage有很多功能,所以对象会很重。尝试使用FLAnimatedImage。它专门用于显示GIF

+0

是的,我已经在上面,让我们看看它是否有效。 – iphonic

+0

手指交叉!让我知道它是如何做的:) –

+0

是的,它与FLAnimatedImage比SDWebImage更好地工作,崩溃频率减少了很多。谢谢。 – iphonic

0

当GIF加载时,它们将被解压缩,以便它们在内存中占用更多空间。这是因为iOS需要原始位图格式的图像才能编辑或显示它们。

GIF格式具有非常好的压缩比,只有8bpp的色彩空间。所以你的情况下的4倍压缩很可能。

+0

任何解决方案? – iphonic

+0

使用更小的图片。然而,即使是4S,8MB的数据也不算太多。 – Cosmin

+0

是的,使用更小的Gif大约40-50 KB,可能会有一些更大的GIF激增内存使用量,尽管SDWebImage存在问题,它会消耗比正常更多的内存,检查它是否正常工作,一切正常。谢谢。 – iphonic

1

尝试使用FLAnimatedImageNuke,它会自动为您整合FLAnimatedImage。 FLAnimatedImage是目前iOS上最好的动画GIF引擎。

SDWebImage的问题在于它们有自己的动画GIF实现。他们认为遍历所有帧和前期创建位图:从另一方面

for (size_t i = 0; i < count; i++) { 
    CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL); 
    duration += [self sd_frameDurationAtIndex:i source:source]; 
    [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]]; 
    CGImageRelease(image); 
} 

FLAnimatedImage点播创建位图和智能缓存它们。