【问题标题】:Best way of loading images from application bundle从应用程序包加载图像的最佳方式
【发布时间】:2012-02-28 14:49:12
【问题描述】:

从应用程序主包加载图像的最佳方式是什么。我正在使用

[UIImage imageNamed: "image.png"];

但我听说这在内存使用和性能方面都不好。谁能给他/她的反馈?我的应用程序在启动时从主包中读取了大量图像。我想让这个过程尽可能高效。

最好的问候

【问题讨论】:

  • 你的意思是:[UIImage imageNamed:@"image.png"]; 忘了@ :)

标签: iphone objective-c performance image nsbundle


【解决方案1】:

如果存在一种真正的“最佳方式”,则不存在以多种方式加载图像的方法(除非出于历史原因)。因此,与将答案提炼成“最佳方式”相比,稍微了解一下会更好。

+[UIImage imageNamed:] 缓存图像以供重复使用,对于大多数用途来说,这是一个合理的默认值。如果使用得当,缓存优秀。缓存很好,因为它可以通过共享和重用加载的图像来最小化磁盘读取和内存使用,而不是为必须显示的每个图像读取和分配副本。考虑您在多个屏幕上使用的图标图像 - 您是否希望每次都读取和重新分配该图像数据?这可能导致相同图像数据的冗余读取和分配。如果没有,请使用缓存方法。

如果您只加载一次图像并且延迟加载,那么您可能需要考虑非缓存方法。

  • 图像数据会消耗大量内存。
  • 读取图像可能需要很长时间 - 不仅是磁盘 i/o,还包括将其转换为可用的 UIImage 表示形式(例如解压缩图像)。
  • 有时您应该调整图像大小/缩放图像。那么你会想要一个缩放的副本。

简而言之,有很多考虑因素,但如果您拥有可重复使用的适当缩放资产,那么缓存通常是正确的选择。

如果您的资产大小不合适,则问题更为根本 - 如果您遇到性能问题,您应该调整捆绑资产的大小以适合用途。适当大小的图像还可以显着简化绘图,同时保持最佳图像质量。

【讨论】:

  • 谢谢贾斯汀。是的,这就是为什么我想要加载图像的最佳方式。我的应用程序在处理这些图像时需要花费大量时间,这就是为什么我想知道是否可以改进我的代码。
  • @Aqueel 我刚刚编辑了答案以使用适当的尺寸覆盖 - 看看。
  • 贾斯汀,您的反馈真的很有帮助。我使用了大约 15 个大尺寸图像并在使用之前对它们进行了缩放,我现在将对其进行修复。再次感谢...
【解决方案2】:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"myimage" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:filePath];

【讨论】:

    【解决方案3】:

    如果你想尝试在不缓存的情况下加载图像,你可以使用:

    [[UIImage alloc] initWithContentsOfFile:@"image.png"]; 
    

    第一次加载图像可能会稍微快一些,因为它不必先缓存它。如果您只需要使用这些图像一次,那么尝试这种方式可能是有意义的。这样做的另一个好处是,您不会让图像缓存占用内存超过必要的时间。

    【讨论】:

    • 问题在于加载图像时的内存使用和性能,而不是从捆绑包中获取图像文件列表的最佳方式。如果他有很多图像,那么我所描述的加载它们的替代方法可能会提供更好的性能。
    • 如果你仔细阅读整个问题,你会得到他想要的答案。
    • @Mudit,这不是处理大量图像的最佳方式吗?您能否详细解释一下,以便我得到清晰的图片?谢谢
    • @MuditBajpai 据我了解,路径数组仅用于给出特定图像的路径。其余部分由 UIImage 的 initWithContentsOfFile 方法管理。对吗?
    • 所以我从这个讨论中了解到,如果我不缓存,我应该使用 initWithContentsOfFile 方法。由于我不想缓存,我更愿意使用上述方法。我会做正确的事吗??? :-)
    【解决方案4】:

    用于使用 NSBundle 查找单个资源文件

    NSBundle* myBundle = [NSBundle mainBundle];
    
    NSString* myImage = [myBundle pathForResource:@"Seagull" ofType:@"jpg"];
    

    以及查找多个资源:

    NSBundle* myBundle = [NSBundle mainBundle];
    
    NSArray* myImages = [myBundle pathsForResourcesOfType:@"jpg"
                                  inDirectory:nil];
    

    【讨论】:

    • 我不明白这是如何解决这个问题的。
    • 您好,我不是在寻找创建图像路径的机制。当我从主包加载图像时,我想要一些可以提高内存使用率和性能的东西。
    • 我知道,如果您有多个图像,第二个选项也是与性能问题相关的更好方法。
    猜你喜欢
    • 2016-09-08
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多