धीमे सेशन (सिर्फ़ गेम के लिए)

धीमा गेम सेशन वह होता है जिसमें फ़्रेम का एक बड़ा हिस्सा (उदाहरण के लिए, 25% से ज़्यादा फ़्रेम), आपके टारगेट फ़्रेम टाइम के मुताबिक रेंडर नहीं होता. जैसे, हर फ़्रेम के लिए 50 मि॰से॰ (20 एफ़पीएस के बराबर) या हर फ़्रेम के लिए 34 मि॰से॰ (30 एफ़पीएस के बराबर). फ़्रेम रेट की परफ़ॉर्मेंस को मॉनिटर और ऑप्टिमाइज़ करना ज़रूरी है. ऐसा इसलिए, क्योंकि फ़्रेम रेट कम होने या फ़्रेम में देरी होने से, गेम खेलने वाले लोगों को गेम के स्मूथ और रिस्पॉन्सिव होने का अनुभव नहीं मिलता.

Android पर, सेशन के फ़्रेम रेट को मेज़र करने के लिए, SurfaceFlinger से मिले डेटा का इस्तेमाल किया जाता है. यह डेटा, गेम के प्लैटफ़ॉर्म पर रेंडर होने वाले फ़्रेम के बीच के समय के हिसाब से तय होता है. इसमें OpenGL, Vulkan, और Android यूज़र इंटरफ़ेस (यूआई) टूलकिट की मदद से रेंडर किए गए फ़्रेम भी शामिल हैं. अगर आपका ऐप्लिकेशन, View पर आधारित यूज़र इंटरफ़ेस (यूआई) टूलकिट का इस्तेमाल करता है, जहां ऐप्लिकेशन का वह हिस्सा जो उपयोगकर्ता को दिखता है उसे Canvas या View के क्रम से लिया जाता है, तो रेंडरिंग में ज़्यादा समय लगना लेख पढ़ें.

एफ़पीएस को मेज़र करने और धीमे फ़्रेम का पता लगाने का तरीका

Android dumpsys surfaceflinger timestats कमांड, रेंडर की जा रही सभी लेयर के लिए, औसत एफ़पीएस और प्रेज़ेंट से प्रेज़ेंट टाइमिंग हिस्टोग्राम उपलब्ध कराती है. किसी फ़्रेम के प्रज़ेंट से प्रज़ेंट होने का समय, मौजूदा फ़्रेम और पिछले फ़्रेम के बीच का इंटरवल होता है. अपने गेम के एफ़पीएस इकट्ठा करने के लिए, कमांड का इस्तेमाल करने का तरीका यहां दिया गया है:

  1. जानकारी कैप्चर करना शुरू करने के लिए, enable और clear फ़्लैग के साथ यह कमांड चलाएं:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. जब गेम को काफ़ी देर तक खेला जा चुका हो, तो जानकारी डंप करने के लिए, dump फ़्लैग के साथ कमांड को फिर से चलाएं:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    डंप की गई जानकारी में, SurfaceFlinger की ओर से रेंडर की गई सभी लेयर के लिए, कुल फ़्रेम और presentToPresent हिस्टोग्राम शामिल होता है. आपको अपने गेम का वह सेक्शन ढूंढना होगा जिसे layerName के आधार पर फ़िल्टर किया गया हो:

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    

    सेशन की फ़्रेम रेट कम होने का हिसाब, हर लेयर की जानकारी के आधार पर लगाया जा सकता है.

    उदाहरण के लिए, 20 FPS से कम फ़्रेम रेट वाले फ़्रेम का प्रतिशत = (54 मि॰से॰ से 1000 मि॰से॰ तक की वैल्यू का योग) / कुल फ़्रेम x 100

    totalFrames = 274
    ...
    presentToPresent histogram is as below:
    0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0
    13ms=0 14ms=0 15ms=0 16ms=1 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0
    24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=269 34ms=0
    36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0
    66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 106ms=0
    110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0
    150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0
    650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0
    

    डंप में, हर लेयर का औसत एफ़पीएस भी दिखाया जाता है:

    ...
    averageFPS = 30.179
    ...
    
  3. सभी जानकारी इकट्ठा करने के बाद, आपको disable फ़्लैग का इस्तेमाल करके, टाइमस्टैट्स को बंद कर देना चाहिए:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

रेंडर होने में ज़्यादा समय लेने वाले फ़्रेम की वजहें और उन्हें ठीक करने के तरीके

डेवलपर के टारगेट से ज़्यादा समय तक स्क्रीन पर फ़्रेम दिखने या रेंडर होने की कई वजहें हो सकती हैं. ऐसा हो सकता है कि गेम सीपीयू/जीपीयू से जुड़ा हो. या डिवाइस ज़्यादा गर्म हो गया है और थ्रॉटल की गई थर्मल स्थिति चालू हो गई है. या गेम के फ़्रेमरेट और डिवाइस के डिसप्ले रीफ़्रेश रेट में अंतर है.

इन समस्याओं को हल करने और अपने गेम की परफ़ॉर्मेंस को बेहतर बनाने के लिए, Android फ़्रेम पेसिंग (Swappy), Vulkan, और ADPF का इस्तेमाल करें.

Swappy क्या है

Android फ़्रेम पेसिंग लाइब्रेरी को Swappy के नाम से भी जाना जाता है. यह AGDK लाइब्रेरी का हिस्सा है. Swappy, OpenGL और Vulkan गेम को Android पर आसानी से रेंडर करने और फ़्रेम की गति को सही करने में मदद करता है.

फ़्रेम पेसिंग, गेम के लॉजिक और रेंडरिंग लूप को ओएस के डिसप्ले सबसिस्टम और डिसप्ले हार्डवेयर के साथ सिंक करने की प्रोसेस है. Android के डिसप्ले सबसिस्टम को इस तरह से डिज़ाइन किया गया है कि डिसप्ले हार्डवेयर के अपडेट के दौरान, विज़ुअल आर्टफ़ैक्ट (जिन्हें टीयरिंग कहा जाता है) से बचा जा सके. ऐसा तब हो सकता है, जब डिसप्ले हार्डवेयर अपडेट के दौरान किसी नए फ़्रेम पर स्विच करता है. इन आर्टफ़ैक्ट से बचने के लिए, डिसप्ले सबसिस्टम यह काम करता है:

  • यह पिछले फ़्रेम को अंदरूनी तौर पर बफ़र करता है
  • इससे देर से फ़्रेम सबमिट होने का पता चलता है
  • फ़्रेम के देर से आने का पता चलने पर, पिछले फ़्रेम को फिर से दिखाता है

जानें कि Mir 2 ने Swappy का इस्तेमाल करके, धीमे सेशन की दर को 40% से 10%तक कैसे कम किया.

नेटिव प्रोजेक्ट में Swappy का इस्तेमाल कैसे करें

Android Frame Pacing लाइब्रेरी को अपने गेम में इंटिग्रेट करने के लिए, यहां दी गई गाइड देखें:

Unity गेम इंजन में Swappy का इस्तेमाल करने का तरीका

Unity ने Android Frame Pacing को अपने इंजन में इंटिग्रेट किया है. Unity 2019.2 या इसके बाद के वर्शन में इस सुविधा को चालू करने के लिए, Android > रिज़ॉल्यूशन और प्रज़ेंटेशन के लिए, प्रोजेक्ट सेटिंग > प्लेयर > सेटिंग में जाकर, ऑप्टिमाइज़ किया गया फ़्रेम पेसिंग चेकबॉक्स चुनें:

प्रोजेक्ट सेटिंग का डायलॉग बॉक्स.
पहली इमेज. Unity Engine में फ़्रेम पेसिंग की सुविधा चालू करें.

इसके अलावा, अपने लॉजिक कोड में ऑप्टिमाइज़्ड फ़्रेम पेसिंग विकल्प को प्रोग्राम के हिसाब से चालू करें. इससे Unity, फ़्रेम रेट में कम अंतर के लिए फ़्रेम को समान रूप से डिस्ट्रिब्यूट कर पाएगा. इससे गेमप्ले बेहतर होगा.

Unreal गेम इंजन में Swappy का इस्तेमाल करने का तरीका

Unreal 4.25 और इसके बाद के वर्शन में, Android Frame Pacing Library इंटिग्रेट की गई है. यह Android Game Development Kit का हिस्सा है. मोबाइल फ़्रेम पेसिंग लेख में, Android फ़्रेम पेसिंग लाइब्रेरी को चालू करने का तरीका बताया गया है. साथ ही, C++ कोड से फ़्रेम पेसिंग को कंट्रोल करने का तरीका भी बताया गया है.

Vulkan क्या है

Vulkan एक मॉडर्न क्रॉस-प्लैटफ़ॉर्म 3D ग्राफ़िक्स एपीआई है. इसे डिवाइस के ग्राफ़िक्स हार्डवेयर और आपके गेम के बीच ऐब्स्ट्रैक्शन को कम करने के लिए डिज़ाइन किया गया है. Vulkan, Android पर मुख्य तौर पर इस्तेमाल होने वाला लो-लेवल ग्राफ़िक्स एपीआई है. यह OpenGL ES की जगह इस्तेमाल होता है. OpenGL ES अब भी Android पर काम करता है, लेकिन अब इस पर कोई नई सुविधा नहीं जोड़ी जा रही है.

OpenGL ES की तुलना में Vulkan के ये फ़ायदे हैं:

  • ग्राफ़िक्स ड्राइवर में सीपीयू के कम इस्तेमाल के साथ ज़्यादा बेहतर आर्किटेक्चर
  • सीपीयू की परफ़ॉर्मेंस को बेहतर बनाने के लिए, ऑप्टिमाइज़ेशन की नई रणनीतियां
  • OpenGL ES में नई ग्राफ़िक सुविधाएं उपलब्ध नहीं हैं. जैसे, बिना बाइंड किए एपीआई और रे ट्रेसिंग

नेटिव Android प्रोजेक्ट में Vulkan का इस्तेमाल करने का तरीका

Android पर Vulkan का इस्तेमाल शुरू करना कोडलैब में, Vulkan रेंडरिंग पाइपलाइन सेट अप करने का तरीका बताया गया है. इसके बाद, स्क्रीन पर टेक्सचर वाला घूमता हुआ ट्रायंगल रेंडर करने का तरीका बताया गया है. अपने गेम के ग्राफ़िक रेंडर करने का तरीका जानने के लिए, कोडलैब का इस्तेमाल करें.

Unity गेम इंजन में Vulkan का इस्तेमाल करने का तरीका

Unity पर डिवाइस अपने-आप चुनने की सुविधा चालू करने के लिए, ऑटो ग्राफ़िक्स एपीआई को कॉन्फ़िगर करने का तरीका अपनाएं.

प्रोजेक्ट सेटिंग का डायलॉग बॉक्स.
दूसरी इमेज. Unity Auto Graphics API चालू करें.

इसके अलावा, ऑटो ग्राफ़िक्स एपीआई को बंद करके, Vulkan को मैन्युअल तरीके से चालू किया जा सकता है. साथ ही, ग्राफ़िक्स एपीआई की सूची में Vulkan को सबसे ऊपर रखा जा सकता है. अगर Unity 2021.1 या इससे पहले के वर्शन का इस्तेमाल किया जा रहा है, तो Vulkan का इस्तेमाल करने का यही तरीका है.

प्रोजेक्ट सेटिंग का डायलॉग बॉक्स.
तीसरी इमेज. Unity में, Vulkan को मुख्य Graphics API के तौर पर मैन्युअल तरीके से चुनें.

VkQuality Unity इंजन प्लगिन का इस्तेमाल करें. इससे, गेम लॉन्च होने के समय, ग्राफ़िक्स एपीआई के सुझाव दिए जा सकते हैं. इन सुझावों का इस्तेमाल, कुछ खास डिवाइसों पर किया जा सकता है.

Unreal गेम इंजन में Vulkan का इस्तेमाल करने का तरीका

Vulkan Graphics API को चालू करने के लिए, Project Settings > Platforms > Android > Build पर जाएं. इसके बाद, Support Vulkan को चुनें. Vulkan का इस्तेमाल किया जा सकता है और OpenGL ES3.2 का इस्तेमाल किया जा सकता है, दोनों को चुनने पर Unreal, डिफ़ॉल्ट रूप से Vulkan का इस्तेमाल करता है. अगर डिवाइस पर Vulkan काम नहीं करता है, तो Unreal, OpenGL ES 3.2 पर वापस आ जाता है.

प्रोजेक्ट सेटिंग का डायलॉग बॉक्स.
चौथी इमेज. Unreal Engine में Vulkan को चालू करें.

अगर Vulkan की कुछ ऐसी सुविधाओं का इस्तेमाल किया जा रहा है जो कुछ डिवाइसों पर ठीक से काम नहीं करती हैं, तो उन डिवाइसों को बाहर रखने के लिए, अपनी BaseDeviceProfile.ini फ़ाइल को पसंद के मुताबिक बनाया जा सकता है. BaseDeviceProfile.ini को पसंद के मुताबिक बनाने का तरीका जानने के लिए, Android के लिए डिवाइस प्रोफ़ाइलें और स्केलेबिलिटी को पसंद के मुताबिक बनाना लेख पढ़ें. नए डिवाइस ड्राइवर, पहले से खराब डिवाइसों को ठीक कर सकते हैं. इसलिए, सभी ऑप्टिमाइज़ेशन पाने के लिए, अपनी BaseDeviceProfile.ini फ़ाइल को अपडेट रखें.

एडीपीएफ़ क्या है

Android Dynamic Performance Framework (ADPF), Android पर मौजूद डाइनैमिक थर्मल, सीपीयू, और जीपीयू मैनेजमेंट की सुविधाओं के आधार पर गेम को ऑप्टिमाइज़ करता है. इन सुविधाओं को खास तौर पर गेम के लिए बनाया गया है. हालांकि, इनका इस्तेमाल परफ़ॉर्मेंस पर असर डालने वाले अन्य ऐप्लिकेशन के लिए भी किया जा सकता है.

ADPF, एपीआई का एक सेट है. इसकी मदद से गेम और परफ़ॉर्मेंस पर ज़्यादा असर डालने वाले ऐप्लिकेशन, Android डिवाइसों के पावर और थर्मल सिस्टम के साथ सीधे तौर पर इंटरैक्ट कर सकते हैं. इन एपीआई की मदद से, Android सिस्टम पर डाइनैमिक व्यवहार को मॉनिटर किया जा सकता है. साथ ही, गेम की परफ़ॉर्मेंस को इस तरह से ऑप्टिमाइज़ किया जा सकता है कि डिवाइस ज़्यादा गर्म न हों.

ADPF की मुख्य सुविधाएं यहां दी गई हैं:

  • Thermal API: डिवाइस की थर्मल स्थिति को मॉनिटर करें, ताकि ऐप्लिकेशन, डिवाइस के ज़्यादा गर्म होने से पहले ही वर्कलोड को कम कर सके.
  • सीपीयू परफ़ॉर्मेंस हिंट एपीआई: परफ़ॉर्मेंस के बारे में ऐसे हिंट दें जिनसे Android को वर्कलोड के लिए सही परफ़ॉर्मेंस सेटिंग चुनने में मदद मिले. उदाहरण के लिए, सीपीयू ऑपरेटिंग पॉइंट या कोर.
  • Game Mode API और Game State API: ये एपीआई, गेम की परफ़ॉर्मेंस या बैटरी लाइफ़ को प्राथमिकता देकर, गेम को ऑप्टिमाइज़ करने की सुविधा देते हैं. ऐसा उपयोगकर्ता की सेटिंग और गेम के हिसाब से कॉन्फ़िगरेशन के आधार पर किया जाता है.
  • फ़िक्स्ड परफ़ॉर्मेंस मोड: बेंचमार्किंग के दौरान किसी डिवाइस पर फ़िक्स्ड परफ़ॉर्मेंस मोड चालू करें, ताकि आपको ऐसे मेज़रमेंट मिल सकें जिनमें डाइनैमिक सीपीयू क्लॉकिंग से बदलाव न हुआ हो.
  • पावर इफ़िशिएंसी मोड: इससे सेशन को यह पता चलता है कि परफ़ॉर्मेंस हिंट सेशन में थ्रेड को सुरक्षित तरीके से शेड्यूल किया जा सकता है. इससे परफ़ॉर्मेंस के बजाय पावर इफ़िशिएंसी को प्राथमिकता दी जाती है. यह सुविधा, Android 15 (एपीआई लेवल 35) में उपलब्ध है.

नेटिव Android प्रोजेक्ट में ADPF का इस्तेमाल कैसे करें

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

  • Thermal API: डिवाइस के गर्म होने की स्थिति के बारे में जानकारी पाएं और डिवाइस के थ्रॉटलिंग मोड में जाने से पहले कार्रवाई करें.
  • गेम मोड एपीआई: इससे खिलाड़ी की ऑप्टिमाइज़ेशन से जुड़ी प्राथमिकताओं (परफ़ॉर्मेंस को बेहतर बनाना या बैटरी बचाना) के बारे में पता चलता है. इसके हिसाब से, गेम को अडजस्ट किया जा सकता है.
  • Game State API: इससे सिस्टम को आपके गेम की स्थिति (लोडिंग, प्लेइंग, यूज़र इंटरफ़ेस (यूआई) वगैरह) के बारे में पता चलता है. इसके बाद, सिस्टम संसाधनों को ज़रूरत के हिसाब से अडजस्ट कर सकता है (I/O या सीपीयू, जीपीयू वगैरह को बूस्ट कर सकता है).
  • Performance Hint API: सिस्टम को अपने थ्रेडिंग मॉडल और वर्कलोड के बारे में बताएं, ताकि सिस्टम उसके हिसाब से संसाधनों को असाइन कर सके.

Unity गेम इंजन में ADPF का इस्तेमाल कैसे करें

Unity की अडैप्टिव परफ़ॉर्मेंस, गेम डेवलपर के लिए एक टूल है. इसकी मदद से, वे मोबाइल डिवाइसों पर अपने गेम को ऑप्टिमाइज़ कर सकते हैं. खास तौर पर, अलग-अलग Android डिवाइसों के लिए. Adaptive Performance की सुविधा की मदद से, आपका गेम डिवाइस की परफ़ॉर्मेंस और थर्मल की विशेषताओं के हिसाब से रीयल-टाइम में अडजस्ट हो जाता है. इससे गेमिंग का अनुभव बेहतर और असरदार होता है.

Adaptive Performance Android provider आपको Unity में ADPF लागू करने के तरीके के बारे में बताता है.

प्रोजेक्ट सेटिंग का डायलॉग बॉक्स.
पांचवीं इमेज. ADPF को Unity Engine में इंटिग्रेट करें.

Unreal गेम इंजन में ADPF का इस्तेमाल करने का तरीका

प्रोजेक्ट सेटिंग का डायलॉग बॉक्स.
छठी इमेज. Unreal Engine में ADPF को इंटिग्रेट करें.
  1. प्लगिन डाउनलोड करें
  2. प्लगिन को प्रोजेक्ट प्लगिन फ़ोल्डर में कॉपी करना
  3. Unreal एडिटर में ADPF Unreal Engine प्लगिन चालू करना
  4. Unreal Editor को फिर से लॉन्च करें
  5. गेम को बनाना और पकाना

Unreal Engine के लिए Android Dynamic Performance Framework(ADPF) प्लगिन, बेहतर परफ़ॉर्मेंस देता है और डिवाइस के ज़्यादा गर्म होने की वजह से होने वाली थ्रॉटलिंग को रोकता है. GitHub से प्लगिन डाउनलोड करें. यह प्लगिन, Unreal कंसोल वैल्यू सेट करके सुविधाओं में बदलाव करता है.