स्वैपिंग प्रभाव की व्यावहारिक लागत


16

मैं अपनी परियोजनाओं के लिए XNA का उपयोग करता हूं और उन मंचों पर मैं कभी-कभी इस तथ्य के संदर्भ में देखता हूं कि जाल के लिए एक प्रभाव की अदला-बदली की लागत अपेक्षाकृत अधिक है, जो मुझे आश्चर्यचकित करती है क्योंकि मैंने सोचा था कि एक प्रभाव को बदलने के लिए बस प्रतिस्थापन shader कार्यक्रम की नकल करने का मामला था उपयुक्त मापदंडों के साथ GPU के लिए।

मैंने सोचा कि अगर कोई इस प्रक्रिया के बारे में महंगा क्या समझा सकता है? और अगर संभव हो तो 'अपेक्षाकृत' संदर्भ में कहें?

उदाहरण के लिए, मैं पिकिंग में मदद करने के लिए एक छोटे शेडर का उपयोग करना चाहता था, मैं करूँगा:

  1. हर वस्तु पर प्रभाव को बदलें, इसे पहचानने के लिए एक अद्वितीय रंग को शांत करना और इसे छायादार को प्रदान करना।
  2. सभी ऑब्जेक्ट्स को मेमोरी में रेंडर टारगेट पर ड्रा करें।
  3. लक्ष्य से रंग प्राप्त करें और चयनित ऑब्जेक्ट को देखने के लिए इसका उपयोग करें।

उस प्रक्रिया को पूरा करने में लगने वाले कुल समय के किस हिस्से को शेड को स्वैप करने में खर्च किया जाएगा? मेरी वृत्ति कहेगी कि दृश्य को फिर से प्रस्तुत करना, चाहे वह कितना भी सरल क्यों न हो, प्रक्रिया के किसी अन्य भाग की तुलना में परिमाण को धीमा करने का एक क्रम होगा, इसलिए सभी प्रभाव पर चिंता क्यों?

जवाबों:


21

आप जिस समस्या का वर्णन कर रहे हैं, वह "विशेष" समस्या नहीं है। GPU पर प्रभाव बदलने के बारे में कुछ भी विशेष रूप से धीमा नहीं है। बदलते प्रभाव, प्रभाव मापदंडों (परिवर्तनों सहित), बनावट, विभिन्न रेंडर स्टेट्स और बस कई ड्रा कमांड भेजने की समस्या यह है कि यह आवश्यक है कि एक और बैच जीपीयू में भेजा जाना चाहिए

बैच सीपीयू- इनबाउंड हैं और आपको केवल कुछ हजार * प्रति फ्रेम मिलते हैं का उपयोग करने के लिए मिलता है।

यह सीपीयू पर निर्भर करता है और आप क्या काम कर रहे हैं, लेकिन मान लीजिए कि आपको प्रति फ्रेम लगभग 1000 बैच मिलते हैं। यदि आप प्रति बैच एक वस्तु प्रदान कर रहे हैं, तो आप समस्याओं को हिट करने से पहले स्क्रीन पर लगभग 1000 ऑब्जेक्ट आकर्षित कर सकते हैं।

यदि आप अचानक पिकिंग जोड़ते हैं, और आपको अपनी सभी वस्तुओं को दो बार प्रस्तुत करना पड़ता है, तो आप केवल 500 वस्तुओं को आकर्षित करने तक सीमित हैं।

(इसलिए यदि आपको केवल एक छोटी संख्या में वस्तुएं मिली हैं, तो इसके बारे में चिंता न करें!)

आपके द्वारा उपयोग किए जा रहे बैचों की संख्या को कम करने के लिए, आपको मूल रूप से इसके बारे में "चतुर होना" होगा। ऐसा करने के लिए प्रोटोटाइप विधि कई वस्तुओं को चतुराई से एक ही बैच में संयोजित करना है। विशेष रूप से, " इंस्टेंसिंग " देखें। शायद आप अपने shader के भीतर प्रत्येक ऑब्जेक्ट को एक अनूठा रंग असाइन करने के लिए इंस्टेंस नंबर का उपयोग कर सकते हैं।

एक और तकनीक, चुनने के लिए विशेष रूप से उपयुक्त है, करने के लिए है चुनना ताकि आप कुछ भी आप जानते हैं कि आपके उठाया पिक्सेल को छू नहीं है प्रतिपादन नहीं कर रहे हैं सॉफ्टवेयर में प्रदान की गई वस्तुओं।

यहाँ एनवीडिया से "बैच, बैच, बैच: क्या वास्तव में क्या मतलब है?" शीर्षक से पूरी प्रस्तुति स्लाइड डेक है। (पीडीएफ) जिसमें अच्छे रेखांकन और सामान हैं जो इसे समझाते हैं। यह आपके बैच की गिनती को कम करने के लिए कुछ तकनीकों को भी सूचीबद्ध करता है।


माना! आपको समझाने और सुझावों के लिए धन्यवाद, जो मैंने पढ़ा है वह बहुत अधिक समझ में आता है। NVidia प्रस्तुति के लिए भी धन्यवाद, अभी इसे पढ़ने और इसके बहुत उपयोगी im।
sebf

1
"बैच, बैच, बैच" पेपर के अपडेटेड लिंक: ce.u-sys.org/Veranstaltungen/…
मार्टन

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