【问题标题】:Preload Images in iPhone application?在 iPhone 应用程序中预加载图像?
【发布时间】:2009-12-09 08:31:29
【问题描述】:

我有一系列需要在短时间内显示的图像(PNG 序列)。总共有 31 个 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的重复定时器)

但我发现当我第一次调用图像时,它非常滞后。除了第一个外观,其他外观都没有问题。

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

【问题讨论】:

  • 我认为这对您的特定问题没有帮助,但是将变量声明移到 for 循环之外可能不是一个坏主意。我不知道 gcc 是否足够聪明来解决这个问题,但是看起来相当痛苦。

标签: iphone calayer preloading


【解决方案1】:

如果不分析数据,就很难判断滞后的原因。但这里有一个技巧可能会有所帮助:将所有图像合并到一个大文件中。尝试使其成为矩形(在您的情况下可能是 6x6 或 4*8)。然后加载此单个文件并裁剪每个图像以供显示(即,创建一个具有图块大小的显示图像,并将一个图块从大图像一个接一个地复制到显示图像中)。

【讨论】:

  • 就像一张雪碧表?好的,我会试试的。但是,我的 PNG 都是 480 x 500 像素大小;如果我加入他们,那将是一个巨大的图像,我认为 iPhone 无法处理。也许我应该让我的图像尺寸更小。
  • 是的,就像一张雪碧图。此外,如果您需要为它们制作动画,请考虑使用动画格式(如 AVI 或 shudder anim GIF 或 MNG)。 iPhone 可以毫无问题地以全屏分辨率播放视频。
  • 精灵表的想法是合理的,但您正在回答另一个问题。并且加载更大的精灵文件应该不会花费那么多时间。
  • 最终,精灵框的想法是最好的想法。使用 UIView 动画扩展或 UIImage 图像数组来显示一系列图像很容易,但性能不佳。使用精灵要好得多。但这并不像“sprite sheet”那么简单。
【解决方案2】:

图像在使用和显示时被加载。 如果您在 Instruments 中使用时间分析器,您将遇到延迟。如果然后放大到该延迟并查看导致它的原因,您通常会看到“copyImageBlockSetPNG”是需要时间的函数,就在“inflate”之前。

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

【讨论】:

    猜你喜欢
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多