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 रेंडरर का इस्तेमाल करने के लिए, यह देखें:
- अपने OpenGL रेंडरर में Android फ़्रेम पेसिंग को इंटिग्रेट करना
- अपने Vulkan रेंडरर में Android फ़्रेम पेसिंग को इंटिग्रेट करना
ज़्यादा जानने के लिए, फ़्रेम पेसिंग लाइब्रेरी देखें.
फ़्रेम प्रति सेकंड को कम करने के लिए इंटरवेंशन
फ़्रेम प्रति सेकंड (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 के बीच इंटरैक्शन के बारे में बताया गया है:

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