Я работаю над игрой ios, которая нацелена как минимум на 3gs. Мы используем HD-ресурсы для устройств отображения сетчатки (iphone 4, ipod touch 4th gen).
Что касается памяти, Ipod Touch 4-го поколения представляется нам наиболее ограничивающим устройством, поскольку он имеет такой же объем ОЗУ (256 по сравнению с 512 в Iphone 4), что и 3gs, но мы используем HD-ресурсы на нем. Раньше приложение зависало при попытке загрузить 100-110 МБ оперативной памяти, но теперь, когда у нас осталось 70 МБ, у нас никогда не возникало аварийного завершения загрузки.
После долгих поисков, кажется, нет официального жесткого ограничения, так как же нам знать, какой бюджет памяти использовать для безопасности? Мы хотим предоставить художникам бюджет, который они могут использовать, не беспокоясь о памяти для каждой карты.
источник
Ответы:
Я думаю, что вы ответили на свой собственный вопрос: старайтесь не выходить за пределы 70 Мб, однако это действительно зависит от многих вещей: какую версию iOS вы используете (не SDK), сколько приложений работает в фоновом режиме, какую именно память вы используете и т. д.
Просто избегайте мгновенных всплесков памяти (например, вы используете 40 МБ ОЗУ, а затем выделяете еще 80 МБ для некоторых коротких вычислений). В этом случае iOS немедленно убьет ваше приложение.
Вы также должны рассмотреть ленивую загрузку активов (загружайте их только тогда, когда вам действительно нужно, а не заранее).
источник
Результаты тестирования с помощью утилиты Split написал (ссылка в его ответе):
устройство: (количество аварий / общая сумма / процент от общего)
источник
Я создал небольшую утилиту, которая пытается выделить как можно больше памяти для сбоя и записывает, когда произошли предупреждения и сбой памяти. Это помогает выяснить, каков бюджет памяти для любого устройства iOS.
https://github.com/Split82/iOSMemoryBudgetTest
источник
В моем приложении пользовательский опыт лучше, если используется больше памяти, поэтому я должен решить, действительно ли я должен освободить все память, в которой я могу
didReceiveMemoryWarning
. Судя по ответам Сплита и Джаспера Пола, использование максимально 45% общей памяти устройства является безопасным порогом (спасибо, ребята).В случае, если кто-то хочет посмотреть на мою фактическую реализацию:
Свифт (основываясь на этом ответе ):
источник
Разветвив репозиторий SPLITS, я построил один для тестирования памяти iOS, который можно выделить для сегодняшнего расширения.
iOSMemoryBudgetTestForExtension
Ниже приводится результат, который я получил в iPhone 5s
Память Предупреждение на 10 МБ
Приложение разбилось на 12 МБ
Таким образом, Apple просто позволяет любым расширениям работать в полную силу .
источник
Вы должны смотреть сессию 147 из видео сессий WWDC 2010 . Это «Продвинутая оптимизация производительности на iPhone OS, часть 2».
Есть много хороших советов по оптимизации памяти.
Вот некоторые из советов:
NSAutoReleasePool
s, чтобы убедиться, что использование памяти не увеличивается.CGImageSource
при создании миниатюр из больших изображений.источник
NSLog
внутреннюю часть,didReceiveMemoryWarning
а затем провести некоторое тестирование, в котором вы выделяете разные объемы памяти, а затем посмотрите, когда начинаютНачиная с iOS13, существует поддерживаемый Apple способ запроса этого с помощью
Представлено здесь: https://developer.apple.com/videos/play/wwdc2019/606/
Около 29 мин.
Изменить: Добавление ссылки на документацию https://developer.apple.com/documentation/os/3191911-os_proc_available_memory?language=objc
источник
Если вы будете использовать TASK_BASIC_INFO_COUNT вместо MACH_TASK_BASIC_INFO, вы получите
kerr == KERN_INVALID_ARGUMENT (4)
источник
Я создал еще один список, отсортировав список Jaspers по оперативной памяти устройства (я провел собственные тесты с помощью инструмента Split и исправил некоторые результаты - проверьте мои комментарии в ветке Jaspers).
ОЗУ устройства: процентное расстояние до сбоя
Особые случаи:
ОЗУ устройства можно легко прочитать:
Исходя из моего опыта, можно безопасно использовать 45% для устройств с 1 ГБ, 50% для устройств с 2/3 ГБ и 55% для устройств с 4 ГБ. Процент для macOS может быть немного больше.
источник
Работая со многими ответами выше, я реализовал новый метод Apples
os_proc_available_memory()
для iOS 13+ в сочетании сNSByteCountFormatter
множеством полезных опций форматирования для более приятного вывода памяти:Важное примечание: не забудьте
()
в конце. Я включил обаNSLog
варианта вmemoryLoggingOutput
метод, потому что он не предупреждает вас о том, что они отсутствуют, а отсутствие включения скобок возвращает неожиданный, но постоянный результат.Строка, возвращаемая из метода,
memoryStringForBytes
выводит значения примерно так:источник