Je travaille sur un jeu iOS qui cible au minimum les 3gs. Nous utilisons des ressources HD pour les périphériques d'affichage Retina (iPhone 4, iPod touch 4e génération).
En ce qui concerne la mémoire, l'Ipod Touch 4e génération semble être l'appareil le plus contraignant pour nous car il dispose de la même quantité de RAM (256 par rapport aux 512 de l'iPhone 4) que 3gs, mais nous utilisons des actifs HD dessus. L'application plantait en essayant de charger 100 à 110 Mo de RAM, mais maintenant que nous sommes à 70 Mo, nous n'avons jamais eu de crash de chargement.
Après de nombreuses recherches, il ne semble pas y avoir de limite stricte officielle, alors comment devrions-nous savoir quel budget mémoire utiliser pour être en sécurité? Nous voulons pouvoir donner aux artistes un budget qu'ils peuvent utiliser sans soucis de mémoire pour chaque carte.
la source
Réponses:
Je pense que vous avez répondu à votre propre question: essayez de ne pas dépasser la limite de 70 Mo, mais cela dépend vraiment de beaucoup de choses: quelle version d'iOS vous utilisez (pas SDK), combien d'applications exécutées en arrière-plan, quelle mémoire exacte vous utilisez etc.
Évitez simplement les éclaboussures de mémoire instantanées (par exemple, vous utilisez 40 Mo de RAM, puis allouez 80 Mo de plus pour un calcul court). Dans ce cas, iOS tuerait votre application immédiatement.
Vous devriez également envisager le chargement différé des ressources (ne les chargez que lorsque vous en avez vraiment besoin et pas à l'avance).
la source
Résultats des tests avec l'utilitaire Split a écrit (le lien est dans sa réponse):
appareil: (montant de l'accident / montant total / pourcentage du total)
la source
J'ai créé un petit utilitaire qui essaie d'allouer autant de mémoire que possible pour planter et il enregistre quand des avertissements de mémoire et un crash se sont produits. Cela permet de savoir quel est le budget mémoire de tout appareil iOS.
https://github.com/Split82/iOSMemoryBudgetTest
la source
Dans mon application, l'expérience utilisateur est meilleure si plus de mémoire est utilisée, je dois donc décider si je dois vraiment libérer toute la mémoire que je peux
didReceiveMemoryWarning
. Sur la base de la réponse de Split et Jasper Pol, l'utilisation d'un maximum de 45% de la mémoire totale de l'appareil semble être un seuil sûr (merci les gars).Au cas où quelqu'un voudrait examiner ma mise en œuvre réelle:
Swift (basé sur cette réponse ):
la source
En forçant le repo SPLITS, j'en ai construit un pour tester la mémoire iOS qui peut être allouée à l'extension d'aujourd'hui
iOSMemoryBudgetTestForExtension
Voici le résultat que j'ai obtenu dans l'iPhone 5s
Avertissement de mémoire à 10 Mo
L'application a planté à 12 Mo
Par ce moyen, Apple permet simplement à toutes les extensions de fonctionner avec leur plein potentiel .
la source
Vous devriez regarder la session 147 des vidéos de la session 2010 de la WWDC . Il s'agit de "Optimisation avancée des performances sur iPhone OS, partie 2".
Il y a beaucoup de bons conseils sur l'optimisation de la mémoire.
Certains des conseils sont:
NSAutoReleasePool
s pour vous assurer que votre utilisation de la mémoire n'augmente pas.CGImageSource
lors de la création de vignettes à partir d'images de grande taille.la source
NSLog
intérieurdidReceiveMemoryWarning
, puis faire des tests où vous allouez différentes quantités de mémoire, puis voyez quand les avertissements de mémoire commencent àÀ partir d'iOS13, il existe une méthode prise en charge par Apple pour l'interroger en utilisant
Présenté ici: https://developer.apple.com/videos/play/wwdc2019/606/
Environ min 29-ish.
Edit: Ajout d'un lien vers la documentation https://developer.apple.com/documentation/os/3191911-os_proc_available_memory?language=objc
la source
Si l'on utilise TASK_BASIC_INFO_COUNT au lieu de MACH_TASK_BASIC_INFO, vous obtiendrez
kerr == KERN_INVALID_ARGUMENT (4)
la source
J'ai créé une autre liste en triant la liste de Jaspers par RAM de périphérique (j'ai fait mes propres tests avec l'outil de Split et j'ai corrigé quelques résultats - vérifiez mes commentaires dans le fil de discussion Jaspers).
RAM de l'appareil: plage de pourcentage pour planter
Cas spéciaux:
La RAM de l'appareil peut être lue facilement:
D'après mon expérience, il est sûr d'utiliser 45% pour les appareils de 1 Go, 50% pour les appareils 2/3 Go et 55% pour les appareils 4 Go. Le pourcentage pour macOS peut être un peu plus grand.
la source
En travaillant avec les nombreuses réponses ci-dessus, j'ai implémenté la nouvelle méthode Apples
os_proc_available_memory()
pour iOS 13+ couplée àNSByteCountFormatter
qui offre un certain nombre d'options de formatage utiles pour une meilleure sortie de la mémoire:Remarque importante: n'oubliez pas le
()
à la fin. J'ai inclus les deuxNSLog
options dans lememoryLoggingOutput
méthode car elle ne vous avertit pas qu'elles sont manquantes et le fait de ne pas inclure les crochets renvoie un résultat inattendu mais constant.La chaîne retournée par la méthode renvoie des
memoryStringForBytes
valeurs comme ceci:la source