손으로
메모리가 매우 드문 리소스가 아닌 경우 더 큰 청크 작업을 고려합니다.
여기 의사 코드가 있습니다.
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 정도만 반환해도됩니다). 둘째, 충분히 빠르고 확장 가능한 Map 구현이 있다는 가정을 기반으로합니다. 내 지식에는 모든 괜찮은 언어가 하나 있습니다.
또한 청크 크기로 재생해야합니다. 고밀도 비트 맵의 경우 큰 청크 크기가 좋고 희소 비트 맵의 경우 작은 청크 크기가 좋습니다. 실제로 매우 드문 경우에는 "청크 크기"가 1이 가장 좋습니다. "청크"자체가 더 이상 사용되지 않고 데이터 구조를 int 픽셀 맵의 int 맵으로 줄입니다.
선반에서
다른 해결책은 일부 그래픽 라이브러리를 보는 것입니다. 실제로 하나의 2D 버퍼를 다른 2D 버퍼로 그리는 데 능숙합니다. 즉, 단순히 더 큰 버퍼를 할당하고 해당 좌표에 원본을 그립니다.
일반적인 전략으로서 : "동적으로 성장하는 메모리 블록"이있을 때, 일단 사용되면 그 배수를 할당하는 것이 좋습니다. 이것은 메모리를 많이 사용하지만 할당 및 복사 비용을 크게 줄 입니다. 대부분의 벡터 구현은 크기가 초과 될 때 크기를 두 배로 할당합니다. 따라서 특히 상용 솔루션을 사용하는 경우 하나의 픽셀 만 요청 되었기 때문에 버퍼를 1 픽셀 씩 확장하지 마십시오. 할당 된 메모리가 저렴합니다. 재 할당, 복사 및 해제는 비용이 많이 듭니다.