2012-04-16 18 views
6

मैं अपने गेम इंजन का एक छोटा सा हिस्सा पढ़ रहा हूं और सोच रहा हूं कि कुछ हिस्सों को कैसे अनुकूलित किया जाए।इस स्थिति के लिए बिडरेक्शनल डेटा संरचना

स्थिति काफी सरल है और यह निम्नलिखित है:

  • मैं Tile रों का एक नक्शा (एक द्वि-आयामी सरणी में संग्रहीत) है (~ 260k टाइल्स, लेकिन कई और अधिक मान)
  • मैं Item रों की एक सूची है जो हमेशा कम से कम और अधिक से अधिक एक टाइल में हैं
  • एक Tile तार्किक Item रों
  • की अनंत राशि शामिल कर सकते हैं खेल निष्पादन के दौरान कई Item निरंतर कर रहे हैं ly बनाया है और वे अपने स्वयं से शुरू Tile
  • हर Item लगातार बदलता है पड़ोसियों में से एक (ऊपर, ठीक है, नीचे, बाएं)

अप करने के लिए अपने Tile अब हर Item अपने वास्तविक Tile के लिए एक संदर्भ है करने के लिए , और मैं सिर्फ वस्तुओं की एक सूची रखता हूं। प्रत्येक बार Item एक आसन्न टाइल पर जाता है, मैं बस item->tile = .. अद्यतन करता हूं और मैं ठीक हूं। यह ठीक काम करता है लेकिन यह unidirectional है।

इंजन को विस्तारित करते समय मुझे एहसास हुआ कि मुझे कई बार टाइल में निहित सभी आइटम मिलना है और यह प्रभावी रूप से प्रदर्शन को कम कर रहा है (विशेष रूप से कुछ परिस्थितियों के लिए, जिसमें मुझे टाइल्स की एक श्रृंखला के लिए सभी आइटम मिलना है, एक एक करके)।

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

मैं इस तथ्य का फायदा उठाने के लिए एक कस्टम डेटा संरचना के बारे में सोच रहा हूं कि आइटम हमेशा पड़ोसी सेल में जाते हैं लेकिन मैं वर्तमान में अंधेरे में घूम रहा हूं! किसी भी सलाह की सराहना की जाएगी, यहां तक ​​कि मुश्किल या गुप्त दृष्टिकोण भी। दुर्भाग्य से मैं सिर्फ स्मृति बर्बाद नहीं कर सकता, इसलिए एक अच्छा व्यापार-बंद करने की आवश्यकता है।

मैं इसे सी ++ में एसटीएल के साथ विकसित कर रहा हूं लेकिन बिना बूस्ट के। (हाँ, मैं के बारे में multimap पता है, यह मेरे को संतुष्ट नहीं है, लेकिन मैं अगर मैं कुछ भी बेहतर नहीं मिलता कोशिश करता हूँ)

उत्तर

2
struct Coordinate { int x, y; }; 
map<Coordinate, set<Item*>> tile_items; 

इस नक्शे का संकेत मद संकेत के सेट जो आइटम है कि टाइल पर हैं करने के लिए टाइल के नक्शे पर समन्वय करता है। आपको प्रत्येक समन्वय के लिए एक प्रविष्टि की आवश्यकता नहीं होगी, केवल उन लोगों के लिए जो वास्तव में उनके पास आइटम हैं। अब, मैं जानता हूँ कि आप इस ने कहा:

लेकिन मैं चरण

और इस विधि "एक से दूसरे टाइल से आगे बढ़" में ज्यादा भूमि के ऊपर से बचने के लिए है कि में और अधिक भूमि के ऊपर जोड़ने शामिल होगा चाहते हैं अवस्था। लेकिन क्या आपने वास्तव में ऐसा कुछ करने की कोशिश की है और यह निर्धारित किया है कि यह एक समस्या है?

0
मेरे लिए

मैं एक मैट्रिक्स प्रकार में एक std::vector लपेट हैं (आईई 2 डी पहुँच थोपना एक 1 डी सरणी पर) यह आपको अपनी किसी भी टाइल पर तेजी से यादृच्छिक पहुंच प्रदान करता है (मैट्रिक्स को लागू करना छोटा है)।

उपयोग

vector_index=y_pos*y_size+x_pos; 

सूचकांक के आकार

vector_size=y_size*x_size; 

का एक वेक्टर तो प्रत्येक आइटम आइटम एक टाइल है की राशि शायद बहुत गतिशील है अगर एक std :: वस्तुओं के वेक्टर हो सकता है (एक डेक) फिर से ये यादृच्छिक अभिगम बहुत कम ओवरहेड के साथ होते हैं।

मैं आपके उपयोग के मामले के लिए अप्रत्यक्ष कंटेनर से दूर रहूंगा।

पीएस: यदि आप चाहते हैं कि आप मेरा मैट्रिक्स टेम्पलेट प्राप्त कर सकें।

+0

'टाइल 'नक्शा पहले से ही एक कच्चे द्विपक्षीय सूचक है, उदाहरण के लिए। 'टाइल मैप [WIDTH] [HEIGHT] 'इसलिए मेरे पास पूरे मानचित्र में यादृच्छिक पहुंच है, लेकिन मैं प्रत्येक टाइल के लिए आइटमों की एक सूची नहीं लेना चाहता क्योंकि ये आइटम दुर्लभ हैं और यह एक बड़े क्षेत्र पर कब्जा नहीं करता है नक्शा खुद .. – Jack

+0

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

+0

यह एक बुरा डिजाइन नहीं है, पूरी दुनिया के लिए मानचित्र की आवश्यकता है। प्रत्येक टाइल आइटम की वजह से नहीं बल्कि कई अन्य चीजों के कारण मौजूद होना चाहिए। जैसा कि मैंने कहा था कि यह इंजन का एक छोटा टुकड़ा है :) – Jack

0

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

संबंधित मुद्दे