SurfaceView और देखें के बीच अंतर?


211

जब यह आवश्यक है, या SurfaceViewइसके बजाय का उपयोग करना बेहतर है View?

जवाबों:


210

दृश्य सभी एक ही जीयूआई धागे पर खींचे जाते हैं जो सभी उपयोगकर्ता इंटरैक्शन के लिए भी उपयोग किया जाता है।

इसलिए यदि आपको GUI को तेजी से अपडेट करने की आवश्यकता है या यदि रेंडरिंग में बहुत अधिक समय लगता है और उपयोगकर्ता अनुभव को प्रभावित करता है तो उपयोग करें SurfaceView


2
पियर के उत्तर की जांच करें जिसमें अधिक विवरण शामिल हैं।
हेलिन वांग

4
आधिकारिक विवरण का उत्तर: developer.android.com/guide/topics/graphics/2d-graphics.html
हेलिन वांग

अब यह बिल्कुल सरल नहीं है। पियर के जवाब की जाँच करें; इसमें विस्तृत आर्किटेक्चर डॉक ( source.android.com/devices/graphics/ RGBecture.html ) का लिंक दिया गया है , और बताते हैं कि कैनवस रेंडरिंग के हार्डवेयर त्वरण कस्टम व्यू को बेहतर विकल्प क्यों बना सकते हैं।
fadden 17

1
भूतल व्यू के बजाय, स्टैक व्यू का उपयोग कब करें?
इगोरगानापोलस्की

103

कुछ बातें जो मैंने नोट की हैं:

  • भूतल व्यू में एक अच्छा रेंडरिंग तंत्र होता है जो थ्रेड्स को हैंडलर (एनीमेशन के लिए अच्छा) का उपयोग किए बिना सतह की सामग्री को अपडेट करने की अनुमति देता है।
  • भूतल साक्षात्कार पारदर्शी नहीं हो सकते , वे केवल पदानुक्रम में अन्य तत्वों के पीछे दिखाई दे सकते हैं।
  • मैंने पाया है कि वे व्यू पर रेंडर करने की तुलना में एनीमेशन के लिए बहुत तेज़ हैं।

अधिक जानकारी के लिए (और एक महान उपयोग उदाहरण) SDK के उदाहरण अनुभाग में लूनरलैंडर परियोजना को देखें।


36
FYI करें ... एक भूतल दृश्य अब पारदर्शी हो सकता है: stackoverflow.com/questions/5391089/…
स्टीव

@ राल्फेलॉन: सरफान व्यूज से क्या मतलब है कि आप पारदर्शी नहीं हो सकते? क्या अन्य दृश्य भूतल दृश्य को ओवरलैप कर सकते हैं? उदाहरण के लिए, क्या मैं भूतल पर अस्थायी रूप से एक सूची दृश्य प्रदर्शित कर सकता हूं?
अश्विन

78

अद्यतन 05/09/2014

ठीक है। हमारे पास अब आधिकारिक दस्तावेज है। इसने उन सभी से बात की जिनका मैंने उल्लेख किया है, बेहतर तरीके से।


अधिक विस्तृत यहाँ पढ़ें ।

हां, मुख्य अंतर सतह दृश्य पृष्ठभूमि थ्रेड पर अद्यतन किया जा सकता है। हालांकि, वहाँ अधिक आप की देखभाल कर सकते हैं।

  • सतह दृश्य सतह बफर को समर्पित किया है, जबकि सभी दृश्य एक सतह बफर साझा करता है जो ViewRoot द्वारा आवंटित किया गया है। दूसरे शब्द में, सरफेस व्यू में अधिक संसाधनों का खर्च होता है।

  • सतह दृश्य हार्डवेयर को त्वरित नहीं किया जा सकता है (JB4.2 के रूप में), जबकि सामान्य दृश्य पर 95% ऑपरेशन खुले हुए ES का उपयोग करके त्वरित किया जाता है।

  • आपके कस्टमाइज्ड सरफेस व्यू को बनाने के लिए अधिक काम किया जाना चाहिए। आपको श्रोता को सतह पर जाने / नष्ट करने की आवश्यकता है, एक रेंडर थ्रेड बनाएं, अधिक महत्वपूर्ण बात, रेंडर थ्रेड और मुख्य थ्रेड को सिंक्रनाइज़ करें। हालाँकि, व्यू को कस्टमाइज़ करने के लिए, आपको केवल ओवरराइड करना होगाonDraw पद्धति की आवश्यकता है।

  • अपडेट करने का समय अलग है। सामान्य दृश्य अद्यतन तंत्र चौखटे द्वारा नियंत्रित या नियंत्रित होता है: आप view.invalidateयूआई थ्रेड में या view.postInvalidअन्य थ्रेड में कॉल करते हैं ताकि रूपरेखा को इंगित किया जा सके कि दृश्य अपडेट किया जाना चाहिए। हालाँकि, दृश्य तुरंत अपडेट नहीं किया जाएगा, लेकिन अगली VSYNC घटना के आने तक प्रतीक्षा करें। VSYNC को समझने का आसान तरीका यह माना जाता है कि यह एक टाइमर के रूप में है जो 60fps स्क्रीन के लिए प्रत्येक 16ms को फायर करता है। एंड्रॉइड में, सभी सामान्य दृश्य अपडेट (और वास्तव में प्रदर्शित करते हैं लेकिन मैं आज बात नहीं करूंगा), बेहतर चिकनीता प्राप्त करने के लिए वीएसवाईएनसी के साथ सिंक्रनाइज़ किया गया है। अब, सरफेस व्यू पर वापस, आप इसे अपनी इच्छानुसार कभी भी रेंडर कर सकते हैं। हालांकि, मैं शायद ही बता सकता हूं कि क्या यह एक फायदा है, क्योंकि डिस्प्ले वीएसवाईएनसी के साथ भी सिंक्रनाइज़ है, जैसा कि पहले कहा गया है।

2
आपके उत्तर से मुझे लगता है कि सर्फेस व्यू की तुलना में व्यू से प्राप्त क्लास का उपयोग करना बेहतर है। या मैं कुछ गलत हो रहा हूँ? यह 2 डी गेम डेवलपमेंट ट्यूटोरियल के बहुमत का विरोध होगा।
तूफान

2
@ ध्यान में रखने योग्य बात यह है कि सरफेस व्यू डिज़ाइन द्वारा UI थ्रेड को ब्लॉक नहीं किया जाना चाहिए जहां व्यू केवल UI थ्रेड द्वारा संशोधित किया जा सकता है। अधिकांश गेम के साथ, सरफेस व्यूज रेंडरिंग का एक अच्छा काम कर रहे हैं जो कि यूआई थ्रेड को एक साधारण दृश्य के साथ ब्लॉक करेगा। मेरी समझ से, सर्फेस व्यू का प्राथमिक लाभ है।
zgc7009

आप से क्या मतलब है एक धागा प्रस्तुत करना बनाने के । हमें इसे हर बार मैन्युअल रूप से बनाना होगा?
इगोरगानापोलस्की

44

मुख्य अंतर यह है कि SurfaceViewपृष्ठभूमि के आधार पर खींचा जा सकता है, लेकिन Viewsनहीं। SurfaceViewsजब तक आप उन्हें उपयोग नहीं करना चाहते, तब तक अधिक संसाधनों का उपयोग करें।


"वे अधिक संसाधनों का उपयोग करते हैं, हालांकि आप उन्हें तब तक उपयोग नहीं करना चाहते जब तक आपको नहीं करना है।" - कौन अधिक संसाधनों का उपयोग करता है? दृश्य या भूतलदृश्य?
Dror

6
सरफेसव्यू विचारों की तुलना में अधिक संसाधनों का उपयोग करता है
रितेश

1
@RiteshGune कितना?
एलेक्स सिफुंट्स

हमें कब करना है ?
इगोरगानापोलस्की

12

एक SurfaceViewयह है कि यह अंदर तैयार करने के लिए इस्तेमाल किया जा सकता एंड्रॉयड में एक कस्टम दृश्य है।

A Viewऔर a के बीच मुख्य अंतर SurfaceViewयह है कि इसमें एक View खींचा जाता है UI Thread, जिसका उपयोग सभी उपयोगकर्ता सहभागिता के लिए किया जाता है।

अगर आप UI को तेज़ी से अपडेट करना चाहते हैं और उसमें अच्छी मात्रा में जानकारी देना चाहते हैं, तो सरफेस व्यू एक बेहतर विकल्प है।

लेकिन कुछ तकनीकी जानकारी हैं SurfaceView:

1. वे हार्डवेयर त्वरित नहीं हैं।

2. सामान्य विचार तब प्रस्तुत किए जाते हैं जब आप विधियों को कॉल करते हैं invalidateया postInvalidate(), लेकिन इसका मतलब यह नहीं है कि दृश्य तुरंत अपडेट किया VSYNCजाएगा (ए भेजा जाएगा, और ओएस तब अपडेट हो जाता है जब यह अपडेट हो जाता है। SurfaceViewतुरंत अपडेट किया जा सकता है।

3. ए सर्फेस व्यू दिया गया है) एक आवंटित है surface buffer, इसलिए यह अधिक महंगा है


हार्डवेयर को त्वरित करना क्यों महत्वपूर्ण है ?
इगोरगानापोलस्की

8

सरफेसव्यू और व्यू के बीच एक मुख्य अंतर यह है कि एक सामान्य दृश्य के लिए स्क्रीन को रिफ्रेश करने के लिए हमें उसी विधि से अमान्य विधि को कॉल करना होता है जहां व्यू को परिभाषित किया जाता है। लेकिन अगर हम अमान्य कहते हैं, तो भी ताज़ा तुरंत नहीं होता है। यह VSYNC सिग्नल के अगले आगमन के बाद ही होता है। VSYNC सिग्नल एक कर्नेल जनरेट सिग्नल है जो हर 16.6 ms पर होता है या इसे 60 फ्रेम प्रति सेकंड के रूप में भी जाना जाता है। इसलिए यदि हम स्क्रीन के रिफ्रेशिंग पर अधिक नियंत्रण चाहते हैं (उदाहरण के लिए बहुत तेजी से बढ़ते एनीमेशन के लिए), तो हमें सामान्य व्यू क्लास का उपयोग नहीं करना चाहिए।

दूसरी ओर, सरफेसव्यू के मामले में, हम जितनी जल्दी चाहें स्क्रीन को रीफ्रेश कर सकते हैं और हम इसे बैकग्राउंड थ्रेड से कर सकते हैं। इसलिए सरफेसव्यू का रिफ्रेशिंग वास्तव में VSYNC पर निर्भर नहीं करता है, और यह बहुत उपयोगी है अगर हम हाई स्पीड एनीमेशन करना चाहते हैं। मेरे पास कुछ प्रशिक्षण वीडियो और उदाहरण एप्लिकेशन हैं जो इन सभी चीजों को अच्छी तरह से समझाते हैं। कृपया निम्नलिखित प्रशिक्षण वीडियो पर एक नज़र डालें।

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8


0

क्यों भूतल दृश्य का उपयोग करें और क्लासिक दृश्य वर्ग नहीं ...

एक मुख्य कारण है कि SurfaceView स्क्रीन को तेजी से प्रस्तुत कर सकता है।

सरल शब्दों में एक एसवी समय प्रबंधन और एनिमेशन प्रदान करने में अधिक सक्षम है।

एक बेहतर समझ के लिए एक सरफेस व्यू क्या है, हमें इसकी तुलना व्यू क्लास से करनी चाहिए।

क्या अंतर है ... इस सरल स्पष्टीकरण को वीडियो में देखें

https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30

वैसे व्यू के साथ हमारी एक बड़ी समस्या है .... एनिमेशन प्रदान करने का समय।

आम तौर पर onDraw () को एंड्रॉइड रन-टाइम सिस्टम से कहा जाता है।

इसलिए, जब एंड्रॉइड रन-टाइम सिस्टम ऑनड्रॉ () को कॉल करता है तो एप्लिकेशन कैंट कंट्रोल करता है

प्रदर्शन का समय, और यह एनीमेशन के लिए महत्वपूर्ण है। हमारे पास समय का अंतराल है

एप्लिकेशन (हमारे गेम) और एंड्रॉइड रन-टाइम सिस्टम के बीच।

SV इसे onDraw () एक समर्पित थ्रेड द्वारा कॉल कर सकते हैं।

इस प्रकार: अनुप्रयोग समय को नियंत्रित करता है। इसलिए हम एनीमेशन की अगली बिटमैप छवि प्रदर्शित कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.