Estou trabalhando em um jogo ios que tem como alvo, no mínimo, os 3gs. Estamos usando recursos HD para dispositivos de exibição de retina (iphone 4, ipod touch 4th gen).
Em termos de memória, o Ipod Touch de 4ª geração parece ser o dispositivo mais restritivo para nós, uma vez que possui a mesma quantidade de RAM (256 em comparação com o 512 do Iphone 4) que 3gs, mas estamos usando recursos de HD nele. O aplicativo costumava travar ao tentar carregar 100-110mb de ram, mas agora que reduzimos para 70 MB, nunca tivemos o carregamento travado.
Depois de muita pesquisa, parece não haver um limite oficial oficial; então, como devemos saber qual orçamento de memória usar para ser seguro? Queremos poder fornecer aos artistas um orçamento que eles possam usar sem preocupações de memória para cada mapa.
fonte
Respostas:
Acho que você respondeu à sua própria pergunta: tente não exceder o limite de 70 Mb, no entanto, depende realmente de muitas coisas: qual versão do iOS você está usando (não SDK), quantos aplicativos sendo executados em segundo plano, que memória exata você está usando etc.
Apenas evite os salpicos de memória instantânea (por exemplo, você está usando 40 Mb de RAM e alocando mais 80 Mb para um cálculo curto). Nesse caso, o iOS mataria seu aplicativo imediatamente.
Você também deve considerar o carregamento lento de ativos (carregue-os somente quando realmente precisar e não antes).
fonte
Resultados dos testes com o utilitário Split escreveu (o link está em sua resposta):
dispositivo: (quantidade de falha / quantidade total / porcentagem do total)
fonte
Criei um pequeno utilitário que tenta alocar o máximo de memória possível para travar e registra quando ocorrem avisos e travamentos de memória. Isso ajuda a descobrir qual é o orçamento de memória para qualquer dispositivo iOS.
https://github.com/Split82/iOSMemoryBudgetTest
fonte
No meu aplicativo, a experiência do usuário é melhor se mais memória for usada, por isso tenho que decidir se realmente devo liberar toda a memória possível
didReceiveMemoryWarning
. Com base na resposta de Split e Jasper Pol, usar um máximo de 45% da memória total do dispositivo parece ser um limite seguro (obrigado pessoal).Caso alguém queira ver minha implementação real:
Swift (com base nesta resposta ):
fonte
Ao bifurcar o repo do SPLITS, criei um para testar a memória do iOS que pode ser alocada para a Extensão de hoje
iOSMemoryBudgetTestForExtension
A seguir, o resultado que obtive no iPhone 5s
Aviso de memória em 10 MB
App travou em 12 MB
Dessa forma, a Apple está apenas permitindo que quaisquer extensões funcionem com todo o seu potencial .
fonte
Você deve assistir à sessão 147 dos vídeos da sessão da WWDC 2010 . É "Otimização avançada de desempenho no iPhone OS, parte 2".
Há muitos bons conselhos sobre otimizações de memória.
Algumas das dicas são:
NSAutoReleasePool
s aninhados para garantir que o uso da memória não acelere.CGImageSource
ao criar miniaturas a partir de imagens grandes.fonte
NSLog
para dentrodidReceiveMemoryWarning
e, em seguida, fazer alguns testes onde alocar diferentes quantidades de memória e depois ver quando os avisos de memória começar a chutar.A partir do iOS13, existe uma maneira suportada pela Apple de consultar isso usando
Introduzido aqui: https://developer.apple.com/videos/play/wwdc2019/606/
Cerca de min 29-ish.
Editar: Adicionando link à documentação https://developer.apple.com/documentation/os/3191911-os_proc_available_memory?language=objc
fonte
Se alguém usar TASK_BASIC_INFO_COUNT em vez de MACH_TASK_BASIC_INFO, você receberá
kerr == KERN_INVALID_ARGUMENT (4)
fonte
Criei mais uma lista classificando a lista do Jaspers por RAM do dispositivo (fiz meus próprios testes com a ferramenta Split e corrigi alguns resultados - verifique meus comentários no thread do Jaspers).
RAM do dispositivo: intervalo percentual para travar
Casos especiais:
A RAM do dispositivo pode ser lida facilmente:
Pela minha experiência, é seguro usar 45% para dispositivos de 1 GB, 50% para dispositivos de 2/3 GB e 55% para dispositivos de 4 GB. A porcentagem do macOS pode ser um pouco maior.
fonte
Trabalhando com as muitas respostas acima, implementei o novo método
os_proc_available_memory()
da Apple para o iOS 13+, juntamente com oNSByteCountFormatter
qual oferece várias opções de formatação úteis para obter uma saída melhor da memória:Nota importante: Não esqueça o
()
no final. Eu incluí as duasNSLog
opções nomemoryLoggingOutput
método porque ele não avisa que elas estão ausentes e a falha em incluir os colchetes retorna um resultado inesperado, mas constante.A cadeia retornada do método
memoryStringForBytes
gera valores da seguinte forma:fonte