Game Dev – Voxel Horizon – 가변 월드 사이즈 적용을 위한 사전작업

먼저번에 node사이즈를 꽤 줄여서 KD-Tree메모리로 56MB 사용하던것을 18M로 줄였다. 그 다음으로 맵 유형에 따라 Tree의 사이즈를 가변적으로 선택할 수 있도록 작업하고 있다.

지금까지는 월드 사이즈를 1km x 1km x 0.32km 고정으로 설정했었다. 이것은 kd-tree가 커버하는 사이즈이기도 하며 복셀월드에서 복셀들이 차지하는 실제 사이즈와는 관계가 없다.
퍼블릭맵에서는 1km x 1km를 기본으로 하고 있으므로 문제가 될것이 없다. 하지만 개인맵의 경우 256m x 256m 정도면 충분할것인데 1km x 1km를 가정한 tree사이즈는 꽤 낭비가 된다. 1km x 1km x 0.32km를 위한 KD-Tree사이즈는 현재 18MB정도이다. 256m x 256m x 320m에 딱 맞춘 tree를 생성한다면 메모리 사이즈를 1/16정도로 줄일 수 있다.

다음과 같은 간단한 목표를 정했다.
1) 퍼블릭맵과 개인맵등 몇가지 유형으로 맵의 최대 사이즈를 설정한다.
2) 맵 사이즈가 작으면 그에 맞는 크기의 tree를 생성한다.

아주 심플하고 별 작업 아닌거 같다. 처음엔 그렇게 생각했다.
우선 예전에 엔진과 클라이언트/서버에서 오브젝트의 좌표를 다룰때 어떻게 다뤘는가를 살펴보자.

이전엔 패킷이나 파일에 복셀 오브젝트의 좌표를 저장할때 float좌표 대신 2 bytes * 3 = 6 bytes를 사용했다.
복셀월드의 최대 사이즈를 고정해뒀었으므로 float좌표를 int좌표로 저장할 수 있다. 즉
복셀 오브젝트의 float 좌표 = world_min + voxel_object_size * int좌표
라는 관계가 성립한다.
오브젝트의 좌표를 float 4bytes씩 12 bytes를 쓰는대신 int타입으로 관리하면 월드 최대 사이즈를 감안할때 좌표 성분당 2 bytes에도 충분히 들어가므로 6 bytes로 줄일 수 있다. 이게 복셀 지오메트리를 패킷으로 전달할땐 꽤 의미가 크다.

그런데 월드 사이즈가 가변이 되면 이렇게 저장해둔 정수형 좌표들은 전혀 사용할 수 없다. world_min이 고정이 아니기 때문이다. 고정된 world_min을 가정하고 저장된 int좌표는 아무짝에 쓸모가 없다.

그래서 6 bytes좌표 사이즈를 유지하면서 world_min이 달라져도 상관없도록 패킷과 파일에 저장할때의 좌표체계는 다음과 같이 수정했다.

성분당 좌표(x,y,z) = float좌표 / 오브젝트의 사이즈
성분당 좌표의 크기는 2 bytes 씩 총 6 bytes다.

이렇게 하면 오브젝트 사이즈는 400cm이므로 부호까지 감안하면 short타입 한 성분(x,y,z)으로 약 13km를 커버할 수 있다.

이제 실무적인 문제인데 엔진에 예전좌표계로 처리하는 코드가 꽤 있고 엔진 API를 사용하는 서버와 클라이언트 코드도 예전 좌표계로 처리하는 코드의 양이 상당하다. 게다가 그 코드들을 이용해서 파일에 저장된 복셀 파일들도 문제다. 새로운 좌표체계로 변환하거나 호환성을 유지하도록 하려면 작업량이 꽤 된다.

그래서 단순히 ‘맵의 최대 사이즈를 가변으로 하자’라는 목표를 달성하기 위해서 대량의 코드수정이 불가피하게 됐다.

매우 재미없고 지루하고 신경 곤두서는 작업이었다.

1) 엔진부터 시작해서 복셀 오브젝트의 위치에 int좌표계를 사용하는 코드는 싸그리 float기반으로 바꿨다. 이 float좌표계가 패킷과 파일에 저장될때는 short 2 bytes * 3 = 6 bytes로 저장되고 반대로도 가져올 수 있도록 코드를 수정했다.

2) 기존에 저장된 파일들을 로드할 경우 버전 체크를 해서 호환성을 유지할 수 있도록 했다.

3) 복셀 엔진에서 꽤 복잡한 코드를 자랑하는 소유권 저장 테이블이 기존 int좌표체계를 사용하므로 얘네들을 몽땅 float기반으로 바꿨다.

이렇게 엔진과 엔진 api를 사용하는 서버/클라이언트까지 코드를 싸그리 다 고치는데 이틀 걸렸다.

그리고 수정한 모든 코드 라인에 브레이크 포인트를 다 찍어서 브레이크 포인트가 하나도 남지 않을때까지 테스트를 했다. 총 3일 소요.

이제 트리 사이즈를 가변으로 할 수 있는 준비가 됐다.


Game Dev – Voxel Horizon – 가변 월드 사이즈 적용을 위한 사전작업”에 대한 답글 1개

답글 남기기

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

WordPress.com 로고

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

Facebook 사진

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

%s에 연결하는 중