एक XNA 2D गेम का अनुकूलन


56

क्या यह समझ में आता है कि व्यूपोर्ट के बाहर की वस्तुओं को छोड़ना तर्क को लागू करना है या मुझे इसकी परवाह नहीं करनी चाहिए और फ्रेमवर्क को ऐसा करने देना चाहिए?

जवाबों:


79

पुलिंग एक प्रदर्शन अनुकूलन है। तो इसका मतलब यह नहीं है कि यह सिर्फ इसके लिए करना है। आपके पास एक कारण होना चाहिए।


GPU (एक्सएनए फ्रेमवर्क नहीं) त्रिभुज और पिक्सेल को अंधाधुंध तेज गति से खींचता है। आपके द्वारा सबमिट किए गए प्रत्येक त्रिकोण को (आपके शीर्ष shader के माध्यम से) बदलना होगा। फिर यह उन लोगों को हटा देता है जो स्क्रीन से उतर जाते हैं। फिर यह बचे हुए त्रिभुजों को भरता है, जो ऑफ-स्क्रीन होते हैं। शेष पिक्सेल फिर बैक बफर (आपके पिक्सेल shader के माध्यम से) के लिए तैयार हैं।

(जब मैं कहता हूं "तब" - यह वास्तव में एक व्यापक समानांतर पाइपलाइन में यह सब करता है।)

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


तो वहाँ आम तौर पर ज्यामिति ऑफ स्क्रीन होने के लिए बहुत कम या कोई लागत नहीं है।

लागत - विशेष रूप से "ऑब्जेक्ट्स" (आमतौर पर 3 डी ऑब्जेक्ट्स) को खींचने के संदर्भ में - वास्तव में उन वस्तुओं को पहले स्थान पर जीपीयू में जमा करना है । बहुत सी वस्तुएं जमा करें और आप अपनी बैच सीमा (आपको कुछ हजार * बैच प्रति फ्रेम मिलें) पर हिट करें ।

मैं इस उत्तर और इस लिंक किए गए स्लाइड डेक को बैचों के गहन विवरण में पढ़ने की सलाह देता हूं ।

इस वजह से, यदि आप फ्रम कलिंग को लागू करते हैं, तो आप जीपीयू को सबमिट करने वाले बैचों की संख्या कम कर सकते हैं। यदि आप बैच सीमित हैं - यह आपको सीमा के नीचे मिल सकता है।


अब - आपका प्रश्न 2D XNA के बारे में है - इसलिए संभवतः आप उपयोग कर रहे हैं SpriteBatchयह थोड़ा अलग है।

यह कोई गलती नहीं है कि इसे "स्प्राइट बैच " कहा जाता है । यह जो कर रहा है वह आपके द्वारा खींचे जाने वाले स्प्राइट्स को ले रहा है और सबसे अच्छा यह है कि आप उन स्प्राइट्स को GPU में कुछ बैचों में एक साथ बैच कर यथासंभव जमा कर सकते हैं।

लेकिन SpriteBatch एक नया बैच शुरू करने के लिए मजबूर किया जाएगा अगर:

  • आप एक ही बैच में फिट होने से ज्यादा स्प्राइट खींच सकते हैं (2048 एक्सएनए 4 में स्प्राइट)
  • आप बनावट बदलते हैं (यही वजह है कि एक तरह की बनावट है)

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

अब - यदि आप बैच सीमा पर ले जाने के लिए पर्याप्त बनावट-स्वैप के साथ ड्राइंग कर रहे हैं, और उनमें से बहुत से वास्तव में ऑफ-स्क्रीन हैं और उन्हें खींचना आपको बैच सीमा के तहत मिलेगा। फिर हाँ - कलिंग एक अनुकूलन है जो काम करेगा।

हालांकि - इस मामले में पीछा करने के लिए एक बेहतर अनुकूलन बनावट एटलस (उर्फ: स्प्राइट शीट) का उपयोग करना है। यह आपको बनावट-स्वैप और इसलिए बैचों की संख्या को कम करने की अनुमति देता है - चाहे स्क्रीन पर या बंद हो। (यह मुख्य कारण है कि आप अपने स्प्राइट्स के लिए एक स्रोत आयत निर्दिष्ट कर सकते हैं।)


(हमेशा की तरह: यह प्रदर्शन अनुकूलन पर सलाह है। इसलिए आपको अपने खेल के स्वयं के प्रदर्शन को मापना और समझना चाहिए, और अनुकूलन को जोड़ने पर खर्च करने से पहले आपको क्या सीमाएं मारनी चाहिए।)


5
+1 का उल्लेख केवल इसके लिए नहीं करने के बारे में करने के लिए, लेकिन जब यह प्रदर्शन के मामले के लिए आवश्यक हो।
विल मार्कोइलर

12
अंततः मुझे यह बताने के लिए कि स्प्राइट शीट वास्तव में प्रोग्रामर / डिज़ाइनर सुविधा के अलावा किसी अन्य के पास मौजूद है
Bill

3
महान विवरण के लिए +1, मैंने आपके उत्तर से बहुत कुछ सीखा है।
जेसी एमोंड

1
"बैच, बैच, बैच" पीडीएफ का लिंक टूट गया है। यहाँ एक अपडेट किया गया है: ce.u-sys.org/Veranstaltungen/…
मार्टन

13

MSDN पर मंचों पर एक पोस्ट के अनुसार, XNA फ्रेमवर्क कुंठित नहीं करता है:

XNA फ्रेमवर्क आपके लिए कोई कुंठित काम नहीं करेगा - क्योंकि यह वास्तव में खत्म हो जाएगा, जहां कोई सुराग नहीं है क्योंकि यह नहीं हो सकता है। सभी परिवर्तनों को GPU पर किया जाता है और एक कस्टम shader हो सकता है।

http://xboxforums.create.msdn.com/forums/p/22763/121897.aspx

यह पोस्ट आगे कहती है, कि यदि आपके दृश्य में बहुत सी वस्तुएं हैं, तो यह आपके स्वयं के रोल करने के लायक हो सकता है।


6
खासकर यदि आपके पास स्क्रॉलिंग मैप है (आपने कहा था कि यह 2D था, इसलिए यह प्रासंगिक हो सकता है)। यदि आप बड़े वर्गों की जरूरत नहीं है, तो यह सिर्फ एक बेकार है। यह बहुत मुश्किल नहीं है और आप किसी प्रकार का सुधार देख सकते हैं।
माइकल कोलमैन

1

मैं कुछ वर्षों से XNA में अब प्रक्रियात्मक स्वर तंत्र इंजन विकसित कर रहा हूं। अधिकांश फ़्रेमों में, इंजन शाब्दिक रूप से सैकड़ों हजारों क्वैड्स में बदल रहे हैं। मेरे प्रोफाइलिंग में, मैंने पाया है कि निराशा और रोना-धोना प्रदर्शन को बढ़ा देता है।

XNA HiDef प्रोफ़ाइल (रीच नहीं) में एक शामिलीकरण वर्ग है जिसका उपयोग ऑक्यूलेशन कॉलिंग करने के लिए किया जाता है। ऑक्यूलेशन कॉल्डिंग उन क्वैड्स को व्यूपोर्ट से हटा देती है जो दूसरे क्वाइड्स से व्यू से छिपे होते हैं।

कुछ और जिस पर आपको विचार करना चाहिए, पीढ़ी और मरोड़ दोनों को अलग-अलग कर रहा है।

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

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