Bằng tay
Nếu bộ nhớ không phải là một tài nguyên rất thưa thớt, tôi xem xét làm việc trong các khối lớn hơn.
Đây là một số mã giả.
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;
}
}
Việc thực hiện này khá ngây thơ.
Đối với một, nó tạo ra các khối trong getPixel (về cơ bản sẽ ổn khi chỉ cần trả về 0 hoặc hơn, nếu không có khối nào được xác định cho vị trí đó). Thứ hai, nó dựa trên giả định rằng bạn có một triển khai Bản đồ đủ nhanh và có thể mở rộng. Theo hiểu biết của tôi, mỗi ngôn ngữ đàng hoàng đều có một.
Ngoài ra, bạn sẽ phải chơi với kích thước chunk. Đối với bitmap dày đặc, kích thước khối lớn là tốt, đối với bitmap thưa thớt, kích thước khối nhỏ hơn là tốt hơn. Trong thực tế đối với những cái rất thưa thớt, "kích thước khối" là 1 là tốt nhất, khiến cho các "khối" tự lỗi thời và giảm cấu trúc dữ liệu thành bản đồ int của một bản đồ int của pixel.
Tắt kệ
Một giải pháp khác có thể là xem xét một số thư viện đồ họa. Họ thực sự khá giỏi trong việc vẽ một bộ đệm 2D thành một bộ đệm khác. Điều đó có nghĩa là bạn chỉ cần phân bổ một bộ đệm lớn hơn và rút bản gốc vào nó theo tọa độ.
Như một chiến lược chung: Khi có một "khối bộ nhớ tăng trưởng động", bạn nên phân bổ bội số của nó, một khi nó được sử dụng hết. Đây là bộ nhớ khá dữ dội, nhưng giảm đáng kể chi phí phân bổ và sao chép . Hầu hết các triển khai vector phân bổ gấp đôi kích thước của chúng, khi nó vượt quá. Vì vậy, đặc biệt nếu bạn sử dụng giải pháp sẵn có, đừng mở rộng bộ đệm của bạn thêm 1 pixel, vì chỉ một pixel được yêu cầu. Bộ nhớ phân bổ là giá rẻ. Tái phân bổ, sao chép và phát hành là tốn kém.