सतह और सतह धारक

सरफेस ऑब्जेक्ट ऐप्स को स्क्रीन पर प्रस्तुत की जाने वाली छवियों को प्रस्तुत करने में सक्षम बनाते हैं। सरफेसहोल्डर इंटरफेस ऐप्स को सतहों को संपादित और नियंत्रित करने में सक्षम बनाता है।

सतह

एक सतह एक निर्माता के लिए उपभोक्ता के साथ बफ़र्स का आदान-प्रदान करने के लिए एक इंटरफ़ेस है।

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

अधिकांश ग्राहक OpenGL ES या Vulkan का उपयोग करके सतहों पर रेंडर करते हैं। हालाँकि, कुछ ग्राहक कैनवास का उपयोग करके सतहों पर प्रस्तुतिकरण करते हैं।

कैनवास प्रतिपादन

कैनवास कार्यान्वयन स्किया ग्राफ़िक्स लाइब्रेरी द्वारा प्रदान किया गया है। यदि आप एक आयत बनाना चाहते हैं, तो आप कैनवास एपीआई को कॉल करते हैं, जो उचित रूप से बफ़र में बाइट्स सेट करता है। यह सुनिश्चित करने के लिए कि एक बफ़र को दो क्लाइंट द्वारा एक साथ अपडेट नहीं किया जाता है, या प्रदर्शित होने के दौरान लिखा नहीं जाता है, इसे एक्सेस करने के लिए बफ़र को लॉक करें। कैनवास लॉक के साथ काम करने के लिए निम्नलिखित कमांड का उपयोग करें:

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

पहली बार जब निर्माता बफ़रक्यू से बफ़र का अनुरोध करता है, तो बफ़र को आवंटित किया जाता है और शून्य पर आरंभ किया जाता है। प्रक्रियाओं के बीच अनजाने में डेटा साझा करने से बचने के लिए आरंभीकरण आवश्यक है। हालाँकि, यदि आप बफ़र का पुन: उपयोग करते हैं, तो पिछली सामग्री अभी भी मौजूद है। यदि आप बार-बार बिना कुछ खींचे lockCanvas() और unlockCanvasAndPost() को कॉल करते हैं, तो निर्माता पहले से रेंडर किए गए फ्रेम के बीच चक्र करता है।

सरफेस लॉक/अनलॉक कोड पहले रेंडर किए गए बफ़र का संदर्भ रखता है। यदि आप सतह को लॉक करते समय एक गंदा क्षेत्र निर्दिष्ट करते हैं, तो यह पिछले बफ़र से गैर-गंदे पिक्सेल की प्रतिलिपि बनाता है। SurfaceFlinger या HWC आमतौर पर बफ़र को संभालते हैं; लेकिन क्योंकि हमें केवल बफ़र से पढ़ने की ज़रूरत है, इसलिए विशेष पहुंच के लिए प्रतीक्षा करने की कोई आवश्यकता नहीं है।

सतह धारक

सरफेसहोल्डर एक इंटरफ़ेस है जिसका उपयोग सिस्टम ऐप्स के साथ सतहों के स्वामित्व को साझा करने के लिए करता है। कुछ क्लाइंट जो सतहों के साथ काम करते हैं, वे SurfaceHolder चाहते हैं, क्योंकि सतह पैरामीटर प्राप्त करने और सेट करने के लिए API को SurfaceHolder के माध्यम से कार्यान्वित किया जाता है। SurfaceView में एक SurfaceHolder होता है।

किसी दृश्य के साथ इंटरैक्ट करने वाले अधिकांश घटकों में सरफेसहोल्डर शामिल होता है। कुछ अन्य एपीआई, जैसे मीडियाकोडेक, सतह पर ही काम करते हैं।