gpt4 book ai didi

ios - 由于内存压力,应用程序不断崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:04:02 25 4
gpt4 key购买 nike

我的应用正在从 Parse.com 保存和检索数据。并显示图像、按钮、 ScrollView 等。(正常的东西)。然后当我接近完成我的应用程序时,它开始收到内存警告并且应用程序开始经常崩溃。我在 Instruments 中检查了它,发现在某些时候事件字节数非常高,我不明白为什么。

应用程序是否因高事件字节数而崩溃?事件字节的值应该是多少?

很明显,虚拟机中发生了一些事情。但我不知道这是什么。什么是 VM:CG 栅格数据?还有这个:VM: CG Image?我不使用 CGImages 只使用 UIImages

最佳答案

Is the app crashing because of the high live bytes?

是的。

What should value of the live bytes be?

没有固定的数量。限制因操作系统版本而异,有时取决于设备和当前发生的其他情况。正确的做法是 (a) 尽量不要使用太多,以及 (b) 注意警告并处理不需要的东西。

Obiously something is going on in the VM. But I have no idea what this is. What is the VM: CG raster data? And this: VM: CG Image? I am not using CGImages only UIImages

A UIImage只是 CGImage 的包装器。

您同时激活的图像过多。这就是您必须解决的问题。

那么,多少算太多?这取决于它们有多大。

另外,请注意“栅格数据”是解压缩 的大小。一个 5Mpix RGBA 8bpp 图像需要 20MB 的 RAM 来存储光栅数据,无论文件是 8MB 还是 8KB。


I still feel the number is too high though, or is 30-40 MB an okey number handling 3-6 full-screen sized images at a time? This is when tested on a 4 year old iPhone4, iOS 7. If that matters.

在 iPhone 4 上,“全屏”意味着 640x960 像素。 8bpp RGBA 表示每个像素 4 个字节。所以,如果有 6 张这样的图像,那就是 640*960*4*6 = 14MB。因此,如果您已经加载并绘制了 6 张全屏图像,那么这是您应该期望的绝对最小存储空间。

那么,为什么您实际上看到的是两倍以上?

嗯,作为Images and Memory Management在类引用中说:

In low-memory situations, image data may be purged from a UIImage object to free up memory on the system. This purging behavior affects only the image data stored internally by the UIImage object and not the object itself. When you attempt to draw an image whose data has been purged, the image object automatically reloads the data from its original file. This extra load step, however, may incur a small performance penalty.

因此,将这 14MB 基本上视为 iOS 用来加快处理速度的缓存,以备您再次绘制图像时使用。如果内存不足,它会自动清除缓存,因此您不必担心。

因此,您还剩下 16-24MB,这大概由您的 UI 小部件和图层的缓冲区以及幕后的合成器使用。这比理论最小值 14MB 多了一点,但还不算太可怕。

如果你想进一步减少内存使用,你可能需要做的是不要绘制所有 6 个图像。如果它们是全屏的,用户一次只能看到 1 或 2 个。因此,您可以按需加载和渲染它们,而不是预加载它们(或者,如果您可以预测接下来通常需要哪一个,则预加载其中的 1 个而不是全部),并在它们不再可见时销毁它们.因为你只有 2 张图像而不是 6 张,所以你的内存使用量应该从 16-24MB + 14MB 缓存减少到 5-9MB + 5MB 缓存。这显然意味着需要更多的 CPU — 它可能不会明显影响响应速度或电池消耗,但您需要对其进行测试。而且,更重要的是,它肯定会使您的代码更加复杂。

显然,如果适合您的图像,您也可以使用非 Retina 图像(这将减少 75% 的内存)或将颜色深度从 RGBA-8 降低到 ARGB-1555 (50%),但是大多数图像看起来都不是那么好(这就是为什么我们有高色彩的 Retina 显示器)。

关于ios - 由于内存压力,应用程序不断崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25516543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com