[iphone] iOS 앱 최대 메모리 예산
최소 3gs를 목표로하는 iOS 게임을 만들고 있습니다. 우리는 레티 나 디스플레이 장치 (iphone 4, ipod touch 4 세대)에 HD 자산을 사용하고 있습니다.
메모리 측면에서 볼 때, Ipod Touch 4 세대는 3gs와 동일한 양의 RAM (256과 비교하여 256)을 갖기 때문에 우리에게 가장 제약적인 장치 인 것 같습니다. 그러나 HD 자산을 사용하고 있습니다. 100-110mb의 램을로드하려고 할 때 응용 프로그램이 충돌했지만 이제는 70MB로 줄어 들었으므로로드 충돌이 없었습니다.
주변을 많이 검색 한 후에는 공식적인 하드 제한이없는 것처럼 보이므로 안전을 위해 사용할 메모리 예산을 어떻게 알 수 있습니까? 아티스트가 각지도에 대한 메모리 걱정없이 사용할 수있는 예산을 제공 할 수 있기를 원합니다.
답변
나는 당신이 당신의 자신의 질문에 대답했다고 생각합니다 : 70 Mb 한도를 넘지 마십시오. 그러나 그것은 실제로 많은 것들에 달려 있습니다 : 당신이 사용하는 iOS 버전 (SDK가 아닌), 백그라운드에서 실행중인 응용 프로그램의 수, 정확한 메모리 당신은 등을 사용하고 있습니다
즉석 메모리 스플래쉬를 피하십시오 (예 : 40Mb의 RAM을 사용하고 약간의 짧은 계산을 위해 80Mb를 더 할당). 이 경우 iOS는 즉시 응용 프로그램을 종료합니다.
자산의 게으른 로딩도 고려해야합니다 (사전 필요하지 않은 경우에만로드).
답변
Split이 쓴 유틸리티를 사용한 테스트 결과 (링크는 그의 답변입니다) :
기기 : (충돌 량 / 총량 / 총 백분율)
- iPad1 : 127MB / 256MB / 49 %
- iPad2 : 275MB / 512MB / 53 %
- iPad3 : 645MB / 1024MB / 62 %
- iPad4 : 585MB / 1024MB / 57 % (iOS 8.1)
- iPad Mini 1 세대 : 297MB / 512MB / 58 %
- iPad Mini 망막 : 696MB / 1024MB / 68 % (iOS 7.1)
- iPad Air : 697MB / 1024MB / 68 %
- iPad Air 2 : 1383MB / 2048MB / 68 % (iOS 10.2.1)
- iPad Pro 9.7 “: 1395MB / 1971MB / 71 % (iOS 10.0.2 (14A456))
- iPad Pro 10.5”: 3057 / 4000 / 76 % (iOS 11 베타 4)
- iPad Pro 12.9”(2015) : 3058 / 3999 / 76 % (iOS 11.2.1)
- iPad Pro 12.9”(2017) : 3057 / 3974 / 77 % (iOS 11 베타 4)
- iPad Pro 11.0”(2018) : 2858 / 3769 / 76 % (iOS 12.1)
- iPad Pro 12.9”(2018, 1TB) : 4598 / 5650 / 81 % (iOS 12.1)
- iPad 10.2 : 1844 / 2998 / 62 % (iOS 13.2.3)
- iPod touch 4 세대 : 130MB / 256MB / 51 % (iOS 6.1.1)
- iPod touch 5 세대 : 286MB / 512MB / 56 % (iOS 7.0)
- 아이폰 4 : 325MB / 512MB / 63 %
- iPhone4s : 286MB / 512MB / 56 %
- iPhone5 : 645MB / 1024MB / 62 %
- iPhone5s : 646MB / 1024MB / 63 %
- iPhone6 : 645MB / 1024MB / 62 % (iOS 8.x)
- iPhone6 + : 645MB / 1024MB / 62 % (iOS 8.x)
- iPhone6s : 1396MB / 2048MB / 68 % (iOS 9.2)
- iPhone6s + : 1392MB / 2048MB / 68 % (iOS 10.2.1)
- iPhoneSE : 1395MB / 2048MB / 69 % (iOS 9.3)
- iPhone7 : 1395 / 2048MB / 68 % (iOS 10.2)
- iPhone7 + : 2040MB / 3072MB / 66 % (iOS 10.2.1)
- 아이폰 8 : 1364 / 1990MB / 70 % (iOS 12.1)
- iPhone X : 1392 / 2785 / 50 % (iOS 11.2.1)
- iPhone XS : 2040 / 3754 / 54 % (iOS 12.1)
- iPhone XS Max : 2039 / 3735 / 55 % (iOS 12.1)
- 아이폰 XR : 1792 / 2813 / 63 % (iOS 12.1)
- 아이폰 11 : 2068 / 3844 / 54 % (iOS 13.1.3)
- iPhone 11 Pro Max : 2067 / 3740 / 55 % (iOS 13.2.3)
답변
나는 가능한 많은 메모리를 할당하려고 시도하는 작은 유틸리티를 만들었고 메모리 경고와 충돌이 발생했을 때 기록합니다. 이것은 iOS 기기의 메모리 예산을 찾는 데 도움이됩니다.
https://github.com/Split82/iOSMemoryBudgetTest
답변
내 응용 프로그램에서 더 많은 메모리를 사용하면 사용자 경험이 향상되므로 가능한 모든 메모리 를 확보 해야하는지 결정해야합니다 didReceiveMemoryWarning
. Split과 Jasper Pol의 답변에 따르면 총 장치 메모리의 최대 45 %를 사용하는 것이 안전한 임계 값 인 것 같습니다 (감사합니다).
누군가 내 실제 구현을보고 싶어하는 경우 :
#import "mach/mach.h"
- (void)didReceiveMemoryWarning
{
// Remember to call super
[super didReceiveMemoryWarning];
// If we are using more than 45% of the memory, free even important resources,
// because the app might be killed by the OS if we don't
if ([self __getMemoryUsedPer1] > 0.45)
{
// Free important resources here
}
// Free regular unimportant resources always here
}
- (float)__getMemoryUsedPer1
{
struct mach_task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t)&info, &size);
if (kerr == KERN_SUCCESS)
{
float used_bytes = info.resident_size;
float total_bytes = [NSProcessInfo processInfo].physicalMemory;
//NSLog(@"Used: %f MB out of %f MB (%f%%)", used_bytes / 1024.0f / 1024.0f, total_bytes / 1024.0f / 1024.0f, used_bytes * 100.0f / total_bytes);
return used_bytes / total_bytes;
}
return 1;
}
스위프트 ( 이 답변을 기반으로 함 ) :
func __getMemoryUsedPer1() -> Float
{
let MACH_TASK_BASIC_INFO_COUNT = (sizeof(mach_task_basic_info_data_t) / sizeof(natural_t))
let name = mach_task_self_
let flavor = task_flavor_t(MACH_TASK_BASIC_INFO)
var size = mach_msg_type_number_t(MACH_TASK_BASIC_INFO_COUNT)
var infoPointer = UnsafeMutablePointer<mach_task_basic_info>.alloc(1)
let kerr = task_info(name, flavor, UnsafeMutablePointer(infoPointer), &size)
let info = infoPointer.move()
infoPointer.dealloc(1)
if kerr == KERN_SUCCESS
{
var used_bytes: Float = Float(info.resident_size)
var total_bytes: Float = Float(NSProcessInfo.processInfo().physicalMemory)
println("Used: \(used_bytes / 1024.0 / 1024.0) MB out of \(total_bytes / 1024.0 / 1024.0) MB (\(used_bytes * 100.0 / total_bytes)%%)")
return used_bytes / total_bytes
}
return 1
}
답변
SPLITS 저장소를 포크하여 오늘 확장에 할당 할 수있는 iOS 메모리를 테스트하기 위해 하나를 만들었습니다.
iOSMemoryBudgetTestForExtension
다음은 iPhone 5s에서 얻은 결과입니다.
10MB의 메모리 경고
12MB에서 앱이 다운 됨
즉, 애플은 확장 기능을 최대한 활용할 수 있도록 허용하고있다 .
답변
WWDC 2010 세션 비디오 에서 세션 147을 시청해야 합니다 . “iPhone OS의 고급 성능 최적화, 2 부”입니다.
메모리 최적화에 대한 많은 좋은 조언이 있습니다.
팁 중 일부는 다음과 같습니다.
- 중첩 사용
NSAutoReleasePool
하여 메모리 사용량이 급증하지 않도록하십시오. CGImageSource
큰 이미지에서 썸네일을 만들 때 사용하십시오 .- 메모리 부족 경고에 응답하십시오.
답변
iOS13부터는 다음을 사용하여 Apple에서이를 쿼리하는 방법이 있습니다.
#include <os/proc.h>
size_t os_proc_available_memory(void)
여기에 소개되었습니다 :
https://developer.apple.com/videos/play/wwdc2019/606/
약 29-ish.
편집 : 설명서에 대한 링크 추가
https://developer.apple.com/documentation/os/3191911-os_proc_available_memory?language=objc