Elle
Bellek çok seyrek bir kaynak değilse, daha büyük parçalar halinde çalışmayı düşünüyorum.
İşte bazı sahte kodlar.
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;
}
}
Bu uygulama oldukça naif.
Birincisi, getPixel'de parçalar oluşturur (temel olarak, bu konum için herhangi bir parça tanımlanmadıysa, 0 ya da öylesine dönmek iyi olur). İkincisi, Harita'nın yeterince hızlı ve ölçeklenebilir bir uygulamasına sahip olduğunuz varsayımına dayanmaktadır. Bildiğim kadarıyla her iyi dilde bir tane var.
Ayrıca yığın boyutu ile oynamak zorunda kalacak. Yoğun bitmapler için büyük bir yığın boyutu iyidir, seyrek bitmapler için daha küçük bir yığın boyutu daha iyidir. Aslında çok seyrek olanlar için, 1'lik bir "yığın boyutu" en iyisidir, "yığınları" geçersiz kılar ve veri yapısını bir int piksel haritasının int haritasına indirir.
Satışa hazır
Başka bir çözüm, bazı grafik kütüphanelerine bakmak olabilir. Aslında bir 2D tamponu diğerine çekmekte oldukça iyidirler. Bu, yalnızca daha büyük bir tampon ayıracağınız ve orijinalin ilgili koordinatlara çekileceğini gösterir.
Genel bir strateji olarak: "Dinamik olarak büyüyen bir hafıza bloğuna" sahip olduğunuzda, bir kez kullanıldığında, birden fazla yer ayırmak iyi bir fikirdir. Bu oldukça bellek yoğun bir işlemdir ancak ayırma ve kopyalama maliyetlerini önemli ölçüde azaltır . Çoğu vektör uygulaması, aşıldığında boyutlarının iki katını ayırır. Bu nedenle, özellikle kullanıma hazır bir çözümle giderseniz, arabelleği yalnızca 1 piksel uzatmayın, çünkü yalnızca bir piksel istendi. Ayrılan bellek ucuz. Yeniden tahsis, kopyalama ve bırakma pahalıdır.