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

على نظام Android الأساسي، يحاول النظام استخدام أكبر قدر ممكن من ذاكرة النظام (RAM). وإجراء تحسينات متنوعة للذاكرة لإخلاء بعض المساحة عند الحاجة. قد يكون لهذه التحسينات تأثير سلبي في لعبتك، إما من خلال إبطاءها. بالقضاء عليه أو قتله تمامًا. مزيد من المعلومات عن هذه التحسينات في الموضوع تخصيص الذاكرة بين العمليات:

توضّح هذه الصفحة الخطوات التي يمكنك اتّخاذها لتجنُّب انخفاض مستوى الذاكرة. تؤثر في لعبتك

الاستجابة لـ onTrimMemory()

يستخدم النظام onTrimMemory() لإعلام تطبيقك بانخفاض الذاكرة وقد يتم إيقاف التطبيق مؤقتًا. العديد يكون التحذير الوحيد الذي يتلقّاه تطبيقك. وقت استجابة معاودة الاتصال هذا طويل نسبةً إلى القاتل المنخفض الذاكرة (LMK)، لذا فمن الضروري الاستجابة بسرعة لمعاودة الاتصال.

استجابةً لمعاودة الاتصال هذه، عليك تقليل سرعة عمليات التخصيص وعددها وحجمها. تجتاز الدالة onTrimMemory() قيمة ثابتة تشير إلى خطورة الإصابة، ولكن يجب عليك الاستجابة للتحذير الأول لأنه من الممكن تخصيصه بسرعة أكبر مما يمكن لـ "onTrimMemory()" التفاعل مع.

Kotlin

class MainActivity : AppCompatActivity(), ComponentCallbacks2 {
    override fun onTrimMemory(level: Int) {
        when (level) {
            ComponentCallbacks2.TRIM_MEMORY_MODERATE,
                ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW,
                ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL -> // Respond to low memory condition
            else -> Unit
        }
    }
}

Java

public class MainActivity extends AppCompatActivity implements ComponentCallbacks2 {
    public void onTrimMemory(int level) {
        switch (level) {
            case ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE:
              // Respond to low memory condition
                break;
            case ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW:
              // Respond to low memory condition
                break;
            case ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL:
              // Respond to low memory condition
                break;
            default:
                break;

#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.

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