VSync

VSync सिग्नल, डिसप्ले पाइपलाइन को सिंक करता है. डिसप्ले पाइपलाइन में ऐप्लिकेशन रेंडरिंग, SurfaceFlinger कॉम्पोज़िशन, और डिसप्ले पर इमेज दिखाने वाला हार्डवेयर कंपोज़र (एचडब्ल्यूसी) शामिल होता है. VSync, ऐप्लिकेशन के रेंडरिंग शुरू करने के लिए, स्क्रीन को कॉम्पोज़ करने के लिए, और डिसप्ले के रीफ़्रेश साइकल के लिए, डिवाइस के चालू होने के समय को सिंक करता है. इस सिंक की मदद से, वीडियो में रुकावट नहीं आती और ग्राफ़िक की विज़ुअल परफ़ॉर्मेंस बेहतर होती है.

HWC, VSync इवेंट जनरेट करता है और कॉलबैक के ज़रिए इवेंट को SurfaceFlinger पर भेजता है:

typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData,
        hwc2_display_t display, int64_t timestamp);

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

VSync ऑफ़सेट

सिंक ऐप्लिकेशन और SurfaceFlinger, हार्डवेयर VSync के लिए लूप रेंडर करते हैं. VSync इवेंट पर, डिसप्ले फ़्रेम N दिखाना शुरू कर देता है, जबकि SurfaceFlinger फ़्रेम N+1 के लिए विंडो को कंपोज करना शुरू कर देता है. ऐप्लिकेशन, बाकी बचे इनपुट को मैनेज करता है और फ़्रेम N+2 जनरेट करता है.

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

इस समस्या को ठीक करने के लिए, VSync ऑफ़सेट का इस्तेमाल किया जा सकता है. इससे, ऐप्लिकेशन और कॉम्पोज़िशन सिग्नल को हार्डवेयर VSync के हिसाब से बनाकर, इनपुट-टू-डिसप्ले के इंतज़ार का समय कम किया जा सकता है. ऐसा इसलिए होता है, क्योंकि ऐप्लिकेशन और कॉम्पोज़िशन को आम तौर पर 33 मिलीसेकंड से कम समय लगता है.

VSync ऑफ़सेट का नतीजा, एक ही अवधि और ऑफ़सेट फ़ेज़ वाले तीन सिग्नल होते हैं:

  • HW_VSYNC_0 — डिसप्ले पर अगला फ़्रेम दिखने लगता है.
  • VSYNC — ऐप्लिकेशन, इनपुट को पढ़ता है और अगला फ़्रेम जनरेट करता है.
  • SF_VSYNC — SurfaceFlinger, अगले फ़्रेम के लिए कॉम्पोज़ करना शुरू करता है.

VSync ऑफ़सेट की मदद से, SurfaceFlinger को बफ़र मिलता है और वह फ़्रेम को कंपोज़ करता है. इस दौरान, ऐप्लिकेशन एक साथ इनपुट को प्रोसेस करता है और फ़्रेम को रेंडर करता है.

DispSync

DispSync, डिसप्ले के हर समय होने वाले हार्डवेयर-आधारित VSync इवेंट का मॉडल बनाए रखता है. साथ ही, हार्डवेयर VSync इवेंट के खास फ़ेज़ ऑफ़सेट पर कॉलबैक लागू करने के लिए, उस मॉडल का इस्तेमाल करता है.

DispSync एक सॉफ़्टवेयर फ़ेज़-लॉक लूप (पीएलएल) है. यह VSYNC और SF_VSYNC सिग्नल जनरेट करता है. इनका इस्तेमाल Choreographer और SurfaceFlinger करते हैं. भले ही, ये सिग्नल हार्डवेयर VSync से ऑफ़सेट न हों.

DispSync फ़्लो को इस इमेज में दिखाया गया है:

DispSync फ़्लो

पहली इमेज. DispSync फ़्लो.

DispSync की ये खूबियां हैं:

  • रेफ़रंसHW_VSYNC_0.
  • आउटपुटVSYNC और SF_VSYNC.
  • सुझाव/राय/शिकायत — एचडब्ल्यूसी से फ़ेंस सिग्नल के टाइमस्टैंप हटाएं.

VSync रिटायर ऑफ़सेट

रिटायर फ़ेंस के सिग्नल टाइमस्टैंप, एचडब्ल्यू वीएसंक से मेल खाने चाहिए. ऐसा उन डिवाइसों पर भी करना चाहिए जो ऑफ़सेट फ़ेज़ का इस्तेमाल नहीं करते. ऐसा न करने पर, गड़बड़ियां जितनी गंभीर होती हैं उससे ज़्यादा गंभीर लगती हैं. स्मार्ट पैनल में अक्सर ऐसा डेल्टा होता है जहां रिटायर फ़ेंस, डिसप्ले मेमोरी के लिए डायरेक्ट मेमोरी ऐक्सेस (डीएमए) का आखिरी हिस्सा होता है. हालांकि, डिसप्ले स्विच और एचडब्ल्यू वीएसंक कुछ समय बाद होता है.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS को डिवाइस के BoardConfig.mk मेकफ़ाइल में सेट किया गया है. यह डिसप्ले कंट्रोलर और पैनल की विशेषताओं पर आधारित होता है. रिटायर फ़ेंस टाइमस्टैंप से लेकर एचडब्ल्यू वीएसाइन्क सिग्नल तक का समय, नैनोसेकंड में मेज़र किया जाता है.

VSYNC और SF_VSYNC ऑफ़सेट

VSYNC_EVENT_PHASE_OFFSET_NS और SF_VSYNC_EVENT_PHASE_OFFSET_NS को ज़्यादा लोड वाले इस्तेमाल के उदाहरणों के आधार पर, कम से कम वैल्यू पर सेट किया जाता है. जैसे, विंडो ट्रांज़िशन के दौरान जीपीयू का कुछ हिस्सा इस्तेमाल करना या ऐनिमेशन वाले वेब पेज पर Chrome को स्क्रोल करना. इन ऑफ़सेट की मदद से, ऐप्लिकेशन को रेंडर होने में और जीपीयू को कॉम्पोज़ करने में ज़्यादा समय लगता है.

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