【问题标题】:Huge PNG images in IOSIOS中的巨大PNG图像
【发布时间】:2013-09-04 19:40:50
【问题描述】:

我的应用中有很多 png 图像,这导致我的应用超载了 iPad2 设备的实际内存使用量。我的整个应用程序文件夹包含大量声音文件和 png 图像,预编译后只有大约 50-60 MB,设备上只有 90 MB,但在运行时我仍然很容易达到 300MB++ .. ViewControllers 在以前的 ViewControllers 等之上。我也在努力解决..

我觉得奇怪的是,通过仅显示一个背景 .png 图像,我将 12 MB 添加到实际内存使用量(在仪器中看到)。我用来在情节提要中填充 ImageView 图像的图像在我的项目文件夹中只有 700 KB。将其取出或将图像字段留空可为我节省 12 MB 内存...

我在应用程序中使用了很多这些背景图像以及其他前景图像,这占用了很多空间。

感谢任何建议或帮助 谢谢。

【问题讨论】:

  • 确保在你能画的地方画——巨大的图像会害死你。 Quartzcore 是节省内存的好工具!
  • 感谢您的提示! :)

标签: iphone ios image


【解决方案1】:

嗯,磁盘空间上的 700kb 图像并不意味着内存中的 700kb 图像。它在存储在磁盘上时会被压缩,但是当它被放入内存时 - 它会变大。

如果您在项目中使用大量图片,我建议您使用[UIImage imageWithContentsOfFile:] 方法。它不会在内部缓存图像,与使用 [UIImage imageNamed:] 相比,您可以更好地控制内存。

对我来说,一般的经验法则是这样的。如果图像很大并且在应用程序中使用过一次 -> [UIImage imageWithContentsOfFile:],但如果图像在应用程序的许多地方重复使用 -> [UIImage imageNamed:]

另外,如果你必须使用 .png 格式,因为它具有透明度,那么你可以尝试给 .webp 一个机会。这种格式在 ios 中不受官方支持,但是在 github 上有一个自定义实现,您可以从中获取。

更新:

我个人根本不会在我的应用程序中使用界面生成器,因为我发现它非常耗时且速度慢。相反,我以编程方式创建所有视图,这给了我更大的灵活性,比如在[UIImage imageWithContentsOfFile:][UIImage imageNamed:] 之间进行选择。您可以只为您的 UIImageView 设置一个 Outlet,然后在代码中设置实际图像。 至于 png,iOS 中没有首选的图像类型。这真的取决于你的情况。如果你需要透明度 -> png,只需要一个平面图像 -> jpg。这只是一个简单的例子。 至于 .webp,正如我已经提到的,这种格式在 iOS 中并未得到官方支持,但您可以添加自己的支持。基本上,.webp 可以让您替换 .png 并减小项目文件夹的大小,而不会失去图像的透明度。

希望这会有所帮助,干杯!

【讨论】:

  • 嗯,是的,这有帮助!但仍然引发了更多问题..:)。真的,这种增长是否正常,从 0,7 -> 12..?那么您是否建议我跳过使用情节提要来设置我的所有 ImageView 并使用 [UIImage imageWithContentsOfFile:] 对它们进行编码。我的大多数图像我只使用一次..aaand 最后,png 不是 iOS 编程的首选类型吗?我应该为非透明图像使用其他东西并考虑将 .webp 用于透明图像吗?
  • 我想我是个新手,发现在界面生成器中摆弄很容易。特别是因为我正在创建一本故事书,我认为 StoryBoard 会让事情变得简单......现在我看到了这种巨大的内存消耗,从仅使用带有模态 segues 的 ViewControllers 到其他显示 .png 图像、动画和播放声音的 ViewControllers,而且它正在转向进入记忆噩梦(警告/崩溃等)。把它全部变成代码是一个巨大的过程,但如果它能够解决我的问题,我会接受它!,我只是害怕得到相同的结果。
  • “给了我更多的灵活性,比如在imageWithContentsOfFileimageNamed 之间进行选择。你可以为你的 UIImageView 设置一个 Outlet,然后在代码中设置图像”......你不是只是证明了你所说的“更灵活”是错误的吗?如果您有在界面生成器中创建的 UIImageView,您可以在两者之间进行选择。
  • 我给出了一个将 Interface Builder 与编程视图创建和设置相结合的示例。当然你可以通过在 Interface Builder 中设置 outlet 来做同样的事情,但是对于我个人来说,这种创建 outlet 的方法并不方便,并且在开发过程中经常会导致错误。例如,删除代码中的 outlet 而忘记在界面构建器中删除它。
猜你喜欢
  • 2013-04-20
  • 2011-08-18
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 2011-09-24
相关资源
最近更新 更多