जवाबों:
दृश्य सभी एक ही जीयूआई धागे पर खींचे जाते हैं जो सभी उपयोगकर्ता इंटरैक्शन के लिए भी उपयोग किया जाता है।
इसलिए यदि आपको GUI को तेजी से अपडेट करने की आवश्यकता है या यदि रेंडरिंग में बहुत अधिक समय लगता है और उपयोगकर्ता अनुभव को प्रभावित करता है तो उपयोग करें SurfaceView
।
कुछ बातें जो मैंने नोट की हैं:
अधिक जानकारी के लिए (और एक महान उपयोग उदाहरण) SDK के उदाहरण अनुभाग में लूनरलैंडर परियोजना को देखें।
अद्यतन 05/09/2014
ठीक है। हमारे पास अब आधिकारिक दस्तावेज है। इसने उन सभी से बात की जिनका मैंने उल्लेख किया है, बेहतर तरीके से।
अधिक विस्तृत यहाँ पढ़ें ।
हां, मुख्य अंतर सतह दृश्य पृष्ठभूमि थ्रेड पर अद्यतन किया जा सकता है। हालांकि, वहाँ अधिक आप की देखभाल कर सकते हैं।
सतह दृश्य सतह बफर को समर्पित किया है, जबकि सभी दृश्य एक सतह बफर साझा करता है जो ViewRoot द्वारा आवंटित किया गया है। दूसरे शब्द में, सरफेस व्यू में अधिक संसाधनों का खर्च होता है।
सतह दृश्य हार्डवेयर को त्वरित नहीं किया जा सकता है (JB4.2 के रूप में), जबकि सामान्य दृश्य पर 95% ऑपरेशन खुले हुए ES का उपयोग करके त्वरित किया जाता है।
आपके कस्टमाइज्ड सरफेस व्यू को बनाने के लिए अधिक काम किया जाना चाहिए। आपको श्रोता को सतह पर जाने / नष्ट करने की आवश्यकता है, एक रेंडर थ्रेड बनाएं, अधिक महत्वपूर्ण बात, रेंडर थ्रेड और मुख्य थ्रेड को सिंक्रनाइज़ करें। हालाँकि, व्यू को कस्टमाइज़ करने के लिए, आपको केवल ओवरराइड करना होगाonDraw
पद्धति की आवश्यकता है।
view.invalidate
यूआई थ्रेड में या view.postInvalid
अन्य थ्रेड में कॉल करते हैं ताकि रूपरेखा को इंगित किया जा सके कि दृश्य अपडेट किया जाना चाहिए। हालाँकि, दृश्य तुरंत अपडेट नहीं किया जाएगा, लेकिन अगली VSYNC घटना के आने तक प्रतीक्षा करें। VSYNC को समझने का आसान तरीका यह माना जाता है कि यह एक टाइमर के रूप में है जो 60fps स्क्रीन के लिए प्रत्येक 16ms को फायर करता है। एंड्रॉइड में, सभी सामान्य दृश्य अपडेट (और वास्तव में प्रदर्शित करते हैं लेकिन मैं आज बात नहीं करूंगा), बेहतर चिकनीता प्राप्त करने के लिए वीएसवाईएनसी के साथ सिंक्रनाइज़ किया गया है। अब, सरफेस व्यू पर वापस, आप इसे अपनी इच्छानुसार कभी भी रेंडर कर सकते हैं। हालांकि, मैं शायद ही बता सकता हूं कि क्या यह एक फायदा है, क्योंकि डिस्प्ले वीएसवाईएनसी के साथ भी सिंक्रनाइज़ है, जैसा कि पहले कहा गया है।मुख्य अंतर यह है कि SurfaceView
पृष्ठभूमि के आधार पर खींचा जा सकता है, लेकिन Views
नहीं।
SurfaceViews
जब तक आप उन्हें उपयोग नहीं करना चाहते, तब तक अधिक संसाधनों का उपयोग करें।
एक SurfaceView
यह है कि यह अंदर तैयार करने के लिए इस्तेमाल किया जा सकता एंड्रॉयड में एक कस्टम दृश्य है।
A View
और a के बीच मुख्य अंतर SurfaceView
यह है कि इसमें एक View खींचा जाता है
UI Thread
, जिसका उपयोग सभी उपयोगकर्ता सहभागिता के लिए किया जाता है।
अगर आप UI को तेज़ी से अपडेट करना चाहते हैं और उसमें अच्छी मात्रा में जानकारी देना चाहते हैं, तो सरफेस व्यू एक बेहतर विकल्प है।
लेकिन कुछ तकनीकी जानकारी हैं SurfaceView
:
1. वे हार्डवेयर त्वरित नहीं हैं।
2. सामान्य विचार तब प्रस्तुत किए जाते हैं जब आप विधियों को कॉल करते हैं invalidate
या postInvalidate()
, लेकिन इसका मतलब यह नहीं है कि दृश्य तुरंत अपडेट किया VSYNC
जाएगा (ए भेजा जाएगा, और ओएस तब अपडेट हो जाता है जब यह अपडेट हो जाता है। SurfaceView
तुरंत अपडेट किया जा सकता है।
3. ए सर्फेस व्यू दिया गया है) एक आवंटित है surface buffer
, इसलिए यह अधिक महंगा है
सरफेसव्यू और व्यू के बीच एक मुख्य अंतर यह है कि एक सामान्य दृश्य के लिए स्क्रीन को रिफ्रेश करने के लिए हमें उसी विधि से अमान्य विधि को कॉल करना होता है जहां व्यू को परिभाषित किया जाता है। लेकिन अगर हम अमान्य कहते हैं, तो भी ताज़ा तुरंत नहीं होता है। यह VSYNC सिग्नल के अगले आगमन के बाद ही होता है। VSYNC सिग्नल एक कर्नेल जनरेट सिग्नल है जो हर 16.6 ms पर होता है या इसे 60 फ्रेम प्रति सेकंड के रूप में भी जाना जाता है। इसलिए यदि हम स्क्रीन के रिफ्रेशिंग पर अधिक नियंत्रण चाहते हैं (उदाहरण के लिए बहुत तेजी से बढ़ते एनीमेशन के लिए), तो हमें सामान्य व्यू क्लास का उपयोग नहीं करना चाहिए।
दूसरी ओर, सरफेसव्यू के मामले में, हम जितनी जल्दी चाहें स्क्रीन को रीफ्रेश कर सकते हैं और हम इसे बैकग्राउंड थ्रेड से कर सकते हैं। इसलिए सरफेसव्यू का रिफ्रेशिंग वास्तव में VSYNC पर निर्भर नहीं करता है, और यह बहुत उपयोगी है अगर हम हाई स्पीड एनीमेशन करना चाहते हैं। मेरे पास कुछ प्रशिक्षण वीडियो और उदाहरण एप्लिकेशन हैं जो इन सभी चीजों को अच्छी तरह से समझाते हैं। कृपया निम्नलिखित प्रशिक्षण वीडियो पर एक नज़र डालें।
क्यों भूतल दृश्य का उपयोग करें और क्लासिक दृश्य वर्ग नहीं ...
एक मुख्य कारण है कि SurfaceView स्क्रीन को तेजी से प्रस्तुत कर सकता है।
सरल शब्दों में एक एसवी समय प्रबंधन और एनिमेशन प्रदान करने में अधिक सक्षम है।
एक बेहतर समझ के लिए एक सरफेस व्यू क्या है, हमें इसकी तुलना व्यू क्लास से करनी चाहिए।
क्या अंतर है ... इस सरल स्पष्टीकरण को वीडियो में देखें
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
वैसे व्यू के साथ हमारी एक बड़ी समस्या है .... एनिमेशन प्रदान करने का समय।
आम तौर पर onDraw () को एंड्रॉइड रन-टाइम सिस्टम से कहा जाता है।
इसलिए, जब एंड्रॉइड रन-टाइम सिस्टम ऑनड्रॉ () को कॉल करता है तो एप्लिकेशन कैंट कंट्रोल करता है
प्रदर्शन का समय, और यह एनीमेशन के लिए महत्वपूर्ण है। हमारे पास समय का अंतराल है
एप्लिकेशन (हमारे गेम) और एंड्रॉइड रन-टाइम सिस्टम के बीच।
SV इसे onDraw () एक समर्पित थ्रेड द्वारा कॉल कर सकते हैं।
इस प्रकार: अनुप्रयोग समय को नियंत्रित करता है। इसलिए हम एनीमेशन की अगली बिटमैप छवि प्रदर्शित कर सकते हैं।