XNA में रेंडरिंग मास टेरेन की कुशल विधि


10

मैं एक XNA गेम बना रहा हूं जिसमें खिलाड़ियों के लिए बहुत बड़ी जगह की आवश्यकता होती है। वर्तमान में, मेरे द्वारा उपयोग किया जा रहा परीक्षण ऊंचाई 4096x4096 है, और इसे 4-बिट बीएमपी के रूप में सहेजा जाता है।

मैं जो करने की कोशिश कर रहा हूं वह उस विशाल ऊंचाई की फ़ाइल है और इसे गेम में रेंडर करें। मैं जिस समस्या में चल रहा हूं वह यह है कि यह पूरे इलाके को एक बार में मेमोरी में लोड करने के लिए अक्षम है, क्योंकि यह उपलब्ध स्मृति के बहुमत का उपयोग करेगा।

एक और समस्या जो मैंने चलाई है, वह यह है कि मैं XNA के भीतर एक हार्ड-लिमिट सेट की वजह से इलाके को एक आदिम में प्रस्तुत नहीं कर सकता।

उस ने कहा, मैं कई समाधानों के साथ आया हूं, जिनमें से सभी को मैंने नीचे सूचीबद्ध किया है:

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

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

इसलिए मूल रूप से मैं एक्सएनए में बेहद सरलता के साथ विनम्र इलाकों को प्रस्तुत करने का एक सरल, सीधा तरीका पूछ रहा हूं।

मैं सामान्य रूप से खेल के विकास के लिए नया हूं, लेकिन अगर यह आशाजनक लगता है तो मैं अनुसंधान के लिए तैयार हूं।

अपडेट 1: जियोक्लिपमैपिंग विधि पर शोध करने के बाद, मैंने उसके साथ कोड करना शुरू कर दिया। मैंने सभी गणित किए हैं, और खेल चलता है। हालांकि, यह बेहद अक्षम है - जो शायद मेरी ओर से खराब कोडिंग है। यह 2FPS पर चलता है और मेरे CPU के पूरे कोर का उपयोग करता है। मैं कोड को आज़माने और सुधारने जा रहा हूं, लेकिन मुझे लगता है कि मुझे और अधिक सहायता की आवश्यकता होगी, इसलिए यहां टेरीफ़ायर प्रबंधक वर्ग के लिए कोड का एक पास्टबिन है । यदि मुझे कभी भी अधिक कुशल होने के लिए और अधिक परिणामों के साथ बाद में वापस पोस्ट करूँगा।


1
दिलचस्प बात यह है कि जिस तकनीक के बारे में आप बात कर रहे हैं, वह उसी तरह की है, जैसा आईडी सॉफ्टवेयर अपने आगामी गेम रेज में इस्तेमाल कर रहा है। वे एक 'मेगाटेक्स्ट्योर' का उपयोग करते हैं और फिर इसके उन हिस्सों को स्ट्रीम करते हैं जो GPU में आवश्यक होते हैं। उन्होंने इसके बारे में एक बात की है, लेकिन एक विकिपीडिया लेख की व्याख्या, यह प्रेरणादायक हो सकता है: en.wikipedia.org/wiki/MegaTexture

जवाबों:


5

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

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

अधिक उन्नत इलाके रेंडरर्स न केवल देखने योग्य ज्यामिति को ट्यून करने के लिए एक एल्गोरिथ्म का उपयोग करते हैं, बल्कि उस ज्यामिति का भी विस्तार करते हैं। Geomipmapping (और इसके सापेक्ष जियोक्लिपमैपिंग) इस समय के लिए अपेक्षाकृत लोकप्रिय है, लेकिन इसे लागू करने के लिए कोई मामूली बात नहीं है।

संपादित करें: यहां जियोक्लिपमैपिंग और फ्रुम कुलिंग दोनों का एक सभ्य वर्णन है।

मुझे कुछ संदेह भी है कि क्या ऊंचाई के लिए 4 बिट वास्तव में एक अच्छे दिखने वाले इलाके का उत्पादन करने के लिए पर्याप्त है जब तक कि आप परिणाम पर बहुत अधिक चौरसाई नहीं कर रहे हों।


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

3

GPU पर डेटा लोड करने के लिए प्रति-फ्रेम कार्य करने के लिए आपको जो भी दृष्टिकोण की आवश्यकता होती है, वह त्रुटिपूर्ण होने वाला है।

यहाँ एक दृष्टिकोण की एक अच्छी रूपरेखा है जिसे अच्छा प्रदर्शन करना चाहिए:

आपको अपने इलाके को (काफी बड़े) विखंडू में विभाजित करना चाहिए, उन विखंडू को निश्चित शीर्ष बफ़र्स में लोड करना चाहिए (आपके ऊंचाई-नक्शे की बिट-डेप्थ से कोई फर्क नहीं पड़ता!)। वे शीर्ष बफ़र्स केवल GPU मेमोरी में बैठेंगे, जो प्रदान किए जाने की प्रतीक्षा कर रहे हैं। आपको एक उपयुक्त चंक आकार के साथ प्रयोग करना होगा, लेकिन 128x128 शुरू करने के लिए एक अच्छी जगह है।

4096x4096 इलाके के लिए आप एक बार में GPU पर लोड करने में जो कुछ भी सहज हो जाएगा, उसकी सीमा से थोड़ा परे हैं - यह संभवतः कुछ सौ एमबी का डेटा है (हालांकि आप इसे ~ 64MB तक ले सकते हैं यदि आप चतुर)। इसलिए आपको पृष्ठभूमि में GPU से वर्टेक्स बफ़र्स को लोड और अनलोड करना पड़ सकता है।

(यदि आप विखंडू की पृष्ठभूमि लोडिंग को लागू करते हैं, तो यह अत्यंत स्केलेबल होना चाहिए!)

GPU पर आपके पास शीर्ष डेटा होने के बाद , यह एक उचित समय है जो प्रति-चंक आधार पर दृश्यता को कम करता है। यदि आपको पता है कि कैमरे के पीछे है, तो रंक को रेंडर करने के लिए कमांड भेजने की आवश्यकता नहीं है।

आपको CPU पर लगभग प्रति-त्रिभुज culling नहीं करना चाहिए !

GPU उन त्रिभुजों को बंद कर देगा जो ऑफ-स्क्रीन बहुत तेजी से हैं जितना आप कभी भी कर पाएंगे।

प्रदर्शन के बारे में अधिक जानकारी के लिए, गेम देव साइट पर इस उत्तर पर एक नज़र डालें ।


0

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


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