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

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

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

  • पिछले फ़्रेम को अंदरूनी तौर पर बफ़र करना
  • देर से सबमिट किए गए फ़्रेम का पता लगाना
  • देर से आने वाले फ़्रेम का पता चलने पर, मौजूदा फ़्रेम को दिखाना जारी रखना

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

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

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

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

OpenGL रेंडरर या Vulkan रेंडरर का इस्तेमाल करने के लिए,

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

फ़्रेम प्रति सेकंड को कम करने के लिए इंटरवेंशन

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

एफ़पीएस को कम करने के लिए, इन कॉम्पोनेंट का इस्तेमाल किया जाता है:

GameManagerService

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

SurfaceFlinger

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

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

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

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

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

फ़्रेम रेट को कम करने के बारे में ज़्यादा जानने के लिए, फ़्रेम रेट को कम करने के बारे में जानकारी देखें.