在iPhone应用程序中预加载图像?

在iPhone应用程序中预加载图像?,iphone,calayer,preloading,Iphone,Calayer,Preloading,我有一个图像序列需要在短时间内显示PNG序列。总共有31个PNG,每个PNG的文件大小约为45KB。我已经为它们加载了以下代码: imgArray = [[NSMutableArray alloc] init]; for(int i = 0; i <= 30; i++) { NSString * filename = [NSString stringWithFormat:@"img_000%.2d.png", i]; UIImage *temp = [UIImage ima

我有一个图像序列需要在短时间内显示PNG序列。总共有31个PNG,每个PNG的文件大小约为45KB。我已经为它们加载了以下代码:

imgArray = [[NSMutableArray alloc] init];
for(int i = 0; i <= 30; i++) {
    NSString * filename = [NSString stringWithFormat:@"img_000%.2d.png", i];
    UIImage *temp = [UIImage imageNamed:filename];
    [imgArray addObject:temp];
    [temp release];
    temp = nil;
} 
我使用以下代码显示图像:

CGImageRef image = [(UIImage *)[imgArray objectAtIndex:imgFrame] CGImage];
imgLayer.contents = (id)image;
if(imgFrame < 29) {
    imgFrame++;
} else {
    imgFrame = 0;
    imgLayer.hidden = TRUE;
    [imgTimer invalidate];
}
其中imgLayer是CALayer。imgTimer是一个间隔为0.03s的重复计时器

但我发现,当我第一次把这些图像叫出时,它是非常滞后的。除了第一次出现外,其他外观没有问题


它与预加载图像有关吗?还是我的图像文件太大?

如果没有分析数据,很难判断延迟的原因。但这里有一个技巧可能会有所帮助:将所有图像合并到一个大文件中。试着把它做成长方形,在你的箱子里可能是6x6或者是4*8。然后加载此单个文件并裁剪出每个图像以供显示,即创建一个图像以供显示,大小为平铺,然后将一个平铺从大图像复制到显示图像中。

图像在使用和显示时会被加载。 如果你在仪器中使用时间分析器,你会发现你正在经历的延迟。如果您随后放大到该延迟并查看是什么导致了它,您通常会看到copyImageBlockSetPNG是一个需要时间的函数,就在充气之前


您必须找到一种方法来创建图像,并在需要它们之前强制加载它们。这显然是另一回事。

我认为这对您的特定问题没有帮助,但将变量声明移出for循环可能不是一个坏主意。我不知道gcc是否足够聪明来解决这个问题,但它看起来相当痛苦。就像一张精灵纸?好的,我试试看。然而,我的PNG都是480 x 500像素大小;如果我加入他们,这将是一个巨大的形象,我认为iPhone无法处理。也许我应该把我的图像缩小一些。是的,就像一张精灵纸。此外,如果你需要动画他们,考虑使用一个动画格式,如AVI或颤抖ANIM GIF或MNG。iPhone可以以全显示分辨率播放视频,没有任何问题。sprite sheet的想法是合理的,但你在回答另一个问题。加载更大的精灵文件不会花费那么短的时间。最终,精灵盒的想法是最好的想法。使用UIView动画扩展或UIImage图像阵列显示一系列图像很容易,但性能不佳。使用雪碧要好得多。但这并不像雪碧床单那么简单。