Voxel फेस क्रॉलिंग (मेष सरलीकरण, संभवतः लालची का उपयोग करके)


9

संपादित करें: यह केवल मेरे स्वयं के सीखने के अनुभव के लिए है, यह प्रदर्शन कारणों से नहीं है कि मैं यह प्रश्न पूछूं।

यह एक Minecraft जैसे इलाके इंजन के संबंध में है। मैं विखंडू में खंडों (16x256x16 ब्लॉकों को एक चंक) में संग्रहीत करता हूं। जब मैं एक चंक उत्पन्न करता हूं, तो मैं इलाके और जगह की वस्तुओं को सेट करने के लिए कई प्रक्रियात्मक तकनीकों का उपयोग करता हूं। उत्पन्न करते समय, मैं पूर्ण चंक (ठोस या नहीं) के लिए एक 1D सरणी और ठोस ब्लॉकों का एक अलग 1D सरणी रखता हूं।

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

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

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

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

तो, मेरा सवाल: वर्णित के रूप में चेहरे का विलय करने के लिए (यह देखते हुए कि क्या यह गतिशील इलाके / प्रकाश व्यवस्था के लिए एक बुरा विचार है), वहाँ शायद एक एल्गोरिथ्म है जो लागू करने के लिए सरल है? मैं भी बहुत खुशी से एक उत्तर को स्वीकार करता हूं जो बहुत सरल तरीके से (एक लिंक या स्पष्टीकरण) में लालची एल्गोरिथ्म के माध्यम से मुझे चलता है।

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

पुनश्च: मैं पहले से ही चंक प्रति कुंठित करता हूं और जैसा कि वर्णित किया गया है, मैं भी ठोस ब्लॉकों के बीच चेहरे को ढंकता हूं। मैं अभी तक अशक्त नहीं है और कभी नहीं हो सकता।

* संपादित करें: मैंने अपनी छोटी तकनीक को लागू किया है, जिसमें शायद एक नाम है, लेकिन मैं अपनी 6 सूचियों के माध्यम से जाता हूं, जो कि वे कुल्हाड़ियों द्वारा छांटे जाते हैं, जिन पर वे आराम करते हैं, इसके बाद ब्लॉक प्रकार, और फिर प्रकाश स्तर द्वारा। मैं उनके माध्यम से पुनरावृत्ति करता हूं, जैसा कि मैं जाता हूं, नई आयतें बनाता हूं और उन्हें एक साथ विकसित करता हूं (एक निश्चित अक्ष की ओर एक भारी पूर्वाग्रह के साथ)। यह निश्चित रूप से इष्टतम नहीं है, लेकिन यह वास्तव में काफी तेज है और यह औसतन 50% के करीब मेरी शीर्ष गणना को कम करता है। Byte56 की टिप्पणी एक कोठरी है जो मैं एक वास्तविक उत्तर के बारे में सोचता हूं, लेकिन मैं उस उत्तर / इनाम के लिए चयन नहीं कर सकता।

यहाँ मेरा तेज़ और सरल तरीका है जो मैं इस समस्या को संभाल रहा हूँ किसी भी अनुकूलन के बिना पूर्ण प्रारंभिक इलाके का निर्माण। दिए गए सभी चौकों को एक ही छवि, प्रकाश स्तर, सामान्य, आदि मानते हैं। प्रत्येक रंग एक अलग क्वाड है जिसे मैं प्रस्तुत करता हूं। मेरी सूचियों के साथ वे जिस तरह से हैं, यह एक बहुत आसान / तेज़ तरीका है।


आपके सभी अनुकूलन के बाद, आप अभी भी प्रदर्शन के मुद्दों में भाग रहे हैं? क्या आपने कोड को यह देखने की कोशिश की है कि मुद्दे कहां हैं?
MichaelHouse

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

मुझे ऐसा लगता है कि मुझे यह भी कहना चाहिए कि अगर मुझे वास्तव में इसके साथ एक उचित खेल का प्रयास करने के लिए मिलता है, तो मैं चाहता हूं कि दृश्यमान दुनिया बड़ी हो। मैं नहीं चाहूंगा कि चरित्र 2 ब्लॉक ऊँचा और 1 ब्लॉक चौड़ा हो जैसे कि Minecraft और कई अन्य, लेकिन अधिक जैसे 3 ब्लॉक चौड़ा / लंबा और 6-9 उच्च। शायद स्थिर इलाक़ा।
मिथक १४

1
आह, ठीक है टिम। स्पष्टीकरण के लिए धन्यवाद। मैंने इस पर कुछ शोध किया जब मैं अपने खेल के लिए इंजन बना रहा था। चूंकि मेरा परिदृश्य गतिशील है, मुझे नहीं लगता था कि हर बार कुछ बदले जाने के बाद यह प्रदर्शन लागत के लायक होगा। हालाँकि, आप इस लेख से अधिकतम आयत समस्या के बारे में कुछ उपयोग पा सकते हैं । अनिवार्य रूप से यह एल्गोरिथ्म है जिसके बारे में आप समान चेहरे (शायद लालची नहीं, लेकिन इष्टतम) के विलय के बारे में बात कर रहे हैं। सौभाग्य!
MichaelHouse

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

जवाबों:


4

आप केवल स्ट्रिप्स करना चाहते हैं, या बहुत ही बेहतरीन, आयतों पर। अन्य आकार नहीं हैं जो आपके लिए हल करने योग्य या उपयोगी होंगे।

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

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

यदि आप एकल चंक के साथ प्रदर्शन समस्याएँ हैं, तो मुझे लगता है कि कुछ और गलत है।

मेरा पहला अनुमान यह होगा कि आप ड्रॉ ऑपरेशन के तरीके को अक्सर कहते हैं। आप केवल हार्डवेयर के आधार पर ग्राफिक्स कार्ड को प्रति सेकंड 50 से 400 ~ के बीच खींचने के लिए कह सकते हैं। या तो .setData या। ____ के लिए कितने कॉल करें।


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

मेरे पास प्रदर्शन के मुद्दे नहीं हैं। मुझे बस इन चीजों को सीखने में मजा आता है। मैं यह कहने के लिए अपने प्रश्न को संपादित करूंगा, लेकिन जैसा कि मैंने बाइट 56 को भी बताया था, मुझे कम मदद मिलती है अगर मैं जो करने की कोशिश कर रहा हूं वह वास्तव में एक समस्या का समाधान नहीं है। आपके प्रश्न का उत्तर देने के लिए, मैं वर्तमान में प्रति फ्रेम में 200-260 चंक्स प्रदान करता हूं। यह एक बहुत ही सामान्य 500ish DrawIndexedPrimatics प्रति फ्रेम है। मैं नियमित रूप से 100-130 FPS बिना vsync के प्राप्त करता हूं, जिससे प्रति सेकंड 65,000 कॉल होती हैं। मैं असभ्य होने की कोशिश नहीं कर रहा हूं, लेकिन थोड़ा आपने कहा कि मेरे लिए समझ में आता है। मुझे समझ में नहीं आ रहा है, इसलिए कृपया विस्तार से बताएं कि क्या मुझे गलत समझा गया। शायद यह XNA के साथ क्या करना है?
मैथिक्स

आह, क्षमा करें, मेरा मतलब प्रति फ्रेम था, प्रति सेकंड नहीं। आप वहां ऊपरी सीमा के करीब पहुंच रहे हैं, और यदि आप केवल इलाके पर हैं, तो आप बहुत अधिक रन आउट हैं।
फिल

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

मुझे वह लेख ढूंढना होगा जिसे मैंने पढ़ा है कि एक सीमा के रूप में 400-500 उद्धृत किया गया है। एक त्वरित Google ने मेरी मदद नहीं की।
फिल

0

वह लेख जिसे आप लिंक करते हैं वह वास्तव में मेष उत्पन्न करने के लिए एक एल्गोरिथ्म नहीं देता है; यह संभावित समाधानों का मूल्यांकन करने का एक तरीका बताता है।

आम तौर पर, हालांकि, लेख एक अच्छा सारांश देता है: 1) भोला समाधान बुरा है, 2) एक इष्टतम समाधान है, लेकिन यह लिखने के लिए और चलाने के लिए समय लेने वाला, दोनों होगा, 3) एक त्वरित पुलिंग बहुत बेहतर परिणाम देता है ( और यह सब Minecraft ही करता है), और अंत में 4) एक होशियार समाधान (लालची एल्गोरिथ्म) हो सकता है।

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

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

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