2011-09-16 9 views
5

मैं विंडोज़ फोन 7 के लिए अपने एक्सएनए कोड के ड्रॉइंग भाग में एक प्रदर्शन समस्या खोज रहा हूं जो कभी-कभी कुछ सेकंड के बाद होता है। क्या कोई सर्वोत्तम अभ्यास है कि स्प्राइटबैच को कॉल करने के लिए कब/कब कॉल करें। कुछ खींचने के लिए बेगिन? इसे प्रत्येक स्प्राइट्स के लिए बुलाया जाना चाहिए (प्रत्येक वर्ग में जब यह खिलाड़ी, पृष्ठभूमि, पृष्ठभूमि ऑब्जेक्ट्स ... ...) खींचता है या शुरुआत में कॉलिंग करेगा -> सभी सबक्लास में सबकुछ खींचें - प्रदर्शन के लिए बेहतर हो?SpriteBatch.Begin() /। End() को कितनी बार कॉल करना है?

उत्तर

2

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

डिवाइस स्थिति में परिवर्तन अक्सर धीमे होते हैं और यदि आवश्यक हो तो आपको उन्हें रोकने से रोकना चाहिए, वे आपके द्वारा किए जा रहे कुछ भी हस्तक्षेप कर सकते हैं, इसलिए यदि आप स्प्राइटबैच में कुछ नहीं देना चाहते हैं तो आपको एंड() को कॉल करना चाहिए, लेकिन अगर आप sprites प्रतिपादन कर रहे हैं आप सभी sprites के लिए इसे एक बार कॉल करना चाहिए।

पिछले स्प्राइट पर दिखाई देने वाले राज्यों को संशोधित करने के लिए एंड() को कॉल करने से रोकने के लिए, आपको एंड() के बजाय फ्लश() को कॉल करना चाहिए। यह वर्तमान परिवर्तन और डिवाइस राज्यों के साथ कतारबद्ध sprites प्रस्तुत करता है, लेकिन राज्यों को बरकरार छोड़ देता है। फ्लैश() को कॉल करने के लिए एंड() फ़ंक्शन क्या होता है और आरंभ() द्वारा निर्धारित विशिष्ट राज्यों को रीसेट करना है।

2

प्रदर्शन की तरह सबसे अच्छी बात यह है कि प्रति ड्रा() में केवल एक बार कॉल/अंत को कॉल करना है, इससे एक ही समय में ग्राफिक्स कार्ड द्वारा संसाधित होने के लिए बैच में सभी स्प्राइट्स का कारण बनता है। यदि आपको आवश्यकता हो तो आपको केवल एकाधिक स्प्राइट बैचों का उपयोग करना चाहिए। जब आप की जरूरत हो सकती के उदाहरण हैं:

  • आप केवल कुछ स्प्राइट के लिए एक प्रभाव लागू करना चाहते हैं, लेकिन दूसरों को नहीं
  • आप स्क्रीनशॉट
  • तुम कुछ प्रभाव के साथ और अधिक जटिल क्या करना चाहते ले जाना चाहते हैं

क्या कोई भी एकाधिक स्प्राइट बैचों (प्रारंभ-> अंत) के लिए किसी अन्य कारण के बारे में सोच सकता है?

+0

शुरुआत के लिए ओवरलोड की सूची यहां है: http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.spritebatch.begin.aspx यदि आप यहां कुछ भी अलग करना चाहते हैं, तो एक कस्टम प्रभाव या एक अलग ट्रांसफॉर्म मैट्रिक्स में गुजरने के रूप में, आपको एक और कॉल करना होगा। –

+0

हाय, मैं एक विशिष्ट स्प्राइट पर छवि का स्क्रीनशॉट नहीं ले पा रहा हूं लेकिन एक अलग स्प्राइट पर स्क्रीनशॉट लेने में सक्षम था। कोई विचार, यह क्यों हो सकता है? – nagavamsikrishna

+0

@salsabear, यह एक नए प्रश्न के लिए सामग्री की तरह लगता है। यदि आप प्रश्न में कोड शामिल करते हैं, तो केवल प्रतिधारण भाग शामिल करना सुनिश्चित करें। –

संबंधित मुद्दे