एक प्रक्रियात्मक दुनिया को कैसे बचाता है?


17

मैंने हाल ही में प्रक्रियात्मक दुनिया बनाने के बारे में पढ़ा है ... लेकिन मैं एक को कैसे बचा सकता हूं?

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

जवाबों:


21

उस बीज को बचाएं जिसे आपने दुनिया को उत्पन्न करने के लिए इस्तेमाल किया था, और या तो परमाणु "कमांड" या उन के परिणामों के रूप में संशोधन।

फिर सहेजे गए गेम को लोड करते समय, आप निम्न कार्य करते हैं:

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

अपडेट: और, निश्चित रूप से, आपकी सामान्य दुनिया की तरह ही संचित दुनिया को बचाने का विकल्प है, यदि संसाधन उपलब्ध हैं (जैसा कि Minnraft में देखा गया है)। इस मामले में, आपको दुनिया के केवल उन हिस्सों को सहेजना चाहिए जो पहले से ही दौरा कर चुके हैं (अन्यथा प्रक्रियात्मक पीढ़ी बहुत अधिक व्यर्थ होगी), टाइल द्वारा टाइल। यह अधिक HDD और / या डेटाबेस संसाधनों को खाता है, लेकिन गेम लोड करते समय कम CPU शक्ति की आवश्यकता होगी।


2
संशोधनों के अलावा, उन्हें संभवतः उस बीज को बचाने की भी ज़रूरत है जो प्रक्रियात्मक दुनिया का निर्माण करने के लिए इस्तेमाल किया गया था ;-)
9

@bummzack हां, मैं इसका उल्लेख करना भूल गया, क्योंकि यह स्पष्ट है :-) मैं अपना उत्तर संपादित करूंगा।
मार्टन

10
मुझे पूरी तरह से यकीन नहीं है कि दुनिया को बीज से पुनर्जीवित करना सबसे अच्छा विचार है। विश्व पीढ़ी में आमतौर पर जटिल एल्गोरिदम शामिल होते हैं और इसलिए समय लगता है: हम यादृच्छिक दुनिया उत्पन्न करते हैं ताकि आमतौर पर अंतरिक्ष को बचाया न जा सके और यादृच्छिकता से लाभ उठाया जा सके। इसलिए मैं विचार करूंगा कि पूरी दुनिया को एक द्विआधारी प्रारूप में सहेजना अधिक कुशल होगा।
जोनाथन कॉनेल

2
तो आप एक प्रक्रियागत रूप से उत्पन्न दुनिया को बचाने के लिए कह रहे हैं, आप इसे उत्पन्न करते हैं, फिर इसे बचाएं? यह बहुत पूर्ण उत्तर नहीं है।
MichaelHouse

2
@ Random832 Minecraft करता है बल्कि बीज से यह पुनः और संशोधन पुनः की तुलना में एक द्विपदीय प्रारूप में दुनिया को बचाने,। पूरी दुनिया को बचाने की समस्या के बारे में बताने के लिए, Minecraft केवल उन चनों को बचाता है जो अब तक उत्पन्न हुए हैं। जैसा कि आप आगे दुनिया का पता लगाने, अपने खेल को बचाने बड़ा हो जाता है।
जोसेफ मैंसफील्ड

8

किसी भी टाइल मानचित्र डेटा को सहेजने के रूप में प्रक्रियात्मक रूप से उत्पन्न दुनिया को सहेजना एक समान है।

आप संभवतः बाइनरी प्रारूप में दुनिया को बचाना चाहेंगे, यह मानते हुए कि दुनिया को विभिन्न प्रकार की टाइलों से बनाया गया है, आपको निम्न करना होगा:

  1. विभिन्न टाइल प्रकारों की कुल संख्या पर निर्णय लें। (इसके आधार पर आपको प्रत्येक टाइल का प्रतिनिधित्व करने के लिए कम या ज्यादा बिट्स की आवश्यकता होगी)
  2. दौरा किया (संशोधित) दुनिया की चौड़ाई और ऊंचाई को परिभाषित करें।
  3. नीचे-सबसे दाईं टाइल पर पंक्ति द्वारा शीर्ष-सबसे बाईं टाइल (आकाश सहित) से टाइल द्वारा विश्व टाइल का प्रतिनिधित्व करें।
  4. यदि आप अंतरिक्ष में बचत करना चाहते हैं, तो इस 2d-array को संपीड़ित करने के लिए DEFLATE या इसी तरह के एल्गोरिथ्म का उपयोग करें (1-d के रूप में दर्शाया गया) http://en.wikipedia.org/wiki/DEFLATE
  5. डिस्क पर डेटा संग्रहीत करने के लिए अपने API के लिए उपयुक्त फ़ाइल I / O का उपयोग करें।

आप एक ही विधि का उपयोग एक voxel आधारित मानचित्र को बचाने के लिए भी कर सकते हैं।

एक कोने पर आधारित मानचित्र मॉडल को संग्रहीत करना अधिक जटिल है।

क्या आप मुझे उस विषय पर विस्तार से बताना चाहेंगे?


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

4

Minecraft के बारे में, दुनिया voxels का उपयोग करती है, इसलिए इसे सहेजना काफी आसान है, यहां अधिक जानकारी दी गई है:

http://www.minecraftwiki.net/wiki/Region_file_format

http://www.minecraftwiki.net/wiki/Level_Format

जैसा कि पहले ही कहा गया है, दुनिया को उत्पन्न करने के लिए उपयोग किए जाने वाले बीज को बचाएं, और अपने सहेजे हुए प्रारूप को अपने विश्व (क्यूब्स, परमाणुओं, आदि ...) से बना लें।


3

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

जब भी आप किसी नए क्षेत्र को मेमोरी में लोड करने के लिए तैयार होते हैं, तो पहले यह देखें कि क्या यह डिस्क से पहले जेनरेट किया गया है और सेव किया गया है। यदि यह है, तो इसे अपने प्रक्रियात्मक पीढ़ी के एल्गोरिदम के बजाय डिस्क से लोड करें।

आमतौर पर यह इलाक़े के टुकड़े के साथ किया जाएगा। आप या तो प्रत्येक फ़ाइल को अपनी फ़ाइल में सहेज सकते हैं, या डिस्क संरचना पर एक अधिक जटिल बना सकते हैं जिसमें एक एकल फ़ाइल में लुक-अप टेबल के साथ डेटा होता है। कर रहे हैं अन्य प्रश्न डिस्क के लिए अपने डेटा को बचाने के लिए अच्छा तरीकों के बारे में।

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