【问题标题】:Is there a performance hit for using UIImage in CALayer?在 CALayer 中使用 UIImage 会影响性能吗?
【发布时间】:2008-10-14 20:57:55
【问题描述】:

我正在使用一大堆 CALayers,创建与 GoogleMaps 不同的基于图块的图像(具有更多/更少细节的同一图像的不同版本)。

我用来执行此操作的代码是:

UIImage* image = [self loadImage:obj.fileName zoomLevel:obj.zoomLevel];
[CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];
obj.layerToAddTo.contents = [image CGImage];
[CATransaction commit];

我真的不想使用 CoreGraphics 从文件中加载 CGImage,因为我很懒。但如果有很大的性能提升,我会的! LoadImage 只是破坏一个字符串以获得加载所述图像的正确路径,而 obj 是一个 NSObject 结构,它包含我需要的所有信息。

帮助?

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    性能并没有很大的提升——如果有的话,情况恰恰相反。通过 UIImage 加载您的图像,您将获得它为您所做的缓存的所有好处,并且它将是与您的各种 CALayer 一起使用的非常快速的小动物。

    【讨论】:

    • 我只想补充一点,Shark 是你的朋友。如果您想了解在哪里可以提高您的代码性能,请对其进行分析,看看它实际花费了哪些时间,而不是在黑暗中摸索。
    【解决方案2】:

    我刚刚尝试过,使用纯 CoreGraphics 加载图像而不是使用 UIImage 在一次加载许多图像时显着提高了速度。

    【讨论】:

      【解决方案3】:

      “我刚刚尝试过,使用纯 CoreGraphics 加载图像而不是使用 UIImage 在一次加载许多图像时显着提高了速度。”

      您是如何避免使用 UIImage 的?或者更准确地说,如何不通过 UIImage 直接将图像文件加载到 CoreGraphics 中?

      【讨论】:

        【解决方案4】:

        不使用UIImage -imageNamed: 加载图像的一个原因是它们存储在内部缓存中,并且在内存不足的情况下不会清除缓存。

        【讨论】:

        • -1 在内存不足的情况下清除缓存。它很可能在内部使用 NSCache,它处理许多内存场景。请参阅 NSCache 上的文档...
        【解决方案5】:

        我没有明确的答案,但我猜你在使用 UIImage 时会看到比使用 CGImage 时更慢的加载时间。使用 CGImage,您在创建时指定图像类型(jpg 或 png),但使用 UIImage,需要动态确定对象类型。诚然,这可能就像查看图像文件的前几个字节一样简单,但可能并非如此。

        一旦实际使用图像,我不会想象使用内部表示 UIImage 的 CGImage 与使用您自己创建的 CGImage 之间会有任何区别。我认为它们完全一样。

        【讨论】:

        • 关于您的第一点,检测 PNG 和 JPG 之间的差异几乎是即时的。这些类型中的每一个在文件的前面都有魔术代码,可以快速比较以确定它是什么类型。
        • 是的,这就是我所指的,但我的意思是我实际上并不知道 Apple 对文件类型确定的实现是什么,所以我不能肯定地说他们就是这样做了这个决定。哦,显然,根据图像类型,加载时间或首次渲染时间会有很大差异。某些图像类型的解码速度比其他图像类型快。
        猜你喜欢
        • 1970-01-01
        • 2010-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-29
        • 2012-02-04
        相关资源
        最近更新 更多