在我的应用程序中,我正在动态创建一个大图像,然后将其加载以在我的图像资源管理器类中显示。因为我无法在运行时向bundle添加新图像,所以我似乎必须使用imageWithContentsOfFile - 但是,这给了我更大的速度问题。
我的图像浏览器的工作方式是它接收图像,将其拆分为图块,缓存这些图块,然后仅将这些图块加载到内存中以便显示在屏幕上。使用一堆NSLog,我已经设法找出所有减速的位置。它不在imageWithContentsOfFile函数本身中,而是在我尝试调用此行时:
CGContextDrawImage(context_ref,
CGRectMake(0, 0, imgWidth, imgHeight), tileImage);
这是我将磁贴写入缓存文件的时候。 tileImage是从CGImageCreateWithImageInRect返回的CGImageRef,这是我如何获取较大图像的子集以单独保存。
奇怪的是,以这种方式分割大图像大约需要45秒(!),但是当我使用imageNamed而不是imageWithContentsOfFile从分组中分割出一个图像时,它只需要大约2秒钟。
有人有什么想法吗?在此先感谢:)
答案 0 :(得分:0)
我认为你应该分割你的形象。 因为,CGContextDrawImage将采用完全加载的“tileImage”。
如果您的“tileImage”大小为8 MB,则您的应用必须将8MB数据加载到内存中。 加载需要很长时间。它可能会造成内存问题等等。
如果您想使用单个大图像,可以等待加载, 有解决方案,你可以使用另一个线程。
在加载大图像时可以避免UI锁定。
8MB JPG图像将使用超过8MB的内存,UIImage应使用非压缩格式进行快速绘图。
答案 1 :(得分:0)
imageNamed
使用缓存,可能会减少缩放量。
UIImage
是不可变的。 imageNamed
可能会注意到这一点并返回对缓存图片的引用,而不是加载和创建新图片......无论您在何处加载图片。
如果您创建图像,您可以设置自己的(内存中)缓存方案并在许多情况下传递引用。然后在收到内存警告时清除缓存。
如果您需要缩放图像并且大小是静态的,请确定要绘制的大小,并使用imageWithCGImage:scale:orientation:
创建UIImage - 或者您也可以使用CoreGraphics apis以类似的方式处理问题。
除此之外,保持/重用您需要的内容,并使用分析器来平衡您的分配和衡量时间。