खिलाड़ी द्वारा देखे गए ब्लॉक कैसे प्राप्त करें?


15

मैं Ogre इंजन का उपयोग करके एक Minecraft जैसा गेम लिख रहा हूं और मुझे एक समस्या है। मुझे अपने खेल का अनुकूलन करना चाहिए, क्योंकि जब मैं 10000 ब्लॉक खींचने की कोशिश करता हूं, तो मेरे पास 2 एफपीएस हैं ... इसलिए, मुझे यह विचार मिला कि ब्लॉक विमान का प्रदर्शन करते हैं और अदृश्य ब्लॉकों को छिपाने के लिए। लेकिन मुझे एक समस्या है - मुझे कैसे पता चलेगा कि एक समय में कौन से ब्लॉक खिलाड़ी को दिखाई देते हैं?

और - यदि आप इस तरह के खेल के लिए अन्य अनुकूलन विधियों के बारे में जानते हैं, तो ओग्रे में उन्हें क्या और कैसे उपयोग करना है, लिखें।

जवाबों:


16

ठीक है, ओग्रे पहले से ही फ्रिज़म कलिंग को लागू करता है (जो मूल रूप से कुछ भी नहीं खींचता है जो कैमरे से नहीं देखा जा सकता है) लेकिन मुझे लगता है कि आपकी समस्या एक अलग है।

आपको वास्तव में 10000 ब्लॉक प्रदर्शित नहीं करने चाहिए, जो आमतौर पर किया जाता है (या कम से कम, कुछ Ogre3d आधारित मिनीक्राफ्ट में क्लोन जैसे मैंने देखा है (जिनमें से मैं एक भी बना रहा हूं), और मूल में) एक जाल बना रहा है ( कुछ NxNxN क्षेत्रों का हिस्सा) जिसमें दिखाए गए क्यूब्स के बाहरी चेहरे हैं। यही है, जब आप 2 क्यूब्स को एक तरफ रखते हैं, तो 2 चेहरे को छूना नहीं देखा जा सकता है और इसलिए इसे खींचने की आवश्यकता नहीं है।

इन चेहरों को कुछ इस तरह से भी तैयार किया जाना चाहिए: http://www.ogre3d.org/tikiwiki/tiki-index.php?page=DynamicGrowingBuffers आधुनिक वीडियो कार्ड के रूप में 100000 बहुभुज में से एक जाल को पसंद करते हैं: 100 polygons के 1000 जाल।


10

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

आपके वास्तविक प्रश्न के रूप में, तीन प्रकार के रोड़ा हैं, जो कि वसंत को ध्यान में रखते हैं।

1) दृश्य फ्रुम के बाहर ब्लॉक। इसका मतलब है कि ब्लॉक जो आपके पीछे या दो तरफ हैं। ऑग्रे पहले से ही इनको फ्रुम कुल्लिंग के माध्यम से हटा देता है।

2) ब्लॉक जो 'भूमिगत' हैं या पूरी तरह से अन्य ब्लॉकों से घिरे हुए हैं ताकि वे कभी भी किसी भी कोण से दिखाई न दें। आप इन्हें पड़ोसी पड़ोसी ब्लॉक को देखकर पहचान सकते हैं। यदि वे सभी ठोस हैं तो आपका ब्लॉक छिपा हुआ है। GPU को कभी भी इन ब्लॉकों के बारे में नहीं सुनना चाहिए - जब आप जाल का निर्माण कर रहे होते हैं तो उन्हें छोड़ दिया जाना चाहिए जो आपकी सतह का प्रतिनिधित्व करते हैं।

3) ब्लॉक जो सतह पर होते हैं और स्तर के कुछ पदों से देखे जा सकते हैं, लेकिन जो वर्तमान में एक पहाड़ी (या कुछ) द्वारा छिपे हुए हैं। यह सबसे मुश्किल मामला है जिसे मैंने खुद से संबोधित नहीं किया है, लेकिन एक अच्छा मौका है कि इस मामले के लिए हार्डवेयर रोड़ा प्रश्नों का उपयोग किया जा सकता है।

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

http://www.thermite3d.org/

और यहाँ किसी और के प्रोजेक्ट का वीडियो है जो इसका उपयोग कर रहा है:

http://www.youtube.com/watch?v=Jju6WRPEK7o


4

आप बैकवर्ड कालिंग का उपयोग कर के वर्टिकल और उनके संबद्ध पिक्सेल को खींच सकते हैं जो खिलाड़ी का सामना नहीं करते हैं। बाकी की गहराई का ध्यान रखना चाहिए। 10k ब्लॉक वास्तव में बहुत नहीं है, मेरा 5770 1500k पर 100k verts रेंडर कर सकता है। मुझे लगता है कि आप कुछ और बहुत बुरी तरह से गलत कर रहे हैं।


मैं सहमत हूँ। यह संभवत: किसी और चीज के साथ समस्या है।
नोटाबिन

1

यदि आपके पास 10000 अलग-अलग ऑब्जेक्ट हैं, तो अड़चन संभवतः आदिम गणना है, न कि शीर्ष, बहुभुज, या भराव। गति के लिए उच्च बहुभुज वस्तुओं की छोटी संख्या में अपनी वस्तुओं को सेंकना।

Minecraft में क्यूब्स के ब्लॉक की अवधारणा है, लेकिन मैं इस समय संदर्भ नहीं ढूंढ सकता।

यहाँ विभिन्न तकनीकों के साथ टन के क्यूब खींचने पर मेरे प्रयोग भी हैं। बेकिंग (अभी तक) शामिल नहीं है।


0

मैं जो कुछ भी करता हूं, उसके बाद मैं अपने ब्लॉक की सरणी बनाता हूं, लेकिन इससे पहले कि मैं वर्टिकल बनाऊं, मैं एक उप-अद्यतन रन करता हूं जिसे UpdateBlockVibliblility कहा जाता है।

उप केवल पड़ोसियों को ब्लॉक में चेक करता है, और तदनुसार ब्लॉकव्यू फेसबुलियन बूलियन को अपडेट करता है।

#define BLOCKFACE_NORTH 0

#define BLOCKFACE_SOUTH 1 

etc etc etc

if(IsBlockAt(NorthOfBlock))
  Blocks[Whatever].facevisible[BLOCKFACE_NORTH] = false;

तब मैं केवल चेहरे के लिए कोने बनाता हूं अगर यह दिखाई देता है! सरल :)

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