Estoy trabajando en un juego ios que apunta como mínimo a 3gs. Estamos utilizando recursos HD para dispositivos de visualización de retina (iphone 4, ipod touch 4th gen).
En cuanto a la memoria, Ipod Touch 4th gen parece ser el dispositivo más limitado para nosotros, ya que tiene la misma cantidad de RAM (256 en comparación con 512 de Iphone 4) que 3gs, pero estamos usando activos HD en él. La aplicación solía bloquearse cuando intentaba cargar 100-110 mb de RAM, pero ahora que hemos reducido a 70 MB, nunca hemos tenido un bloqueo de carga.
Después de muchas búsquedas, parece que no hay un límite oficial estricto, entonces, ¿cómo debemos saber qué presupuesto de memoria usar para estar a salvo? Queremos poder dar a los artistas un presupuesto que puedan usar sin problemas de memoria para cada mapa.
fuente
Respuestas:
Creo que ha respondido su propia pregunta: trate de no ir más allá del límite de 70 Mb, sin embargo, realmente depende de muchas cosas: qué versión de iOS está usando (no SDK), cuántas aplicaciones se ejecutan en segundo plano, qué memoria exacta estás usando etc.
Solo evite las salpicaduras instantáneas de memoria (por ejemplo, está utilizando 40 Mb de RAM y luego asigna 80 Mb más para un cálculo corto). En este caso, iOS mataría su aplicación de inmediato.
También debe considerar la carga diferida de activos (cárguelos solo cuando realmente lo necesite y no de antemano).
fuente
Resultados de las pruebas con la utilidad Split escribió (el enlace está en su respuesta):
dispositivo: (cantidad de bloqueo / cantidad total / porcentaje del total)
fuente
Creé una pequeña utilidad que intenta asignar la mayor cantidad de memoria posible al bloqueo y registra cuándo ocurrieron las advertencias de memoria y el bloqueo. Esto ayuda a descubrir cuál es el presupuesto de memoria para cualquier dispositivo iOS.
https://github.com/Split82/iOSMemoryBudgetTest
fuente
En mi aplicación, la experiencia del usuario es mejor si se usa más memoria, por lo que tengo que decidir si realmente debería liberar toda la memoria que pueda en
didReceiveMemoryWarning
. Según la respuesta de Split y Jasper Pol, usar un máximo del 45% de la memoria total del dispositivo parece ser un umbral seguro (gracias, muchachos).En caso de que alguien quiera ver mi implementación real:
Swift (basado en esta respuesta ):
fuente
Al bifurcar el repositorio SPLITS, construí uno para probar la memoria de iOS que se puede asignar a la Extensión de hoy
iOSMemoryBudgetTestForExtension
El siguiente es el resultado que obtuve en iPhone 5s
Advertencia de memoria a 10 MB
Aplicación bloqueada a 12 MB
De esta manera, Apple simplemente permite que cualquier extensión funcione con todo su potencial .
fuente
Debería ver la sesión 147 de los videos de la sesión de WWDC 2010 . Es "Optimización de rendimiento avanzada en iPhone OS, parte 2".
Hay muchos buenos consejos sobre optimizaciones de memoria.
Algunos de los consejos son:
NSAutoReleasePool
s para asegurarse de que su uso de memoria no aumente.CGImageSource
al crear miniaturas a partir de imágenes grandes.fuente
NSLog
interiordidReceiveMemoryWarning
y luego hacer algunas pruebas en las que asigna diferentes cantidades de memoria y luego ver cuándo comienzan a aparecer las advertencias de memoria.A partir de iOS13, hay una forma compatible de Apple de consultar esto mediante el uso de
Introducido aquí: https://developer.apple.com/videos/play/wwdc2019/606/
Alrededor de min 29-ish.
Editar: Agregar enlace a la documentación https://developer.apple.com/documentation/os/3191911-os_proc_available_memory?language=objc
fuente
Si uno usa TASK_BASIC_INFO_COUNT en lugar de MACH_TASK_BASIC_INFO, obtendrá
kerr == KERN_INVALID_ARGUMENT (4)
fuente
Creé una lista más clasificando la lista de Jaspers por la RAM del dispositivo (hice mis propias pruebas con la herramienta Split y arreglé algunos resultados; revise mis comentarios en el hilo de Jaspers).
RAM del dispositivo: rango de porcentaje para bloquearse
Casos especiales:
La RAM del dispositivo se puede leer fácilmente:
Según mi experiencia, es seguro usar el 45% para dispositivos de 1GB, el 50% para dispositivos de 2 / 3GB y el 55% para dispositivos de 4GB. El porcentaje para macOS puede ser un poco más grande.
fuente
Trabajando con las muchas respuestas anteriores, he implementado el nuevo método
os_proc_available_memory()
de Apple para iOS 13+ junto con elNSByteCountFormatter
cual ofrece una serie de opciones de formato útiles para una mejor salida de la memoria:Nota IMPORTANTE: No te olvides de
()
al final. He incluido ambasNSLog
opciones en elmemoryLoggingOutput
método porque no le advierte que faltan y la falta de incluir los corchetes devuelve un resultado inesperado pero constante.La cadena devuelta por el método
memoryStringForBytes
genera valores como este:fuente