गेम में मेमोरी को बेहतर तरीके से मैनेज करें

Android प्लैटफ़ॉर्म पर, सिस्टम उतनी ज़्यादा सिस्टम मेमोरी (रैम) इस्तेमाल करने की कोशिश करता है जितनी रैम साथ ही, मेमोरी को ऑप्टिमाइज़ करने की सुविधा देता है, ताकि ज़रूरत पड़ने पर जगह खाली की जा सके. इन ऑप्टिमाइज़ेशन की वजह से, आपके गेम की रफ़्तार धीमी हो सकती है. या पूरी तरह से मारना. इन ऑप्टिमाइज़ेशन के बारे में ज़्यादा जानने के लिए, प्रोसेस के बीच मेमोरी का बंटवारा विषय पढ़ें.

इस पेज पर बताया गया है कि कम मेमोरी की स्थितियों से बचने के लिए, कौनसे तरीके अपनाए जा सकते हैं आपके गेम पर असर डाल रहे हैं.

onTrimMemory() का जवाब देता है

सिस्टम, onTrimMemory() आपके ऐप्लिकेशन को लाइफ़साइकल इवेंट की सूचना देने के लिए किया जा सकता है. इससे आपके ऐप्लिकेशन को अपनी मर्ज़ी से मेमोरी के इस्तेमाल को कम करता है और लो-मेमोरी किलर (एलएमके) ताकि अन्य ऐप्लिकेशन के इस्तेमाल के लिए मेमोरी रिलीज़ की जा सके.

अगर बैकग्राउंड में आपका ऐप्लिकेशन बंद हो जाता है, तो अगली बार उपयोगकर्ता के लॉन्च करने पर आपके ऐप्लिकेशन के धीरे-धीरे काम करेगा कोल्ड स्टार्ट करना होगा. अपनी कमियों को दूर करने वाले ऐप्लिकेशन बैकग्राउंड में जाते समय मेमोरी के इस्तेमाल के बंद होने की संभावना कम हो जाती है. बैकग्राउंड शामिल करें.

इवेंट में काट-छांट करने के लिए, यह सबसे अच्छा विकल्प है कि आप ज़्यादा मेमोरी का इस्तेमाल करें जिनकी तुरंत ज़रूरत नहीं होती और जिन्हें ज़रूरत पड़ने पर फिर से बनाया जा सकता है. इसके लिए उदाहरण के लिए, अगर आपके ऐप्लिकेशन में ऐसे बिटमैप हैं जिन्हें स्थानीय डिवाइस से डिकोड किया गया था सेव की गई इमेज नहीं होती हैं, तो इमेज में काट-छांट करना या उसे मिटाना जवाब में कैश मेमोरी 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 के बीटा वर्शन का इस्तेमाल करना

मेमोरी एडवाइस एपीआई को डेवलपर के तौर पर onTrimMemory का एक विकल्प है जिसमें रीकॉल और सटीक जानकारी होती है LMK के आस-पास होने का अनुमान. यह काम, एपीआई की मदद से मेमोरी के ऐसे संसाधन जिनका इस्तेमाल किया जा रहा है. इसके बाद, ऐप्लिकेशन को थ्रेशोल्ड पार हो गए हैं. एपीआई, एपीआई, मेमोरी का उपयोग सीधे आपके ऐप्लिकेशन में किया जाता है. Memory Advice API का इस्तेमाल इसका विकल्प onTrimMemory मेमोरी मैनेज करने के लिए इवेंट.

Memory Advise API का इस्तेमाल करने के लिए, शुरुआती निर्देश.

मेमोरी बजट का इस्तेमाल सोच-समझकर करें

मेमोरी खत्म होने से बचाने के लिए, पुराने तरीके से बजट मेमोरी. कुछ आइटम यहां दी गई जानकारी शामिल करें:

  • फ़िज़िकल रैम का साइज़: गेम में अक्सर फ़िज़िकल रैम का 1⁄4 से 1⁄2 हिस्सा इस्तेमाल किया जाता है डिवाइस में रैम की मात्रा.
  • ज़्यादा से ज़्यादा zRAM साइज़: ज़्यादा zRAM का मतलब है कि गेम में ज़्यादा मेमोरी हो सकती है तय करना है. डिवाइस के हिसाब से यह रकम अलग-अलग हो सकती है; इसमें SwapTotal ढूँढो यह वैल्यू पता करने के लिए /proc/meminfo.
  • ओएस का मेमोरी का इस्तेमाल: ऐसे डिवाइस जो सिस्टम के लिए ज़्यादा रैम तय करते हैं प्रोसेस, आपके गेम के लिए कम मेमोरी बचाती हैं. सिस्टम, सिस्टम प्रोसेस को बंद करने से पहले आपके गेम की प्रोसेस को बंद कर देता है.
  • इंस्टॉल किए गए ऐप्लिकेशन की मेमोरी का इस्तेमाल: अपने गेम को उन डिवाइसों पर टेस्ट करें जिनमें कई इंस्टॉल किए गए ऐप्लिकेशन. सोशल मीडिया और चैट ऐप्लिकेशन का लगातार इस्तेमाल करना ज़रूरी है, ताकि वे खाली मेमोरी कितनी होती है.

अगर आपको लंबे समय तक चलने वाले मेमोरी बजट का इस्तेमाल नहीं करना है, तो ज़्यादा बजट खर्च करें अप्रोच का इस्तेमाल करें. अगर सिस्टम की मेमोरी कम होने की समस्याएं आती हैं, तो मेमोरी की मात्रा कम करें इस्तेमाल कर रहा है. उदाहरण के लिए, कम रिज़ॉल्यूशन वाले टेक्सचर तय करें या स्टोर करें onTrimMemory() के जवाब में कम शेडर. मेमोरी के लिए यह गतिशील अप्रोच ऐप्लिकेशन असाइन करने के लिए डेवलपर को ज़्यादा काम करना पड़ता है. खास तौर पर, गेम के डिज़ाइन में फ़ेज़.

थ्रैशिंग से बचें

थ्रैशिंग तब होती है, जब खाली मेमोरी कम हो, लेकिन गेम को बंद करने के लिए ज़रूरत के मुताबिक न हो. इस स्थिति में, kswapd ने उन पेजों को फिर से हासिल कर लिया है जिनकी गेम को अब भी ज़रूरत है. इसलिए, यह मेमोरी से पेजों को फिर से लोड करने की कोशिश करता है. ज़रूरत के मुताबिक जगह नहीं है, इसलिए पेजों का डेटा को बदलना जारी रखना है (लगातार स्वैप करना). सिस्टम ट्रेस करने की सुविधा इस स्थिति को थ्रेड के तौर पर रिपोर्ट करती है जहां kswapd लगातार चलता रहता है.

थ्रैशिंग का एक लक्षण है फ़्रेम में लंबा समय लगना - यह एक सेकंड या उससे ज़्यादा समय का हो सकता है. गलत जानकारी को फैलने से रोकना इस समस्या को हल करने के लिए गेम की मेमोरी फ़ुटप्रिंट.

उपलब्ध टूल इस्तेमाल करना

Android में कई टूल मौजूद हैं. इनसे यह समझने में मदद मिलती है कि सिस्टम को कैसे मेमोरी को मैनेज करता है.

Meminfo

यह टूल, यह दिखाने के लिए मेमोरी के आंकड़े इकट्ठा करता है कि पीएसएस मेमोरी तय किया गया और जिन कैटगरी के लिए उसका इस्तेमाल किया गया.

इनमें से किसी एक फ़ॉर्मैट में, meminfo के आंकड़े प्रिंट करें नीचे दिए गए तरीकों से:

  • adb shell dumpsys meminfo package-name कमांड का इस्तेमाल करें.
  • MemoryInfo कॉल का इस्तेमाल करें .

PrivateDirty के आंकड़े प्रोसेस में रैम की वह मात्रा जिसे डिस्क पर पेज नहीं किया जा सकता और जिसे शेयर नहीं किया जाता इस्तेमाल नहीं किया जा सकता. प्रोसेस बंद होने पर, इस रकम का ज़्यादातर हिस्सा सिस्टम के लिए उपलब्ध हो जाता है.

मेमोरी ट्रेसपॉइंट

मेमोरी ट्रेस करने की सुविधा, यह ट्रैक करती है कि आरएसएस मेमोरी आपके गेम का इस्तेमाल किया जा रहा है. आरएसएस मेमोरी के इस्तेमाल का हिसाब लगाना, पीएसएस के इस्तेमाल का हिसाब लगाने से काफ़ी तेज़ होता है. इसका हिसाब लगाना तेज़ है. इसलिए, आरएसएस ज़्यादा बारीकी से जानकारी देता है. मेमोरी के सबसे ज़्यादा इस्तेमाल के बारे में ज़्यादा सटीक जानकारी पाने के लिए, मेमोरी के साइज़ में बदलाव किया जा सकता है. इसलिए, यह देखना आसान होता है कि गेम कहां खत्म हो सकता है मेमोरी.

परफ़ेटो और लंबे ट्रेस

Perfetto अलग-अलग टूल का एक सुइट है. डिवाइस पर परफ़ॉर्मेंस और मेमोरी की जानकारी और वेब-आधारित यूज़र इंटरफ़ेस (यूआई) में दिखाना. यह लंबे समय तक के ट्रेस के साथ काम करता है, ताकि आप यह देख सकें कि समय के साथ आरएसएस कैसे बदलता है. ऑफ़लाइन प्रोसेसिंग के लिए बनाए गए डेटा पर SQL क्वेरी भी जारी की जा सकती हैं. इससे लंबे ट्रेस सक्षम करें: सिस्टम ट्रेस करने वाला ऐप्लिकेशन. पक्का करें कि ट्रेस के लिए memory:Memory कैटगरी चालू है.

heapprofd

heapprofd एक मेमोरी ट्रैकिंग टूल है परफ़ेटो का एक हिस्सा है. यह टूल आपको जहां malloc का इस्तेमाल करके मेमोरी असाइन की गई थी. heapprofd को Python स्क्रिप्ट का इस्तेमाल करके शुरू किया जा सकता है. साथ ही, इस टूल का ओवरहेड कम होता है. इसलिए, Malloc Debug जैसे अन्य टूल की तरह इस टूल से परफ़ॉर्मेंस पर असर नहीं पड़ता.

bugreport

bugreport, जानकारी इकट्ठा करने वाला एक टूल है. इसकी मदद से, यह पता लगाया जा सकता है कि आपका गेम क्रैश हुआ है या नहीं क्योंकि उसमें मेमोरी नहीं बची है. इस्तेमाल करने की तुलना में टूल का आउटपुट ज़्यादा बेहतर होता है लॉगकैट. यह मेमोरी डीबग करने के लिए मददगार है, क्योंकि इससे पता चलता है कि आपका गेम मेमोरी खत्म होने की वजह से क्रैश हुआ है या एलएमके की वजह से.

ज़्यादा जानकारी के लिए, यह देखें गड़बड़ी की रिपोर्ट कैप्चर करें और पढ़ें.