على نظام Android الأساسي، يحاول النظام استخدام أكبر قدر ممكن من ذاكرة النظام (RAM) ويُجري تحسينات مختلفة على الذاكرة لإخلاء المساحة عند الحاجة. ويمكن أن تؤثر هذه التحسينات سلبًا في لعبتك، إما من خلال إبطاء الأداء أو إيقافه تمامًا. مزيد من المعلومات عن هذه التحسينات في الموضوع تخصيص الذاكرة بين العمليات:
توضّح هذه الصفحة الخطوات التي يمكنك اتّخاذها لتجنُّب انخفاض مستوى الذاكرة. تؤثر في لعبتك
الاستجابة لـ onTrimMemory()
يستخدم النظام
onTrimMemory()
إبلاغ تطبيقك بأحداث مراحل النشاط التي تقدم فرصة جيدة
تقليل استخدامه للذاكرة طوعًا وتجنُّب التعرّض للقتل من خلال
القاتل ذو الذاكرة المنخفضة (LMK)
لإطلاق الذاكرة حتى تستخدمها التطبيقات الأخرى.
إذا تم إغلاق تطبيقك في الخلفية، سيتم عندئذٍ تشغيل المستخدم في المرة التالية. تطبيقك فسوف يواجه بطئًا البداية الباردة. التطبيقات التي تقلل من استخدام الذاكرة عند الانتقال إلى الخلفية أقل عرضة للقتل في الخلفية.
عند الاستجابة إلى قطع الأحداث، من الأفضل إصدار عمليات تخصيص كبيرة للذاكرة
التي لا تحتاج إليها على الفور ويمكن إعادة بنائها عند الطلب. بالنسبة
على سبيل المثال، إذا كان تطبيقك يحتوي على ذاكرة تخزين مؤقت للصور النقطية التي تم فك ترميزها من الإعدادات المحلية
من الصور المضغوطة المخزنة، فمن الأفضل قطعها أو إزالتها
ذاكرة التخزين المؤقت استجابةً لـ
TRIM_MEMORY_UI_HIDDEN
Kotlin
class MainActivity : AppCompatActivity(), ComponentCallbacks2 { override fun onTrimMemory(level: Int) { if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { // Release memory related to UI elements, such as bitmap caches. } if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) { // Release memory related to background processing, such as by // closing a database connection. } } }
Java
public class MainActivity extends AppCompatActivity implements ComponentCallbacks2 { public void onTrimMemory(int level) { switch (level) { if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { // Release memory related to UI elements, such as bitmap caches. } if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) { // Release memory related to background processing, such as by // closing a database connection. } } } }
#C
using UnityEngine; using System.Collections; using System.Collections.Generic; class LowMemoryTrigger : MonoBehaviour { private void Start() { Application.lowMemory += OnLowMemory; } private void OnLowMemory() { // Respond to low memory condition (e.g., Resources.UnloadUnusedAssets()) } }
استخدام الإصدار التجريبي من Memory Advice API
تم تطوير Memory Advice API باعتبارها
كبديل لـ onTrimMemory والتي تتميز بدقة أكبر في التذكر والدقة
للتنبؤ بكائنات LMK الوشيكة. وتحقِّق واجهة برمجة التطبيقات ذلك من خلال تقدير مقدار
موارد الذاكرة قيد الاستخدام، ثم إرسال إشعار إلى التطبيق عند
أو تجاوزها. ويمكن أن تقدِّم واجهة برمجة التطبيقات أيضًا تقريرًا عن النسبة المئوية المقدَّرة
استخدام الذاكرة مباشرةً في التطبيق. يمكنك استخدام واجهة برمجة التطبيقات Memory Advice API
بديل عن
onTrimMemory
والأحداث لغرض إدارة الذاكرة.
لاستخدام واجهة برمجة التطبيقات Memory Advice API، استخدِم دليل البدء
توخي الحذر باستخدام ميزانيات الذاكرة
ضع ميزانية مدروسة بعناية لتجنُّب نفاد الذاكرة. بعض العناصر إلى ضع في اعتبارك ما يلي:
- حجم ذاكرة الوصول العشوائي (RAM): غالبًا ما تستخدم الألعاب ما بين 1⁄4 و1⁄2 مساحة التخزين المادية حجم ذاكرة الوصول العشوائي على الجهاز.
- الحد الأقصى لحجم ذاكرة zRAM: يشير وجود المزيد من ذاكرة zRAM إلى احتمال وجود ذاكرة أكبر في اللعبة.
في توزيعها. وقد يختلف هذا المبلغ حسب الجهاز. البحث عن
SwapTotal
في/proc/meminfo
للعثور على هذه القيمة. - استخدام الذاكرة في نظام التشغيل: الأجهزة التي تخصِّص ذاكرة وصول عشوائي (RAM) للنظام تترك ذاكرة أقل للعبتك. يوقف النظام بياناتك العملية قبل أن تقتل عمليات النظام.
- استخدام الذاكرة للتطبيقات المثبّتة: يمكنك اختبار لعبتك على أجهزة تتضمّن العديد من التطبيقات. . يجب أن تعمل تطبيقات الدردشة ووسائل التواصل الاجتماعي بشكل مستمر وأن تتأثر مقدار الذاكرة الخالية.
في حال لم تتمكن من الالتزام بميزانية معتدلة للذاكرة، يمكنك اتخاذ
الخاص بك. إذا واجه النظام مشاكل في الذاكرة، يمكنك تقليل مقدار الذاكرة.
التي تستخدمها اللعبة. على سبيل المثال، تخصيص زخارف ذات درجة دقة أقل أو تخزين
وحدات تظليل أقل استجابةً لـ onTrimMemory()
. وهذا الأسلوب الديناميكي في الذاكرة
مجهودًا كبيرًا من المطوّر، خاصةً في ما يتعلّق بتصميم اللعبة
بنجاح.
تجنب السقوط
يحدث الصعوبات عندما تكون الذاكرة الخالية منخفضة، ولكن ليست منخفضة بما يكفي لإنهاء اللعبة.
في هذه الحالة، استرد kswapd
الصفحات التي لا تزال بحاجة إليها اللعبة، لذلك
محاولة إعادة تحميل الصفحات من الذاكرة. ليست هناك مساحة كافية، لذا فإن الصفحات
التبديل باستمرار (التبديل المستمر).
تُظهر ميزة تتبُّع النظام هذا الموقف في شكل سلسلة محادثات.
حيث يتم تشغيل kswapd
بشكل مستمر.
أحد مظاهر العطل هو طول مدة عرض اللقطة، وقد يستغرق ذلك لثانية واحدة أو أكثر. تقليل أثر الذاكرة لللعبة لحل هذا الموقف.
استخدام الأدوات المتاحة
يتضمن Android مجموعة من الأدوات للمساعدة في فهم كيفية تأثير النظام ويدير الذاكرة.
معلومات Meminfo
تجمع هذه الأداة إحصاءات الذاكرة لإظهار مقدار البيانات ذاكرة PSS قد تم تخصيصه والفئات التي تم استخدامه لها.
اطبع إحصاءات meminfo في بالطرق التالية:
- استخدِم الأمر
adb shell dumpsys meminfo package-name
. - استخدام المكالمة
MemoryInfo
من Android Debug API.
يعرض الإحصاء PrivateDirty
مقدار ذاكرة الوصول العشوائي داخل العملية التي لا يمكن نقل صفحاتها إلى القرص ولا تتم مشاركتها مع أي عمليات أخرى. ويصبح الجزء الأكبر من هذا المبلغ متاحًا للمستخدم
النظام عند إنهاء هذه العملية.
نقاط تتبُّع الذاكرة
تقوم نقاط تتبع الذاكرة بتتبع مقدار ذاكرة RSS التي تستخدمها لعبتك. إنّ احتساب استخدام ذاكرة RSS أسرع بكثير من احتسابه. استخدام خدمات PSS ولأنّه أسرع في الحساب، يعرض RSS تفاصيل أدق عن التغييرات في حجم الذاكرة لإجراء قياسات أكثر دقة لذروة استخدام الذاكرة. وبالتالي، من الأسهل ملاحظة الارتفاعات التي قد تتسبب في نفاد مهام اللعبة. الذاكرة.
Perfetto وآثار طويلة
Perfetto هي حزمة من الأدوات لجمع معلومات الأداء والذاكرة على أحد الأجهزة وعرضها في واجهة مستخدم مستندة إلى الويب. وهي تتيح عمليات التتبّع الطويلة بشكل عشوائي لتتمكّن من الاطّلاع على التغييرات في خلاصة RSS بمرور الوقت. يمكنك أيضًا إصدار استعلامات SQL على البيانات التي تنتجها للمعالجة بلا اتصال بالإنترنت. تفعيل آثار الأنشطة الطويلة من تطبيق تتبُّع النظام تأكد من أن تم تفعيل الفئة memory:Memory للتتبُّع.
هابرود
heapprofd
هي أداة لتتبُّع الذاكرة
التي تشكّل جزءًا من Perfetto. يمكن أن تساعدك هذه الأداة في العثور على حالات تسرّب الذاكرة من خلال عرض
التي تم تخصيص ذكرى فيها باستخدام "malloc
". يمكن بدء heapprofd
باستخدام ملف نصي بلغة Python، ولأنّ الأداة ذات تكلفة تشغيل منخفضة، لا تؤثّر في الأداء مثل الأدوات الأخرى، مثل Malloc Debug.
تقرير خطأ
bugreport
هي أداة تسجيل لمعرفة ما إذا تعطّلت لعبتك أم لا.
بسبب نفاد الذاكرة. تعد ناتج الأداة أكثر تفصيلاً من استخدام
Logcat. وهو مفيد لتصحيح أخطاء الذاكرة لأنّه يعرض ما إذا تعطّلت لعبتك
بسبب نفاد الذاكرة أو إذا أوقفها LMK.
لمزيد من المعلومات، يُرجى مراجعة تسجيل تقارير الأخطاء وقراءتها