إدارة الذاكرة بفعالية في الألعاب

على نظام 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 مقدار RAM (ذاكرة الوصول العشوائي) داخل العملية التي لا يمكن وضعها على القرص ولا تتم مشاركتها مع أي عمليات أخرى. وتصبح معظم هذه المساحة متاحة للنظام عند إنهاء هذه العملية.

نقاط تتبُّع الذاكرة

تقوم نقاط تتبع الذاكرة بتتبع مقدار ذاكرة RSS التي تستخدمها لعبتك. إنّ احتساب استخدام ذاكرة RSS أسرع بكثير من احتسابه. استخدام خدمات PSS بما أنّه يتم الحساب بسرعة أكبر، تعرض خلاصة RSS دقة أدق على التغيرات في حجم الذاكرة للحصول على قياسات أكثر دقة لذروة استخدام الذاكرة. وبالتالي، من الأسهل ملاحظة الارتفاعات التي قد تتسبب في نفاد مهام اللعبة. الذاكرة.

Perfetto وآثار طويلة

Perfetto هي مجموعة من الأدوات لجمع معلومات عن الأداء والذاكرة على الجهاز وعرضها في واجهة مستخدم مستندة إلى الويب. وهو يتيح تتبُّع بيانات طويلة بشكل عشوائي حتى تتمكّن من الاطّلاع على كيفية تغيُّر RSS بمرور الوقت. يمكنك أيضًا إصدار استعلامات SQL على البيانات التي تنتجها للمعالجة بلا اتصال بالإنترنت. تفعيل آثار الأنشطة الطويلة من تطبيق تتبُّع النظام تأكد من أن تم تفعيل الفئة memory:Memory للتتبُّع.

هابرود

heapprofd هي أداة لتتبُّع الذاكرة التي تشكّل جزءًا من Perfetto. يمكن أن تساعدك هذه الأداة في العثور على حالات تسرّب الذاكرة من خلال عرض التي تم تخصيص ذكرى فيها باستخدام "malloc". يمكن بدء تشغيل "heapprofd" باستخدام لغة Python البرمجية، ونظرًا لانخفاض عبء عمل الأداة، فإنه لا يؤثر وأدائه مثل الأدوات الأخرى مثل Caloc Debug.

تقرير خطأ

bugreport هي أداة تسجيل لمعرفة ما إذا تعطّلت لعبتك أم لا. بسبب نفاد الذاكرة. تعد ناتج الأداة أكثر تفصيلاً من استخدام Logcat. وهو مفيد لتصحيح أخطاء الذاكرة لأنّه يعرض ما إذا تعطّلت لعبتك بسبب نفاد الذاكرة أو إذا أوقفها LMK.

لمزيد من المعلومات، يُرجى مراجعة تسجيل تقارير الأخطاء وقراءتها