2011-09-09 4 views
2

문제점 : 맵 클래스의 타일 데이터를 저장하려고합니다. 나는 레이어마다 팔레트를 사용한다는 아이디어를 가지고 있었고, 팔레트는 레이어의 데이터를 기술 할 것이고, 타일의 각 바이트가 타일 타입을 나타내는 바이트의 배열이 될 것이다.레이어 다중 레이어 당 1 억 개 이상의 타일에 타일 데이터 저장

이것은 1 억 개의 타일로 구성된 레이어가 ~ 96mb와 같음을 의미합니다. 그러나 나는 얼마나 많은 데이터를 실제로 byte에 저장할 수 있는지를 간과하였고, 물론 256 개의 타일만을 저장할 수 있음이 드러났습니다. 결과적으로 256 * 타일 크기 텍스처 크기의 제곱근을 산출합니다 (이 경우 타일 크기는 256입니다). 256 * 256 텍스처 크기는 각 팔레트가 하나의 텍스처 만 가질 수 있기 때문에 너무 작습니다. 심각하게 레이어에서 가질 수있는 타일을 제한합니다.

저는 타일 데이터를 저장하기 위해 1 바이트 대신 2 바이트 (짧은 코드)를 사용하는 것처럼 바인딩에 걸렸습니다. 메모리 사용량을 두 배로하여 레이어 당 ~ 192MB로 두 배가됩니다. 최소 4 개의 레이어가 필요합니다. 최종 제품을 768MB의 램 사용으로 팽창 시켰습니다. 또한 각 바이트의 배열 오프셋 또한 위치의 설명이기 때문에 데이터의 데이터를 설명 할 수 없습니다.

이 데이터를보다 효율적으로 저장할 수있는 방법이 있습니다. 최악의 시나리오는이 모든 것을 디스크에 저장하고 디스크에서 메모리로 버퍼링하는 것입니다. 하지만 나는 그것을 기억에 남기를 원할 것이다.

나는 몇 시간 만에 뭔가 똑똑해 보일 수 있다고 생각하지만,이 문제를 해결하는 데 익숙하지 않은 일반적인 방법이 있는지 확인해야한다고 생각했습니다.

+2

이것은 당신의 지갑으로 해결할 수있는 문제의 일종입니다. 더 많은 RAM을 구입하십시오.;) – carlpett

+0

나는 어린 시절의 학교에서 1GB RAM을 요구하는 게임을 생각하고 있다고 생각한다. 여전히 나는 대안을 좋아할 것이다. – user936509

+1

나는 일종의 농담이었습니다. 1 억 개의 타일이 모두 동시에 표시됩니까? 그렇지 않으면, 보이는 부분을 메모리에 유지하고 필요할 때 다른 부분을로드하려고 할 수 있습니다. 또한 모든 직책에 항상 데이터가 포함되어 있습니까? 그렇지 않으면 스파 스 구조를 만드는 방법을 살펴보십시오. – carlpett

답변

1

Hilbert curve과 같은 공간 채우기 곡선을 사용하여 2 차원 평면에 매핑되는 배열에서 데이터를 나타내는 것이 좋습니다.

그런 다음 Huffman codingrun-length encoding의 조합을 사용하여 압축하십시오. 이는 데이터가 종종 반복적으로 반복되는 경우 (즉, 같은 타일이 서로 나란히있는 많은 부분이있는 경우)에 특히 효과적입니다.

이 압축은 256 타일 블록 단위로 수행합니다. 그런 다음 압축 된 데이터가 얼마나 많은 바이트 수인지 나타내는 간격 띄우기 배열을 가져야합니다. 예를 들어

, 제 2 블록의 시작 (타일 256)의 바이트 위치 (103)에있을 수있는, 상기 제 3 블록의 시작 (타일 (512))이어서

위치 (192)로 할 것을 액세스 할 말할 수도 400 번째 타일 일 경우 두 번째 블록에서부터 작업 할 수 있으므로 두 번째 블록 (이 경우 바이트 103에서 바이트 191로)의 압축을 풀면 400 - 256 = 144 타일이됩니다. 잠시 동안이 압축 해제 된 데이터를 저장 (캐시)하십시오.이 압축 해제 된 블록에있을 가까운 타일을 가져오고있을 가능성이 큽니다. 아마도 오프셋의 배열에서 최근에 어떤 블록이 캐시되었는지, 캐시에있는 블록이 포함되어 있어야합니다.

수정을 허용하려면 하나의 큰 배열에서 벡터 벡터로 데이터 구조를 변경해야 할 것입니다. 압축 여부에 관계없이 각 벡터에 대한 표시기가 있어야합니다. 수정을 할 때, 블록을 압축 해제하고 수정하고, 메모리가 부족할 때 가장 최근에 수정되지 않은 블록을 재 압축하십시오.


또는, 당신은 단지 파일에 전체 구조를 덤프 수 있고 memory map 파일. 이것은 훨씬 간단하지만 추가 I/O로 인한 데이터 및 액세스 패턴의 압축 가능성에 따라 느려질 수 있습니다.