0

在过去的几周里,我一直在努力让一个平铺机制在 iPhone 上工作。我需要缩放和裁剪大约 150mb 的图像,以便它们可以保存为滚动视图请求的图块,从而允许用户以高分辨率查看图像。

问题是这些图像确实在推动 iPhone 可以处理的范围。将这些巨大的图像缩小到 1000 左右并进行平铺似乎很容易,但是对于大的缩放级别,我需要在中途缩放它,比如 4000 左右,这太大了。所以我想到了从全尺寸图像制作中等大小的块并将每个块和中等缩放平铺。

通过在内部循环周围创建一个自动释放池,并在每个循环后将其排空,我基本上可以控制内存,但有时,在我看来,这似乎是随机的,内存正在泄漏,或者至少没有被耗尽。我在辅助线程上执行所有这些操作,当它返回到该线程中的第一个函数时,我释放线程自己的自动释放池,然后才清除最后的内存工件。它似乎并没有打扰模拟器,但 iPhone 的宽容度要小得多,它在完成整个平铺过程之前就崩溃了。我使用的裁剪代码来自 Hive05

http://www.hive05.com/2008/11/crop-an-image-using-the-iphone-sdk/

以前有没有其他人不得不处理如此大量的图像?预生成瓷砖是最好的方法吗?关于为什么有些循环会增加内存而有些不会增加内存的任何建议,或者如何强制每个自动释放的东西在内部池中清除而不是等待外部池?

感谢您阅读本文。

补充一下,这些图像是 TIF,所以也许直接读取位图信息会比缩放和裁剪整个图像更好

4

2 回答 2

0

首先,我严重怀疑 150 MB 的图像是否适合设备的内存,即使我们谈论的是 3GS。那个有大约 128 MB 的可用内存供第 3 方应用程序使用。查看设备控制台消息并查找内存警告,我想您会在崩溃之前看到,应用程序在尝试加载图像时会发出它们。分块读取位图信息似乎更明智,因为您将一次管理较小的部分。我认为 Cocoa 没有随机访问文件 API,因此您必须求助于 C 函数。

于 2009-12-12T00:13:10.930 回答
0

我已经设法编写了循环遍历 1024x1024 的图块,并且我的 iPhone 3G 能够完成处理。虽然它需要 30 多分钟,所以它不是很好,但这就是你在手机上使用 150mb TIF 所得到的。

为了保持较低的内存使用率,我必须在每次迭代后耗尽 AutoReleasepools。Apple 技术支持指出,由于 iPhone 是引用计数环境而不是垃圾收集环境,因此最好在每个内部循环开始时创建一个新的 AutoReleasePool 并在每个循环结束时将其排空,而不是之前创建它任何循环开始,多次排出,然后在循环完成后释放它。在我做出改变之前,我的应用程序会导致 iPhone 崩溃,但在模拟器上运行良好。

于 2010-01-08T03:49:08.910 回答