我正在研究一个需要在低内存设备上量身定制的应用程序。可用的设备内存将在Swift中给出:
ProcessInfo.processInfo.physicalMemory
例如:
- iPhone SE提供2009.5 MB(2048 MB RAM(
- iPhone 5s可提供1000.0 MB(1024 MB RAM(
- iPhone 6提供989.0 MB(1024 MB RAM(
- iPhone 6 提供977.0 MB(1024 MB RAM(
- iPhone 4S可提供504.95 MB(512 MB RAM(
从我的理解中,三角洲分配给GPU并取决于屏幕大小。
我可以信任给定的设备始终给我相同的physicalMemory
金额吗?
(例如,iPhone 6始终为989.0 MB(
看起来physicalMemory
与sysctl
的hw.physmem
(或其MacOS等效(相同。
我能找到的最好的描述是从FreeBSD中的真实/物理/用户内存进行比较的帖子:
OS的"可用" RAM的量。这减去了启动rom/bioses/what-have-you保留的任何空间,以及对于(例如(AMD64上的FreeBSD-9,1 TB Direct-MAP限制(您必须用装载机手动照顾hw.physmem设置(。
这是"物理MEM"应该是的,并且主要是。如果您启动一台1.5 TB的机器,但OS限制为1 TB,hw.physmem应该为BIOS等1 TB减去。
因此,这是设备上的实际内存减去由不是iOS的事物保留的记忆。由于我们不能保证Apple不会更新这些系统,因此我们不能保证该应用程序可用的物理内存将被修复。因此,我不会硬编码这些魔术数字。您可以查看检索"真实"带有系统调用的内存大小,但是您也可以只使用内存桶,因为您知道物理始终将低于实际内存:
enum MemorySize {
case low, medium, high
}
extension MemorySize {
static var current: MemorySize {
if ProcessInfo.processInfo.physicalMemory < 512 * 1024 * 1024 {
return .low
} else if ProcessInfo.processInfo.physicalMemory < 1024 * 1024 * 1024 {
return .medium
} else {
return .high
}
}
}
...
if MemorySize.current == .low { /* Use low memory setup */ }