कैसे Minecraft की तरह एक ब्लॉक वर्ल्ड को संभालने के लिए


9

मैं Minecraft की तरह एक ब्लॉक दुनिया के साथ एक सरल खेल लिखना चाहता हूं। मेरा सैद्धांतिक सवाल यह है कि खेलने के दौरान इस ब्लॉक informations को संभालने का सबसे अच्छा तरीका क्या है। मेरा पहला आइडिया एक बहुत बड़ा व्यू था लेकिन इससे मुझे लगता है कि मेमोरी खत्म हो जाएगी। हो सकता है कि मुझे खिलाड़ी के पास केवल ब्लॉक्स लोड करने हों।

मैं एक फ़ाइल से आवश्यक ब्लॉक informations को लोड करने और स्मृति में केवल आवश्यक लोगों की होल्डिंग कैसे संभाल सकता हूं?


2
Minecraft काफी बड़े क्यूब्स में दुनिया को लोड करता है जिसे चंक्स कहा जाता है, बिल्कुल भी नहीं। मुझे सटीक विवरणों पर यकीन नहीं है। Minecraft स्रोत को पकड़ना बहुत आसान है यदि आप चाहते हैं कि यह कैसे हुआ है पर एक नज़र रखना है।
चूहाबन्द

मिनीक्राफ्ट विकी पर नज़र डालें: minecraftwiki.net/wiki/Chunk
टॉम वैन ग्रीन

मैं पहले से ही Minecraft में विखंडू के बारे में जानता था, लेकिन वैसे भी धन्यवाद।
डनिज़ार

यह एक जटिल प्रश्न है जो इस ब्लॉग के दायरे के लिए उचित नहीं है।

जवाबों:


9

Minecraft जैसे ब्लॉक वाले गेम के लिए डेटा स्टोर करने के लिए कुछ अलग तरीके हैं।

जिस तरह से मेरा मानना ​​है कि Minecraft करता है वह दुनिया को 16x16x256 चंक्स में तोड़ देता है। जब खिलाड़ी खेल शुरू करता है, तो खिलाड़ी के चारों ओर के टुकड़े को स्मृति में लोड किया जाता है, फिर जब आप घूमते हैं तो एक पृष्ठभूमि थ्रेड अधिक लोड होता है। : यहाँ है कि पता चलता है यह एक वीडियो है http://www.youtube.com/watch?v=oR_ZdJH9eho

इसे करने का एक और तरीका है कि दुनिया को ऑक्ट्री में तोड़ दिया जाए। माइकल गुडफेलो ने इस डेटा संरचना के साथ घन दुनिया को लागू करने के बारे में एक ब्लॉग लिखा था: http://www.sea-of-memes.com/LetsCode1/LetsCode1.html । ऑक्ट्री अच्छा है क्योंकि यह आपको कुछ कम्प्रेशन में निर्मित करता है, लेकिन यह संभवत: तब एरे के साथ काम करने के लिए थोड़ा कठिन होगा।

रखने के बारे में "केवल स्मृति में लोगों की जरूरत है?" यह थोड़ा कठिन है क्योंकि आपको पूछना है कि "क्या जरूरत है"। यदि आपके पास एनपीसी है जो एआई के साथ दुनिया के दूसरे हिस्से में रहता है जो पर्यावरण के साथ बातचीत करता है तो आपको स्मृति में रहने के लिए दुनिया की बहुत अधिक आवश्यकता है। Voxel वर्ल्ड डेटा बहुत तेज़ी से मिल सकता है, इसलिए मेमोरी में कम से कम संभव राशि रखने की कोशिश करना सबसे अच्छा है। (आईई, केवल खिलाड़ी के पास एनपीसी है)।

ग्राफिक्स इंजन को प्रत्येक गैर-पारदर्शी ब्लॉकों से पूरी तरह से घिरे हर ब्लॉक की "आवश्यकता" होगी। दुनिया को प्रस्तुत करने का सामान्य तरीका एक एकल जाल का निर्माण करना है जिसमें हर दृश्य ब्लॉक के लिए कोने शामिल हैं। यह आकर्षित करने के लिए बहुत तेज़ है क्योंकि आप केवल 65,536 ब्लॉकों के लिए ड्रॉ के तरीकों के लिए 1 कॉल कर रहे हैं (Minecraft आकार के विखंडू में)। चूंकि ग्राफिक्स इंजन को इस जाल को बनाने की आवश्यकता होगी, इसलिए इसे आम तौर पर सभी क्यूब्स को एक चंक में जानना होगा। ध्यान दें कि यही कारण है कि जब आप Minecraft में फर्श के माध्यम से देखते हैं, तो बहुत सारी दुनिया अदृश्य है। इसका कारण यह है कि हर ब्लॉक जो सभी छह तरफ से घिरा हुआ है, को छोड़ दिया जाता है। मेरा मानना ​​है कि Minecraft बनावट के दोहराव के साथ एक ही तरह की बनावट के क्षैतिज पक्षों को जोड़कर कोने की संख्या को कम कर देता है।

मेरी सलाह के लिए 16x16x256 विखंडू के साथ जाना होगा। मेष और गेम लॉजिक (टकराव का पता लगाने, ब्लॉकों को जोड़ने / हटाने) के कारण आपको तेज पुनरावृत्ति और संपादन की आवश्यकता होगी, क्योंकि उन्हें एक सरणी में संग्रहीत करें। फिर जितना हो सके खिलाड़ी के चारों ओर एक सर्कल में उतने चनों को लोड करें। बेहतर या बदतर कंप्यूटरों के लिए ऊपर या नीचे चंक की संख्या को स्केल करें।

चंक्स की लोडिंग प्रदर्शन पर एक बड़ी हिट होगी, इसलिए इसे एक थ्रेड में रखें जो इसे समय के साथ चलाता है। इसे बनाओ ताकि आप उस समय के दौरान एक नए खिलाड़ी को 3 नए चूजों को पूरी तरह से लोड कर सकें, यह एक खिलाड़ी को एक छोर से दूसरे छोर तक चलने के लिए लेता है।


धन्यवाद! एआई के बारे में कुछ भी नहीं है क्योंकि मैं एक ग्राहक को एक MMO के लिए लिख रहा हूं। एनपीसी की गणना सर्वर द्वारा की जाती है। एक जोड़: "प्रत्येक ब्लॉक पूरी तरह से अन्य गैर-पारदर्शी ब्लॉकों से घिरा नहीं है" ग्राफिक्स इंजन द्वारा आवश्यक है। यदि गुफाएँ हैं तो खिलाड़ी यह नहीं देख सकता कि वे महत्वहीन हैं। ;-)
डनिज़ार

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

3

मेरे पास इसे समझाने का सबसे अच्छा तरीका नहीं है, लेकिन मैं कोशिश करूंगा।

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

मूल रूप से एक voxel एक 3D आकार है जिसमें गतिशील रूप से परिवर्तित वॉल्यूम हो सकता है और जब वॉल्यूम बदलता है, तो आकार करता है। एक चंक एक्स एक्स बाय एक्स द्वारा एक स्वर है। तो उदाहरण के लिए, आपके पास एक चंक हो सकता है जिसमें 16x16x16 वोक्सल्स होते हैं और फिर आपके पास एक्स संख्या में चंक हो सकते हैं। आपके पास एक डिस्टेंस सेट होगा, कि अगर खिलाड़ी किसी भी चंक से एन से अधिक दूर है, तो उन्हें अपनी गणना में शामिल न करें। यह कतरन दूरी के समान है, लेकिन साथ ही साथ प्रत्येक ठिकाने पर भी लगाना होगा। इस तरह, आपके पास यह हो सकता है ताकि आप हमेशा अपने खिलाड़ी को चंक के केंद्र में कह सकें, 3x3 चंक्स का सेट।

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

तो अब सब कुछ के एक विशाल सरणी के बजाय, आपके पास किसी भी समय 9 चंक्स की एक सरणी होगी और चंक क्लास में, आपके पास 4096 स्वर की एक सरणी होगी।

कृपया ध्यान दें कि यह एक बहुत ही सरल व्याख्या है। मैं वर्तमान में voxels का उपयोग कर कुछ पर काम कर रहा हूँ तो मुझे लगा कि मैं अपने इनपुट में फेंक दूंगा = -)

स्वरों पर कुछ और जानकारी के लिए, http://en.wikipedia.org/wiki/Marching_cubes देखें


3
मार्चिंग क्यूब्स दृश्य स्वरों के बारे में है। और Minecraft भी इसका उपयोग नहीं करता है; यह सिर्फ क्यूब्स को खींचता है, जो बिल्कुल मार्चिंग क्यूब्स के बारे में नहीं है
निकोल बोलस

आपके व्याख्या के लिये धन्यवाद! मैंने पहले कभी वोक्सल्स के बारे में नहीं सुना और यह मेरे प्रोजेक्ट के लिए बहुत महत्वपूर्ण है। लेकिन मेरे पास अब एक सवाल बचा है।
डनिज़ार

मैं समझता हूं कि पास में विखंडू का एक सरणी बनाना है जहां प्रत्येक तत्व में इस चंक के स्वर की एक सरणी होती है। लेकिन तब मुझे चंक सरणी बदलने की ज़रूरत होती है जब खिलाड़ी दुनिया में घूमता है। क्या मुझे सेव फाइल से जरूरी चंक्स पढ़ने हैं? या उन्हें याद रखने का एक अच्छा तरीका है?
डनिजर

2
@danijar बस कुछ सामान्य ज्ञान, पिक्सेल "पिक्चर एलिमेंट" के लिए कम है, "वॉल्यूम एलिमेंट" से उसी तरह voxel बनता है। ऐसा नहीं है कि यह किसी भी चीज के लिए मायने रखता है, लेकिन जब से आपने मेरे बारे में सोचा था कि इससे पहले कि यह आपके लिए कुछ रुचि का हो सकता है, तब तक शब्द स्वर नहीं सुना था।
डैनियल कार्लसन

1

आप केवल दृश्यमान सतहों को प्रस्तुत करने का प्रयास कर सकते हैं, कंप्यूटर पृष्ठभूमि में डेटा को संभालता है, जबकि रेंडरर केवल आपके द्वारा देखे जाने के साथ काम करता है। 8x8 चूजों को संभालना आसान होगा।

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