Surface और SurfaceHolder

सरफ़ेस ऑब्जेक्ट की मदद से ऐप्लिकेशन, स्क्रीन पर दिखाने के लिए इमेज रेंडर कर पाते हैं. SurfaceHolder इंटरफ़ेस की मदद से, ऐप्लिकेशन को प्लैटफ़ॉर्म में बदलाव करने और उन्हें कंट्रोल करने की सुविधा मिलती है.

Surface

सरफ़ेस, प्रोड्यूसर के लिए एक इंटरफ़ेस होता है. इसकी मदद से, वह उपभोक्ता के साथ बफ़र शेयर कर सकता है.

डिसप्ले प्लैटफ़ॉर्म आम तौर पर, ट्रिपल-बफ़रिंग के लिए कॉन्फ़िगर किए गए BufferQueues का इस्तेमाल करते हैं. बफ़र की सुविधा, ज़रूरत के हिसाब से उपलब्ध कराई जाती है. इसलिए, अगर प्रोड्यूसर बफ़र को धीरे-धीरे जनरेट करता है, तो कतार में सिर्फ़ दो बफ़र हो सकते हैं. जैसे, 60 फ़्रेम प्रति सेकंड (एफ़पीएस) वाले डिसप्ले पर 30 एफ़पीएस. ज़रूरत के हिसाब से बफ़र असाइन करने से, मेमोरी का इस्तेमाल कम होता है. dumpsys SurfaceFlinger आउटपुट में, हर लेयर से जुड़े बफ़र की खास जानकारी देखी जा सकती है.

ज़्यादातर क्लाइंट, OpenGL ES या Vulkan का इस्तेमाल करके, कॉन्टेंट को रेंडर करते हैं. हालांकि, कुछ क्लाइंट कैनवस का इस्तेमाल करके, प्लैटफ़ॉर्म पर रेंडर करते हैं.

कैनवस रेंडरिंग

Skia Graphics Library, कैनवस को लागू करने की सुविधा देती है. अगर आपको कोई रेक्टैंगल बनाना है, तो Canvas API को कॉल करें. यह बफ़र में बाइट को सही तरीके से सेट करता है. यह पक्का करने के लिए कि बफ़र को एक साथ दो क्लाइंट अपडेट न करें या उसे दिखाते समय न लिखा जाए, बफ़र को ऐक्सेस करने के लिए लॉक करें. कैनवस लॉक के साथ काम करने के लिए, इन कमांड का इस्तेमाल करें:

  • lockCanvas(), सीपीयू पर रेंडर करने के लिए बफ़र को लॉक करता है. साथ ही, ड्रॉइंग के लिए Canvas दिखाता है.
  • unlockCanvasAndPost(), बफ़र को अनलॉक करता है और उसे कंपोज़िटर को भेजता है.
  • lockHardwareCanvas(), GPU पर रेंडर करने के लिए बफ़र को लॉक करता है. साथ ही, ड्रॉइंग के लिए कैनवस दिखाता है.

जब प्रोड्यूसर पहली बार BufferQueue से बफ़र का अनुरोध करता है, तब बफ़र को शून्य पर सेट किया जाता है. प्रोसेस के बीच गलती से डेटा शेयर होने से रोकने के लिए, इसे शुरू करना ज़रूरी है. हालांकि, किसी बफ़र का फिर से इस्तेमाल करने पर, उसमें मौजूद पिछला कॉन्टेंट अब भी मौजूद रहता है. अगर lockCanvas() और unlockCanvasAndPost() को बार-बार कॉल किया जाता है और कुछ भी नहीं बनाया जाता है, तो प्रोड्यूसर, पहले से रेंडर किए गए फ़्रेम के बीच साइकल करता है.

सरफ़ेस लॉक/अनलॉक कोड, पहले रेंडर किए गए बफ़र का रेफ़रंस सेव रखता है. सरफ़ेस को लॉक करते समय डर्टी रीजन तय करने पर, यह पिछले बफ़र से नॉनडर्टी पिक्सल कॉपी करता है. आम तौर पर, SurfaceFlinger या HWC बफ़र को मैनेज करते हैं. हालांकि, आपको सिर्फ़ बफ़र से डेटा पढ़ना है. इसलिए, एक्सक्लूसिव ऐक्सेस के लिए इंतज़ार करने की ज़रूरत नहीं है.

SurfaceHolder

SurfaceHolder एक इंटरफ़ेस है. इसका इस्तेमाल सिस्टम, ऐप्लिकेशन के साथ सर्फ़ेस का मालिकाना हक शेयर करने के लिए करता है. प्लैटफ़ॉर्म के साथ काम करने वाले कुछ क्लाइंट को SurfaceHolder की ज़रूरत होती है, क्योंकि प्लैटफ़ॉर्म के पैरामीटर पाने और सेट करने के लिए एपीआई, SurfaceHolder के ज़रिए लागू किए जाते हैं. SurfaceView में SurfaceHolder होता है.

व्यू के साथ इंटरैक्ट करने वाले ज़्यादातर कॉम्पोनेंट में SurfaceHolder शामिल होता है. MediaCodec जैसे कुछ अन्य एपीआई, सीधे तौर पर Surface पर काम करते हैं.