5

我正在开发一个应用程序,它需要使用分辨率高于 (2000 x 2000) 的图像来实现文本清晰度。

我有一个背景图像,我需要在其上显示具有相同分辨率的叠加图像。覆盖的数量是可变的,从 2 到 30。

使用 UIImage 加载图像时,每个像素需要 4 个字节,因此如果一张图像的分辨率为 3000x3000,则最多需要 34 MB 内存,2000 x 2000 需要 15 MB。

这就是问题出现的地方,应用程序在 3GS 上加载 4-5 张图片后崩溃,在 iPhone 4 上加载 11-13 张图片后崩溃。

叠加层需要准确地放置在背景图像上。它们就像我们在 Google 地图交通叠加中所拥有的一样。这并不排除平铺,但会使任务相对复杂。

我应该如何处理这个问题?

4

1 回答 1

0

当然,您不能一次将整个图像集加载到内存中。您只需要加载图像数据的可见部分,并应尽快卸载不可见部分。

如果您想在 QuartzCore 级别解决此问题,则有CATiledLayer专门用于此目的的课程。

苹果参考:https ://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html

苹果示例代码:https ://developer.apple.com/library/mac/#samplecode/CALayerEssentials/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008029

附加信息:http ://red-glasses.com/index.php/tutorials/catiledlayer-how-to-use-it-how-it-works-what-it-does/

要使用该层,您需要将源图像拆分为多个图块。并在层需要时提供它们。(drawLayer:inContext:方法。)该方法将在非主线程上调用,因此不会阻塞用户界面。不要忘记释放不可见磁贴的图像以节省内存。

此外,您可以通过使用后台线程的动态资源加载的低级 OpenGL 代码来实现这一点。在这种情况下,您可以使用 PVRTC 有损内存压缩,这可以节省大量视频内存使用量,但这确实是一项痛苦且耗时的工作。我建议使用CATiledLayer. 这对于大多数情况来说已经足够了。

于 2012-10-01T18:55:35.040 回答