फ़्रेम पेसिंग

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

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

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

फ़्रेम रेंडर होने में लगने वाले समय में अंतर, गेम के रेंडर लूप के ऐसे रेट पर चलने की वजह से होता है जो नेटिव डिसप्ले हार्डवेयर के साथ काम नहीं करता. गेम का रेंडर लूप, डिसप्ले हार्डवेयर के हिसाब से बहुत धीरे चलने पर समस्याएं आती हैं. इससे डिसप्ले टाइम में अंतर आता है. उदाहरण के लिए, जब 30 फ़्रेम प्रति सेकंड (एफ़पीएस) पर चलने वाला कोई गेम, ऐसे डिवाइस पर रेंडर करने की कोशिश करता है जो मूल रूप से 60 एफ़पीएस पर काम करता है, तो गेम का रेंडर लूप, एक ही फ़्रेम को स्क्रीन पर 16 मि॰से॰ तक दिखाता रहता है. इस तरह की समस्या की वजह से, फ़्रेम के समय में काफ़ी अंतर आ जाता है. जैसे, 33 मि॰से॰, 16 मि॰से॰, और 49 मि॰से॰. ज़्यादा जटिल सीन की वजह से यह समस्या और बढ़ जाती है, क्योंकि इससे फ़्रेम छूट जाते हैं.

फ़्रेम पेसिंग लाइब्रेरी ये काम करती है:

  • गेम के फ़्रेम कम होने की वजह से होने वाली रुकावट को ठीक करता है.
    • यह कुकी, प्रज़ेंटेशन के टाइमस्टैंप जोड़ती है, ताकि फ़्रेम समय पर दिखाए जा सकें, न कि समय से पहले.
    • यह प्रज़ेंटेशन टाइमस्टैंप एक्सटेंशन EGL_ANDROID_presentation_time और VK_GOOGLE_display_timing का इस्तेमाल करता है.
  • यह लंबे फ़्रेम के लिए सिंक फ़ेंस का इस्तेमाल करता है. इससे फ़्रेम रुक-रुक कर चलते हैं और इंतज़ार का समय बढ़ जाता है.
    • ऐप्लिकेशन में इंतज़ार के समय को इंजेक्ट करता है. इससे डिसप्ले पाइपलाइन को बैक प्रेशर बढ़ने से रोकने में मदद मिलती है.
    • सिंक फ़ेंस (EGL_KHR_fence_sync और VkFence) का इस्तेमाल करता है.
  • अगर आपके डिवाइस पर एक से ज़्यादा रीफ़्रेश रेट काम करते हैं, तो यह कुकी ऐसा रीफ़्रेश रेट चुनती है जिससे आपको बेहतर अनुभव मिले.
  • फ़्रेम के आंकड़े का इस्तेमाल करके, डीबग करने और प्रोफ़ाइल बनाने के लिए आंकड़े उपलब्ध कराता है.

अपनी ज़रूरत के हिसाब से, अलग-अलग मोड में काम करने के लिए लाइब्रेरी को कॉन्फ़िगर करने का तरीका जानने के लिए, सपोर्ट किए गए ऑपरेटिंग मोड देखें.

OpenGL रेंडरर या Vulkan रेंडरर का इस्तेमाल करने के लिए, यह लेख पढ़ें:

ज़्यादा जानने के लिए, फ़्रेम पेसिंग लाइब्रेरी देखें.

फ़्रेम प्रति सेकंड की थ्रॉटलिंग से जुड़ी समस्या

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

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

GameManagerService

GameManagerService कॉम्पोनेंट, गेम मोड और गेम इंटरवेंशन की जानकारी को हर उपयोगकर्ता और हर गेम के हिसाब से सेव रखता है. एफ़पीएस की जानकारी, GameManagerService में सेव की जाती है. इसमें अन्य इंटरवेंशन की जानकारी भी सेव की जाती है. जैसे, रिज़ॉल्यूशन डाउनस्केलिंग फ़ैक्टर. यह जानकारी, हर उपयोगकर्ता प्रोफ़ाइल के लिए <PACKAGE_NAME, Interventions> मैपिंग में सेव की जाती है. गेम मोड बदलने या इंटरवेंशन अपडेट होने पर, एफ़पीएस की जानकारी ऐक्सेस की जाती है. UID हर PACKAGE_NAME और उपयोगकर्ता के लिए यूनीक होता है. इसे <UID, Frame Rate> पेयर में बदलकर, SurfaceFlinger को भेजा जा सकता है.

SurfaceFlinger

SurfaceFlinger कॉम्पोनेंट, किसी ऐप्लिकेशन के एफ़पीएस को पहले से ही थ्रॉटल कर सकता है. हालांकि, ऐसा तब तक किया जा सकता है, जब तक फ़्रेम रेट, डिसप्ले के रीफ़्रेश रेट का भाजक हो. वीसिंक के मामले में, SurfaceFlinger थ्रॉटल किए गए ऐप्लिकेशन के लिए वीसिंक की वैधता की जांच करता है. इसके लिए, वह यह पुष्टि करता है कि वीसिंक टाइमस्टैंप, ऐप्लिकेशन के फ़्रेम रेट के साथ सिंक है या नहीं. अगर फ़्रेम रेट, VSync के साथ सिंक नहीं होता है, तो SurfaceFlinger फ़्रेम को तब तक होल्ड करता है, जब तक फ़्रेम रेट और VSync सिंक नहीं हो जाते.

इस इमेज में, GameManagerService और SurfaceFlinger के बीच इंटरैक्शन के बारे में बताया गया है:

GameManagerService और SurfaceFlinger के बीच इंटरैक्शन

पहली इमेज. GameServiceManager और SurfaceFlinger के बीच इंटरैक्शन.

SurfaceFinger, नई फ़्रेम रेट थ्रॉटलिंग की प्राथमिकता सेट करने के लिए, <UID, Frame Rate> पेयर मैपिंग को बनाए रखता है. UID, उपयोगकर्ताओं और गेम के हिसाब से अलग-अलग होता है. इससे एक ही डिवाइस पर मौजूद हर उपयोगकर्ता के पास, एक ही गेम के लिए फ़्रेम रेट की अलग-अलग सेटिंग हो सकती हैं. किसी गेम के फ़्रेम रेट को कम करने के लिए, GameManagerService, SurfaceFlinger को कॉल करता है. इससे SurfaceFlinger, किसी यूआईडी के लिए फ़्रेम रेट को बदल देता है. इस तरीके से, SurfaceFlinger, गेम मोड में बदलाव होने या इंटरवेंशन अपडेट होने पर, मैपिंग को अपडेट करता है. SurfaceFlinger, बफ़र को ज़रूरत के हिसाब से जोड़कर, फ़्रेम रेट में होने वाले बदलाव को मैनेज करता है.

एफ़पीएस थ्रॉटलिंग के बारे में ज़्यादा जानने के लिए, एफ़पीएस थ्रॉटलिंग लेख पढ़ें.