लाभ खोए बिना ज्यामिति / जाल को जोड़ना


11

तीन.js में हम आकर्षित कॉल की मात्रा को सीमित करने के लिए ज्यामिति को मर्ज कर सकते हैं और इस प्रकार प्रदर्शन बढ़ा सकते हैं। एक सामग्री के साथ एक सरल परीक्षण में, मैं अपने GTX660 GPU पर 50.000 क्यूब्स + छाया @ 60fps आकर्षित कर सकता हूं। ज्यामिति विलय के बिना, 5.000 क्यूब्स पहले से ही एक समस्या का कारण बने।

मुझे आश्चर्य है कि प्रत्येक घन जाल के प्रतिपादन के लाभों को कैसे संरक्षित किया जाए। उदाहरण के लिए, जब एक ज्यामिति में सब कुछ विलय हो जाता है तो घन जाल कैसे चुनें? डिफ़ॉल्ट रूप से यह निश्चित रूप से संभव नहीं है।

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

मैं संक्षेप में क्या करना चाहता हूं

  • सीखने के उद्देश्यों के लिए खेल की तरह SimCity
  • प्रत्येक घर एक घन जाल है
  • 50.000 घरों को रेंडर करना चाहते हैं और घरों को जोड़ने और हटाने में सक्षम हैं
  • माउस-कर्सर (उठा) के माध्यम से घर का चयन संभव होना चाहिए

मुझे यकीन नहीं है कि यह आपके लिए उपयोग का है, लेकिन मैं इसे पूर्णता के लिए उल्लेख करता हूं। सिम्पलोगन के पास इंडी डेवलपर्स के लिए एक रॉयल्टी आधारित मूल्य निर्धारण मॉडल है और डिजाइन समय पर इस जाल विलय और विभाजन का एक बहुत कुछ कर सकता है।
स्टिवेवेट

जवाबों:


11

ठीक है मैंने समझ लिया। पूरे ज्यामिति को एक साथ विलय करने के बाद, मेरे पास अभी भी एक सरणी में अलग-अलग मेष हैं। इसलिए मैं बस इन जालों का उपयोग रेकास्टिंग के लिए कर सकता हूं, भले ही उनका प्रतिपादन भी नहीं किया गया हो। इसे महसूस करने में मुझे थोड़ा समय लगा।

यहाँ छवि विवरण दर्ज करें

पिकिंग के लिए मैं इस ऑक्ट्री कार्यान्वयन का उपयोग करता हूं: http://threejs.org/examples/#webgl_octree.raying

यह प्रति चौराहा परीक्षणों को प्रति अपडेट 50.000 से ~ 500 तक नीचे लाता है। ऑक्ट्री के बिना एफपीएस में भारी कमी आएगी।

आप जो नारंगी उठा हुआ हल देख रहे हैं, वह वास्तव में अब बदला हुआ जाल (+1 ड्रॉ कॉल) है जिसमें एक परिवर्तित सामग्री और संशोधित आकार है।

यहाँ छवि विवरण दर्ज करें

इसलिए मुझे लगता है कि अगला कदम किसी प्रकार के मानचित्र विभाजन को लागू करना है। यही है, मर्ज किए गए ज्यामिति को कई टुकड़ों में तोड़ दें। इसका कारण यह है कि मर्ज किए गए ज्यामिति में बड़ी मात्रा में कोने हैं। इसका मतलब है कि अगर मैं मानचित्र को 99% ऑफ स्क्रीन पर स्थानांतरित करता हूं, तो ग्राफिक्स कार्ड को अभी भी सभी लंबों को संसाधित करना होगा क्योंकि ज्यामिति अभी भी देखने में है, कम से कम 1%। तो अगर यह टूट गया है, केवल टुकड़ों को देखने के लिए प्रदान किया जाना है।


इस अंतर्दृष्टि के लिए बहुत बहुत धन्यवाद। मैं यह करने के लिए एक रास्ता खोजने की कोशिश कर रहा हूँ, और मुझे लगता है कि यहाँ आपका समाधान सबसे उत्कृष्ट है! हालांकि क्विक क्वेश्चन: आपकी स्थानीय सूची ऑब्जेक्ट्स (यानी थ्री ऑबजेक्ट 3 डी के) के लिए, रेकरस्टर.इंटरसेक्टऑब्जेक्ट्स () को काम करने के लिए किस तरह के गुणों की आवश्यकता है?
एल्विनफ्रोमिडियापर

बहुत अच्छी तरह से किया।
ClassicThunder

मेरे पास एक समान समस्या है, लेकिन किसी तरह r70 के साथ रीकास्टिंग काम नहीं मिल सकता है। बक्से बनाते और विलय करते समय क्या आपने कुछ खास किया? नोड्स बनाने और विलय करने के लिए मैं निम्नलिखित कोड ( pastebin.com/PStaAF3P ) का उपयोग करता हूं , लेकिन शायद रेकास्टर को काम करने के लिए कुछ याद आ रहा है?
fhahn

त्वरित प्रश्न: मैं आपके साथ बहुत कुछ कर रहा हूं (जियोजन डेटा पर आधारित एक 3 डी मानचित्र)। अपनी विधि के साथ, जब भी आप कैमरा घुमाते हैं तो क्या आपको पहले से मौजूद बिल्डिंग मेश को भी घुमाने की जरूरत है? या आप सिर्फ दृश्य में अलग-अलग बॉक्स जोड़ते हैं लेकिन उन्हें प्रस्तुत नहीं करते हैं?
स्पेंसर

@Spencer को घुमाने की जरूरत नहीं है। मैं वैश्विक बॉक्स में अलग-अलग बॉक्स रखता हूं और केवल दृश्य में विलय की गई ज्यामिति जोड़ता हूं। फिर आप वैश्विक सरणी में ऑब्जेक्ट के साथ रेकास्टिंग कर सकते हैं, क्योंकि रेकास्टर कैमरा मैट्रिक्स और प्रत्येक बॉक्स स्थिति पर निर्भर करता है। सबसे अच्छा तरीका नहीं है, यह मेरे लिए अवधारणा का सबूत था। इस बिंदु पर अब कोई तीन। Js नहीं कर रहा है।
user990827

1

चुनने के लिए आप प्रत्येक क्यूब के लिए आईडी को एक और रेंडर लक्ष्य के लिए भी प्रस्तुत कर सकते हैं और सिर्फ यह जांच सकते हैं कि कर्सर पर आईडी मूल्य क्या है। लाभ यह है कि पिकिंग एकदम सही है और अधिक जटिल ज्यामिति के लिए भी कुशलता से काम करता है।

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


0

मुझे तीन.जे के विवरणों के बारे में निश्चित नहीं है, लेकिन दो संभावित प्रदर्शन हॉग सामान्य ओपनगेल में ध्यान में रखते हैं:

  1. क्या आपने इंस्टेंस पर विचार किया है? आपको केवल एक ड्रॉ कॉल की आवश्यकता होगी और कम वीआरएएम का उपयोग करें।
  2. क्या आपने पिकिंग एल्गोरिदम पर एक गंभीर नज़र डाली है? यदि आपके क्यूब्स में उदाहरण के लिए एक पेड़ के बजाय एक सूची में बाउंडिंग वॉल्यूम हैं जो उस परिमाण के अंतर को स्पष्ट करेगा।

0

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

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