हाथ से
यदि स्मृति बहुत विरल संसाधन नहीं है, तो मैं बड़ी मात्रा में काम करने पर विचार करता हूं।
यहाँ कुछ छद्म कोड है।
class Chunk {
Chunk new(int size) {...}
void setPixel(int x, int y, int value) {...}
int getPixel(int x, int y) {...}
}
class Grid {
Map<int, Map<Chunk>> chunks;
Grid new(int chunkSize) {...}
void setPixel(int x, int y, int value) {
getChunk(x,y).setPixel(x % chunkSize, y % chunkSize, value);//actually the modulo could be right in Chunk::setPixel and getPixel for more safety
}
int getPixel(int x, int y) { /*along the lines of setPixel*/ }
private Chunk getChunk(int x, int y) {
x /= chunkSize;
y /= chunkSize;
Map<Chunk> row = chunks.get(y);
if (row == null) chunks.set(y, row = new Map<Chunk>());
Chunk ret = row.get(x);
if (ret == null) row.set(x, ret = new Chunk(chunkSize));
return ret;
}
}
यह कार्यान्वयन काफी भोला है।
एक के लिए, यह getPixel में विखंडू बनाता है (मूल रूप से यह केवल 0 या तो वापस करने के लिए ठीक होगा, यदि उस स्थिति के लिए कोई विखंडू परिभाषित नहीं किया गया था)। दूसरे यह धारणा पर आधारित है, कि आपके पास मैप का पर्याप्त तेज़ और स्केलेबल कार्यान्वयन है। मेरी जानकारी में हर सभ्य भाषा एक है।
साथ ही आपको चंक साइज़ के साथ खेलना होगा। घने बिटमैप्स के लिए, एक बड़े चंक आकार अच्छा है, विरल बिटमैप्स के लिए एक छोटा हिस्सा आकार बेहतर है। वास्तव में बहुत विरल लोगों के लिए, 1 का "चंक साइज़" सबसे अच्छा है, "चंक्स" को खुद को अप्रचलित करना और डेटा संरचना को पिक्सेल के एक आंतरिक मानचित्र के एक आंतरिक मानचित्र पर कम करना है।
शेल्फ से
एक और समाधान कुछ ग्राफिक्स पुस्तकालयों को देखने के लिए हो सकता है। वे वास्तव में एक 2 डी बफर को दूसरे में खींचने में काफी अच्छे हैं। इसका मतलब है कि आप बस एक बड़ा बफर आवंटित करेंगे और मूल को निर्देशांक के अनुसार इसमें शामिल करेंगे।
एक सामान्य रणनीति के रूप में: जब "गतिशील रूप से बढ़ते मेमोरी ब्लॉक" होते हैं, तो इसका उपयोग करने के बाद, इसमें से कई को आवंटित करना एक अच्छा विचार है। यह बल्कि स्मृति गहन है, लेकिन आवंटन और नकल की लागत में काफी कटौती करता है । अधिकांश वेक्टर कार्यान्वयन दो बार उनके आकार को आवंटित करते हैं, जब यह अधिक हो जाता है। इसलिए विशेष रूप से अगर आप ऑफ-द-शेल्फ समाधान के साथ जाते हैं, तो आप केवल 1 पिक्सेल से बफर का विस्तार न करें, क्योंकि केवल एक पिक्सेल का अनुरोध किया गया था। आवंटित स्मृति सस्ती है। Reallocating, नकल और जारी करना महंगा है।