Voxel의 컬러테이블 압축

복셀당 1바이트짜리 컬러팔레트(사실상 텍스쳐 팔레트)를 사용하는데 이게 은근 메모리 많이 처먹음. 아니 메모리 처먹는건 큰 문제가 아닌데 패킷으로 보낼때가 문제. 8x8x8복셀일때 기하구조를 구현하는데 필요한 메모리는 복셀당 1비트로 64바이트면 되지만 컬러테이블은 복셀당 1바이트니 512바이트가 나온다. 최초 접속시 현재 1700개 이상의 오브젝트를 보내야 하니 패킷량이 장난 아니다. 하여간 그래서 줄이긴 줄여야겠기에 단순하게 압축을 하기로 했다. zlib를 고려했지만 생각보다 압축률이 높지 않은데 비해 성능은 떨어지고 무엇보다 내가 안만든 라이브러리를 서버에서 사용하고 싶진 않았다. 문제 생기면 감당할 수 없다.

1. 오브젝트 내에서 복셀이 존재하는지 여부는 1비트로 표현된다. 따라서 비트테이블이 있으면 8x8x8의 컬러테이블을 유지할 필요는 없다. 0 – 8x8x8-1까지의 인덱스를 순회하면서 비트가 존재할때만 복셀의 컬러값을 저장한다. 일단 현재 테스트중인 맵을 보면 복셀 오브젝트 내에서도 빈공간이 많다. 이렇게만 해도 대폭 줄어든다.

2. 복셀을 쿡쿡 찍어서 뭘 만들어보면, 인접한 영역은 비슷한 컬러로 칠할 경우가 많다. 그리고 빈 공간은 건너뛰므로 상당히 많은 경우에 인접한 블럭이 같은 색깔로 칠해지게 된다. 그래서 RLE압축을 하기로 한다.
과거 pcx파일등에서 사용하던 방법이고 비슷하게 2D게임에선 0번압축을 많이 사용했다. 내 경우엔 빈공간을 건너뛰니까 사실상 0번압축이다.

패킷으로 보낼때도 이렇게 압축해서 보내고 파일로 저장할때도 같은 코드를 이용해서 압축해서 저장하도록 했다.
결과적으로 12MB짜리 파일을 1.6MB로 줄였다.


답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중