यह 1.5Gb तक पहुंचने पर ऐप क्रैश हो जाता है।
यह दृढ़ता से सुझाव देता है कि आप अपनी टाइलों का सही ढंग से प्रतिनिधित्व नहीं कर रहे हैं, क्योंकि इसका मतलब होगा कि प्रत्येक टाइल आकार में ~ 80 बाइट्स है।
आपको यह समझने की आवश्यकता है कि टाइल की गेमप्ले अवधारणा और उपयोगकर्ता द्वारा देखे जाने वाले दृश्य टाइल के बीच एक अलगाव होने की आवश्यकता है। ये दोनों अवधारणाएं एक ही चीज नहीं हैं ।
उदाहरण के लिए टेरारिया को लें। सबसे छोटी टेरारिया दुनिया में 4200x1200 टाइलें हैं, जो 5 मिलियन टाइलें हैं। अब, उस दुनिया का प्रतिनिधित्व करने में कितनी स्मृति लगती है ?
खैर, प्रत्येक टाइल में एक अग्रभूमि परत, एक पृष्ठभूमि परत (पृष्ठभूमि की दीवारें), एक "तार की परत" होती है जहां तार जाते हैं, और एक "फर्नीचर परत" जहां फर्नीचर आइटम जाते हैं। प्रत्येक टाइल कितनी मेमोरी लेती है? फिर, हम सिर्फ वैचारिक रूप से बात कर रहे हैं, न कि नेत्रहीन।
एक अग्रभूमि टाइल आसानी से एक अहस्ताक्षरित शॉर्ट में संग्रहीत की जा सकती है। वहाँ 65536 से अधिक अग्रभूमि टाइल प्रकार नहीं हैं, इसलिए इससे अधिक मेमोरी का उपयोग करने का कोई मतलब नहीं है। पृष्ठभूमि टाइल आसानी से एक अहस्ताक्षरित बाइट में हो सकती है, क्योंकि 256 से अधिक विभिन्न प्रकार की पृष्ठभूमि टाइलें हैं। तार की परत विशुद्ध रूप से द्विआधारी है: या तो एक टाइल में एक तार होता है या यह नहीं होता है। तो यह प्रति टाइल एक बिट है। और फ़र्नीचर की परत फिर से एक अहस्ताक्षरित बाइट हो सकती है, जो इस बात पर निर्भर करती है कि वहाँ फर्नीचर के विभिन्न संभावित टुकड़े कितने हैं।
प्रति टाइल कुल स्मृति आकार: 2 बाइट्स + 1 बाइट + 1 बिट + 1 बाइट: 4 बाइट्स + 1 बिट। इस प्रकार, एक छोटे से टेरारिया मानचित्र के लिए कुल आकार 20790000 बाइट्स, या ~ 20 एमबी है। (ध्यान दें: ये गणना टेरारिया 1.1 पर आधारित हैं। तब से खेल का बहुत विस्तार हुआ है, लेकिन आधुनिक टेरारिया भी प्रति टाइल स्थान 8 बाइट्स में फिट हो सकता है, या ~ 40 एमबी। अभी भी काफी सहन करने योग्य है)।
आपके पास यह प्रतिनिधित्व कभी भी C # कक्षाओं के सरणियों के रूप में संग्रहीत नहीं होना चाहिए । उन्हें पूर्णांक या कुछ इसी तरह के एरेज़ होने चाहिए। एसी # स्ट्रक्चर भी काम करेगा।
अब, जब नक्शा (जोर पर ध्यान दें) का हिस्सा खींचने का समय आ गया है , तो टेरारिया को इन वैचारिक टाइलों को वास्तविक टाइल्स में बदलने की आवश्यकता है । प्रत्येक टाइल को वास्तव में एक अग्रभूमि छवि, पृष्ठभूमि छवि, एक वैकल्पिक फर्नीचर छवि लेने की जरूरत है, और एक तार छवि है। यह वह जगह है जहां XNA अपनी विभिन्न स्प्राइट शीट और इस तरह के साथ आता है।
आपको अपने वैचारिक नक्शे के दृश्य भाग को वास्तविक XNA स्प्राइट शीट टाइल्स में बदलने की आवश्यकता है। आपको एक ही बार में पूरी चीज़ को बदलने की कोशिश नहीं करनी चाहिए । आपके द्वारा संग्रहित प्रत्येक टाइल को यह कहते हुए एक इंडेक्स होना चाहिए कि "मैं टाइल टाइप X हूं," जहां X एक पूर्णांक है। आप लाने के लिए जो कि पूर्णांक इंडेक्स का उपयोग करके प्रेत आप इसे प्रदर्शित करने के लिए इस्तेमाल करते हैं। और आप XNA के स्प्राइट शीट्स का इस्तेमाल करते हैं ताकि यह अलग-अलग क्वाड्स को आकर्षित कर सके।
अब टाइलों के दृश्य क्षेत्र को विभिन्न विखंडों में विभाजित करने की आवश्यकता होती है, ताकि जब भी कैमरा चले तो आप लगातार स्प्राइट शीट का निर्माण न करें। तो आपके पास स्प्राइट शीट के रूप में दुनिया के 64x64 टुकड़े हो सकते हैं। जो भी दुनिया के 64x64 हिस्सा खिलाड़ी के वर्तमान कैमरे की स्थिति से दिखाई देते हैं वे आपके द्वारा खींचे जाने वाले हिस्सा हैं। किसी भी अन्य विखंडू में स्प्राइट शीट भी नहीं है; यदि कोई हिस्सा स्क्रीन से गिर जाता है, तो आप उस शीट को बाहर फेंक देते हैं (ध्यान दें: आप वास्तव में इसे हटाते नहीं हैं; आप इसे इधर-उधर रख देते हैं और बाद में दिखाई देने वाली नई चीज़ के लिए इसे पुन: सत्यापित कर सकते हैं)।
मैं कम से कम सर्वर ऐप (और यदि संभव हो तो क्लाइंट) पर पूरे मानचित्र को संसाधित करना चाहता हूं।
आपके सर्वर को टाइलों के दृश्य प्रतिनिधित्व के बारे में जानने या देखभाल करने की आवश्यकता नहीं है। इसके बारे में सभी को ध्यान देने की जरूरत है, यह वैचारिक प्रतिनिधित्व है। उपयोगकर्ता यहां एक टाइल जोड़ता है, इसलिए यह उस टाइल इंडेक्स को बदलता है।