Saya sedang mengerjakan game ios yang menargetkan minimal 3gs. Kami menggunakan aset HD untuk perangkat layar retina (iphone 4, ipod touch 4th gen).
Dari segi memori, Ipod Touch 4th gen tampaknya menjadi perangkat yang paling kendala bagi kami karena memiliki jumlah RAM yang sama (256 dibandingkan dengan iPhone 4's 512) seperti 3gs tetapi kami menggunakan aset HD di atasnya. Aplikasi yang digunakan untuk mogok ketika mencoba memuat ram 100-110mb tapi sekarang kita turun ke 70MB, kita belum pernah memuat crash.
Setelah banyak mencari-cari, sepertinya tidak ada batas resmi yang resmi jadi bagaimana kita harus mengetahui anggaran memori apa yang digunakan agar aman? Kami ingin dapat memberi para seniman anggaran yang dapat mereka gunakan tanpa kekhawatiran ingatan untuk setiap peta.
sumber
Jawaban:
Saya pikir Anda telah menjawab pertanyaan Anda sendiri: cobalah untuk tidak melampaui batas 70 Mb, namun itu benar-benar tergantung pada banyak hal: versi iOS apa yang Anda gunakan (bukan SDK), berapa banyak aplikasi yang berjalan di latar belakang, memori apa yang tepat Anda menggunakan dll
Cukup hindari percikan memori instan (mis. Anda menggunakan 40 Mb RAM, dan kemudian mengalokasikan lebih dari 80 Mb untuk beberapa perhitungan pendek). Dalam hal ini iOS akan segera membunuh aplikasi Anda.
Anda juga harus mempertimbangkan pemuatan aset yang malas (hanya memuatnya saat Anda benar-benar membutuhkan dan tidak sebelumnya).
sumber
Hasil pengujian dengan utilitas Split menulis (tautan ada dalam jawabannya):
perangkat: (jumlah kerusakan / jumlah total / persentase total)
sumber
Saya membuat utilitas kecil yang mencoba mengalokasikan memori sebanyak mungkin untuk crash dan merekam ketika peringatan dan crash memori terjadi. Ini membantu untuk mengetahui berapa anggaran memori untuk perangkat iOS apa pun.
https://github.com/Split82/iOSMemoryBudgetTest
sumber
Dalam aplikasi saya, pengalaman pengguna lebih baik jika lebih banyak memori digunakan, jadi saya harus memutuskan apakah saya benar-benar harus membebaskan semua memori yang saya bisa masuk
didReceiveMemoryWarning
. Berdasarkan jawaban Split dan Jasper Pol, menggunakan maksimum 45% dari total memori perangkat tampaknya merupakan ambang batas yang aman (terima kasih kawan).Jika seseorang ingin melihat implementasi aktual saya:
Swift (berdasarkan jawaban ini ):
sumber
Dengan memalsukan repo SPLITS, saya membuat satu untuk menguji memori iOS yang dapat dialokasikan ke Ekstensi Hari Ini
iOSMemoryBudgetTestForExtension
Berikut ini adalah hasil yang saya dapatkan di iPhone 5s
Peringatan Memori pada 10 MB
Aplikasi Hancur pada 12 MB
Dengan ini berarti Apple hanya mengizinkan ekstensi apa saja untuk bekerja dengan potensi penuh mereka .
sumber
Anda harus menonton sesi 147 dari video Sesi WWDC 2010 . Ini adalah "Advanced Performance Optimization pada iPhone OS, bagian 2".
Ada banyak saran bagus tentang optimasi memori.
Beberapa tipsnya adalah:
NSAutoReleasePool
untuk memastikan penggunaan memori Anda tidak lonjakan.CGImageSource
saat membuat thumbnail dari gambar besar.sumber
NSLog
dalamdidReceiveMemoryWarning
dan kemudian melakukan beberapa pengujian di mana Anda mengalokasikan jumlah memori yang berbeda dan kemudian melihat kapan peringatan memori mulai muncul.Dimulai dengan iOS13, ada cara yang didukung Apple untuk menanyakan hal ini dengan menggunakan
Diperkenalkan di sini: https://developer.apple.com/videos/play/wwdc2019/606/
Sekitar min 29-ish.
Sunting: Menambahkan tautan ke dokumentasi https://developer.apple.com/documentation/os/3191911-os_proc_available_memory?language=objc
sumber
Jika seseorang akan menggunakan TASK_BASIC_INFO_COUNT alih-alih MACH_TASK_BASIC_INFO, Anda akan mendapatkan
kerr == KERN_INVALID_ARGUMENT (4)
sumber
Saya membuat satu daftar lagi dengan mengurutkan daftar Jaspers berdasarkan RAM perangkat (Saya membuat tes sendiri dengan alat Split dan memperbaiki beberapa hasil - periksa komentar saya di utas Jaspers).
RAM perangkat: rentang persen untuk crash
Kasus khusus:
Perangkat RAM dapat dibaca dengan mudah:
Dari pengalaman saya, aman untuk menggunakan 45% untuk perangkat 1GB, 50% untuk perangkat 2 / 3GB dan 55% untuk perangkat 4GB. Persen untuk macOS bisa sedikit lebih besar.
sumber
Bekerja dengan banyak jawaban di atas, saya telah menerapkan metode baru Apple
os_proc_available_memory()
untuk iOS 13+ ditambah denganNSByteCountFormatter
yang menawarkan sejumlah opsi format berguna untuk output memori yang lebih baik:Catatan penting: Jangan lupa
()
pada bagian akhir. Saya telah memasukkan keduaNSLog
opsi di dalammemoryLoggingOutput
metode karena tidak memperingatkan Anda bahwa mereka hilang dan kegagalan untuk memasukkan tanda kurung mengembalikan hasil yang tak terduga namun konstan.String yang dikembalikan dari metode
memoryStringForBytes
menghasilkan nilai seperti:sumber