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

Android फ़्रेम पेसिंग लाइब्रेरी को Swappy भी कहा जाता है. यह Android गेम के एसडीके का हिस्सा है. इससे 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, उपयोगकर्ताओं और गेम के हिसाब से अलग-अलग होता है. इससे एक ही डिवाइस पर हर उपयोगकर्ता के लिए, एक ही गेम में फ़्रेम रेट की सेटिंग अलग-अलग हो सकती हैं. किसी गेम के फ़्रेम रेट को कम करने के लिए, GameServiceManager, SurfaceFlinger को कॉल करता है. इससे किसी यूआईडी के लिए फ़्रेम रेट को बदला जा सकता है. इस तरीके से, SurfaceFlinger गेम मोड में बदलाव होने या इंटरवेंशन अपडेट होने पर, मैपिंग को अपडेट करता है. SurfaceFlinger, बफ़र को ज़रूरत के हिसाब से अटैच करके, फ़्रेम रेट में होने वाले बदलावों को मैनेज करता है.

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