请教各位大佬, IOS 系统开发 APP 如何避免由于内存过大被系统强制杀死?
source link: https://www.v2ex.com/t/844054
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
fengjianxinghun 16 小时 2 分钟前
KouYiGuo 15 小时 58 分钟前
BroSaltedFish 15 小时 54 分钟前
分配内存是 C++管理的内存池,主要消耗的也是 C++管理的这部分,由于是处理图形相关的内存确实大,也没法再省了。除了省内存还有其他方法吗?
nicevar 15 小时 53 分钟前
fengjianxinghun 15 小时 50 分钟前
BroSaltedFish 15 小时 47 分钟前
BroSaltedFish 15 小时 39 分钟前
主要消耗内存的不是 Objective-C ,基本不会超过 400MB
打开的是 CAD 图纸,内存消耗主要集中对图纸这块,而且图纸这里的内存管理是由 C++写的,基本随用随释放,也没有内存泄漏的问题。主要消耗的还是对图纸的处理。
BroSaltedFish 15 小时 38 分钟前
xwayway 15 小时 32 分钟前
nicevar 15 小时 30 分钟前
raykle 15 小时 20 分钟前
比如打开 CAD 图纸,图纸过大的话,有使用瓦片方式加载吗?
BeyondBouds 15 小时 15 分钟前
DingSoung 15 小时 11 分钟前 via iPhone
内存映射
Building 14 小时 42 分钟前 via iPhone
icyalala 14 小时 14 分钟前
再就是用磁盘来顶一下,临时不需要的数据存下来需要时再解码出来,或者 mmap 。慢就慢些,优先保证不崩。
其他没有什么太好的手段,就是想办法省内存。
BroSaltedFish 14 小时 13 分钟前
需求就是在 IOS 上打开 cad 图纸,需要编辑,图纸引擎本身确实也会占用很多内存,主要还是看图纸,基本 30MB 以上的图纸打开就很有可能被杀死。换引擎基本不可能。。。
@nicevar 目前我们尝试过,加载核心数据,外围数据按需加载的方式,测试效果因图纸差异效果不等,不过感觉还是得从这方面下手。。。
@raykle 感谢回复。
老兄说得对,省无可省是以我现在的能力来看确实没法子了。。。瓦片方式加载我大概了解下是用在地图、图片显示上,我们这还不一样,需要从数据转换成图像,在未读取数据前并不知道位置,不过估计还是得采用局部加载技术手段。
@BeyondBouds 感谢回复。
老兄的问题和我一样啊,确实跟用户的 文件有很大关系,内存大也只能硬着头皮优化啊。。。
@DingSoung 感谢回复。
文件本身不大,大多数处于 50MB 以内,主要是处理读取文件生成数据过程中的内存问题
mjawp 14 小时 5 分钟前
BroSaltedFish 14 小时 3 分钟前
内存的管理基本没问题,可能磁盘缓存是后续优化的一个方向了。。。。
xnth97 13 小时 0 分钟前 1
learningman 11 小时 11 分钟前
lakehylia 11 小时 4 分钟前
BroSaltedFish 10 小时 26 分钟前
以编辑方式打开的文件这个接口的帮助就有限了,不过还是感谢提供方案。
@66450146 感谢回复。
感谢提供,com.apple.developer.kernel.increased-memory-limit 后续试下效果再回复
@learningman 感谢回复。
实现虚拟内存个人水平达不到,可能的方案看看缓存到磁盘了。。。。
@lakehylia 感谢回复。
地图的方法目前不太适合,因需要读取数据流生成数据才能知道图元所处的位置。。。
seakingii 9 小时 29 分钟前
手机的内存总是要有个限制的,不可能你 CAD 源文件 10 个 G 也能强制打开吧.
除非你的 CAD 引擎设计的很好,能流式分块加载,然后渲染成省内存的格式
wwbfred 9 小时 9 分钟前
sadfQED2 8 小时 26 分钟前 via Android
这样至少你 app 不会挂
FrankHB 8 小时 19 分钟前
@learningman 你清楚在说什么么。
在没有 MMU 或者没有系统特权的情况下实现虚存跟实现个没硬件加速的系统级虚拟机的工作差不多少。(虽然 iOS 不管 ISA 细节横竖都禁止加速了。)
Innovatino 8 小时 12 分钟前
iOS 上,不需要 30MB 的图片就可能因为爆内存杀死应用。因为 iOS 的图片加载是按像素渲染的,就算是几 k 的一张纯白图片,也可能因为巨大的分辨率导致爆内存。
如果没办法使用瓦片方式加载,那唯一的方式就是降低分辨率,让渲染出来的图片没有那么多像素。
这是必然的,是 iOS 原生 api 的必然结果,想使用,就得按照这个基本法来。想绕过,那就只能看看那些正经的引擎了
learningman 8 小时 1 分钟前
VirgilMing 4 小时 52 分钟前
hytaoist 4 小时 31 分钟前
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK