सरफ़ेस ऑब्जेक्ट की मदद से, ऐप्लिकेशन स्क्रीन पर इमेज दिखा सकते हैं. SurfaceHolder इंटरफ़ेस की मदद से, ऐप्लिकेशन प्लैटफ़ॉर्म में बदलाव कर सकते हैं और उन्हें कंट्रोल कर सकते हैं.
Surface
सर्फ़स, प्रोड्यूसर के लिए एक इंटरफ़ेस होता है. इसकी मदद से, वह उपभोक्ता के साथ बफ़र शेयर कर सकता है.
डिसप्ले के लिए BufferQueue को आम तौर पर ट्रिपल-बफ़रिंग के लिए कॉन्फ़िगर किया जाता है. बफ़र मांग के हिसाब से असाइन किए जाते हैं. इसलिए, अगर प्रोड्यूसर बफ़र को धीरे-धीरे जनरेट करता है, जैसे कि 60 fps डिसप्ले पर 30 fps पर, तो हो सकता है कि सूची में सिर्फ़ दो बफ़र असाइन किए गए हों.
मांग के हिसाब से बफ़र को असाइन करने से, मेमोरी के इस्तेमाल को कम करने में मदद मिलती है. dumpsys SurfaceFlinger
आउटपुट में, हर लेयर से जुड़े बफ़र की खास जानकारी देखी जा सकती है.
ज़्यादातर क्लाइंट, OpenGL ES या Vulkan का इस्तेमाल करके, सतहों पर रेंडर करते हैं. हालांकि, कुछ क्लाइंट कैनवस का इस्तेमाल करके प्लैटफ़ॉर्म पर रेंडर करते हैं.
कैनवस रेंडरिंग
कैनवस को लागू करने की सुविधा, Skia Graphics Library से मिलती है. अगर आपको कोई रेक्टैंगल बनाना है, तो Canvas API को कॉल करें. यह एपीआई, बाइट को बफ़र में सही तरीके से सेट करता है. यह पक्का करने के लिए कि कोई बफ़र एक साथ दो क्लाइंट से अपडेट न हो या उसे दिखाए जाने के दौरान उसमें डेटा न डाला जाए, उसे ऐक्सेस करने के लिए बफ़र को लॉक करें. कैनवस लॉक के साथ काम करने के लिए, इन कमांड का इस्तेमाल करें:
lockCanvas()
, सीपीयू पर रेंडर करने के लिए बफ़र को लॉक करता है और ड्रॉइंग के लिए इस्तेमाल करने के लिए कैनवस दिखाता है.unlockCanvasAndPost()
बफ़र को अनलॉक करता है और उसे कंपोजिटर को भेजता है.lockHardwareCanvas()
, GPU पर रेंडर करने के लिए बफ़र को लॉक करता है और ड्रॉइंग के लिए इस्तेमाल करने के लिए कैनवस दिखाता है.
जब प्रोड्यूसर पहली बार BufferQueue से बफ़र का अनुरोध करता है, तो बफ़र को असाइन किया जाता है और शून्य पर शुरू किया जाता है. प्रोसेस के बीच अनजाने में डेटा शेयर होने से बचने के लिए, शुरू करना ज़रूरी है. हालांकि, बफ़र का फिर से इस्तेमाल करने पर,
पिछला कॉन्टेंट अब भी मौजूद रहता है. अगर कुछ भी ड्रॉ किए बिना, lockCanvas()
और unlockCanvasAndPost()
को बार-बार कॉल किया जाता है, तो प्रोड्यूसर पहले रेंडर किए गए फ़्रेम के बीच साइकल करता है.
सरफ़ेस लॉक/अनलॉक कोड, पहले रेंडर किए गए बफ़र का रेफ़रंस रखता है. अगर आपने सर्वर को लॉक करते समय, बदलाव वाला कोई क्षेत्र तय किया है, तो यह पिछले बफ़र से उन पिक्सल को कॉपी करता है जिनमें बदलाव नहीं हुआ है. आम तौर पर, SurfaceFlinger या HWC, बफ़र को मैनेज करता है. हालांकि, हमें सिर्फ़ बफ़र से पढ़ने की ज़रूरत होती है. इसलिए, खास ऐक्सेस के लिए इंतज़ार करने की ज़रूरत नहीं है.
SurfaceHolder
SurfaceHolder एक इंटरफ़ेस है. सिस्टम इसका इस्तेमाल, ऐप्लिकेशन के साथ स्क्रीन का मालिकाना हक शेयर करने के लिए करता है. प्लैटफ़ॉर्म के साथ काम करने वाले कुछ क्लाइंट को SurfaceHolder की ज़रूरत होती है, क्योंकि प्लैटफ़ॉर्म पैरामीटर पाने और सेट करने के लिए एपीआई, SurfaceHolder के ज़रिए लागू किए जाते हैं. SurfaceView में एक SurfaceHolder होता है.
व्यू के साथ इंटरैक्ट करने वाले ज़्यादातर कॉम्पोनेंट में SurfaceHolder शामिल होता है. MediaCodec जैसे कुछ अन्य एपीआई, डिवाइस पर ही काम करते हैं.