请教各位大佬, IOS 系统开发 APP 如何避免由于内存过大被系统强制杀死?

2022-03-31 11:12:56 +08:00
 BroSaltedFish

如题。

3783 次点击
所在节点    程序员
39 条回复
learningman
2022-03-31 16:08:22 +08:00
实在放不下了自己实现虚拟内存吧
lakehylia
2022-03-31 16:14:44 +08:00
地图的方法咯,一次只加载屏幕那么大的
BroSaltedFish
2022-03-31 16:52:42 +08:00
@xnth97 感谢回复。
以编辑方式打开的文件这个接口的帮助就有限了,不过还是感谢提供方案。
@66450146 感谢回复。
感谢提供,com.apple.developer.kernel.increased-memory-limit 后续试下效果再回复
@learningman 感谢回复。
实现虚拟内存个人水平达不到,可能的方案看看缓存到磁盘了。。。。
@lakehylia 感谢回复。
地图的方法目前不太适合,因需要读取数据流生成数据才能知道图元所处的位置。。。
seakingii
2022-03-31 17:50:30 +08:00
你这是要在冰箱里放个大象啊.

手机的内存总是要有个限制的,不可能你 CAD 源文件 10 个 G 也能强制打开吧.

除非你的 CAD 引擎设计的很好,能流式分块加载,然后渲染成省内存的格式
wwbfred
2022-03-31 18:10:06 +08:00
呃,你这个问题要有办法绕过,国内应用早就群魔乱舞了……
sadfQED2
2022-03-31 18:52:32 +08:00
打开前预估内存使用量,然后判断用户当前手机内存是否够,如果用户手机内存不够,直接弹窗提示用户升级手机

这样至少你 app 不会挂
FrankHB
2022-03-31 19:00:01 +08:00
@BeyondBouds 你这什么屑产品经理还管那么多?要空间不够用负责帮用户加内存么?
@learningman 你清楚在说什么么。
在没有 MMU 或者没有系统特权的情况下实现虚存跟实现个没硬件加速的系统级虚拟机的工作差不多少。(虽然 iOS 不管 ISA 细节横竖都禁止加速了。)
Innovatino
2022-03-31 19:06:45 +08:00
@BroSaltedFish
iOS 上,不需要 30MB 的图片就可能因为爆内存杀死应用。因为 iOS 的图片加载是按像素渲染的,就算是几 k 的一张纯白图片,也可能因为巨大的分辨率导致爆内存。
如果没办法使用瓦片方式加载,那唯一的方式就是降低分辨率,让渲染出来的图片没有那么多像素。
这是必然的,是 iOS 原生 api 的必然结果,想使用,就得按照这个基本法来。想绕过,那就只能看看那些正经的引擎了
learningman
2022-03-31 19:17:40 +08:00
@FrankHB #27 C++用 placement new 搞,工作量不会太大的,不过比系统级别慢挺多就是,应用本身也要改造
VirgilMing
2022-03-31 22:27:13 +08:00
在 iOS 上编辑 CAD 怎么看都像是个伪需求……你们的 CAD 引擎是自己写的吗?
hytaoist
2022-03-31 22:48:11 +08:00
autoreleasepool ,防止临时内存暴涨尝试下
debuggeeker
2022-04-01 09:12:50 +08:00
@nicevar 说的太对了,现在软件质量太差了,以前 2g 内存也能好好玩手机,现在 8g 还是卡
nothingistrue
2022-04-01 09:35:05 +08:00
说点题外话,好得产品经理,应该引导客户把沙雕需求变成好需求。如楼主的需求,对于客户来说,PAD/PC/MAC/WEB 编辑查看+手机仅查看,是比手机啥都干,更好的工作方式。如果实在要手机也编辑,那么花钱买个好的引擎,是比让上层 APP 做优化,更有效的实现方式。
BeyondBouds
2022-04-01 10:53:42 +08:00
@mjawp 谢谢回复,可是还是想不明白,在不对原图解码的情况下,怎样把用户的一些操作合成到原图里....
BroSaltedFish
2022-04-01 12:57:27 +08:00
@seakingii 感谢回复。
并非是打开文件的问题,CAD 文件内部存储的结构是流式存储的,引擎读取文件也是流式分块加载的,内存消耗主要是生成显示数据过程,我们可能还是需要在这方面努力优化了。。
@wwbfred 感谢回复。
总会有内存不够的情况,看优化了吧。。。
@sadfQED2 感谢回复。
这个真预估不了,可能的还是 上面老兄说的 applicationDidReceiveMemoryWarning 函数内做处理。
@VirgilMing 感谢回复。
引擎是公司买的,我们在上面做开发、适配和优化。
@hytaoist 感谢回复。
Objective-C 层消耗内存不多,内存消耗主要是 C++层 CAD 引擎加载文件生成显示数据过程,看来还是得在后者方面做优化
@nothingistrue 感谢回复。
产品希望全都要。。。。只能硬着头皮上了
FrankHB
2022-04-01 13:31:14 +08:00
@learningman 你想少了。虚存是带地址翻译的,没硬件和系统支持下,首先得把访存的寻址都替换掉,原则上需要多出至少一倍指令。这就还是有类似 MPU 之类的硬件中断的情况,纯软件实现你得模拟缺页中断,基本就是把非交换访存全替换为模拟中断例程的函数调用。要实现这个基本得改编译器(从前端把*替换成 builtin 开始,只改后端还不够)。
直接 placement new 不能改善同时占用的问题。placement new 要求有已经分配好空间随时能用的指针,都没法用 fancy pointer (而且现在标准库的 allocator model 能分配的还要求在地址空间内连续)。
learningman
2022-04-01 15:23:09 +08:00
@FrankHB #36 你想的是系统级别的虚拟内存,用户态无感,我说的是应用内分配之前先做一次替换
FrankHB
2022-04-02 03:18:22 +08:00
@learningman 那种一般就不会叫虚拟内存。
实际能替换的,基本就只限于光栅图缓冲区这种,也不是 placement new ,还要有 swap buffer 的真 IO 。一些看大图的软件就有这种机制,上面也有人提。但看 OP 的描述,加载都已经分块了,到后面显示渲染还不够用,那这个 swap 就不是重新复制缓冲区那么简单,横竖还得改渲染算法在光栅化之前做文章。这就跟虚拟内存更没共同点了。
learningman
2022-04-02 11:22:54 +08:00
@FrankHB 对,我是这个意思,肯定要 io 的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/844054

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX