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

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

फ़्रेम पेसिंग, गेम के लॉजिक और रेंडरिंग लूप को ओएस के डिसप्ले सबसिस्टम और डिसप्ले हार्डवेयर के साथ सिंक करने की प्रोसेस है. 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, बफ़र को ज़रूरत के हिसाब से जोड़कर, फ़्रेम रेट में होने वाले बदलावों को मैनेज करता है.

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