오늘은 Voxel 맵 최적화를 어떻게 해야할지 고민해봤다.
모바일 게임을 만들 거라서, 최적화에 정말 많은 노력을 해야겠다고 생각했다.
테스트 용으로 Voxel 큐브를 10000개 생성하여 테스트해봤다.
말이 10000개지, 100x100밖에 안된다. 실제 게임엔 훨씬 많은 Voxel이 필요할 것 같다...
가장 좋은 최적화 방법은 역시 DrawCall을 줄이는 것이고 다음과 같은 방법들을 생각해봤다.
시야에 보이는 오브젝트만 그린다. 만약 어떤 오브젝트가 다른 오브젝트에 의해 내 시야에서 가려졌다면, 그려내지 않는다.
이 기능을 사용하려면 Occulusion Culling Data를 Bake해야한다.
유니티 내에서 지원하는 StaticOcculusionCulling
은 런타임에서 비동기로 Bake는 지원하지 않는 것 같다.
static 오브젝트들 중에서 같은 shader, material을 쓰는 오브젝트들을 하나의 메쉬로 합쳐서 draw하는 방법이다.
다행히 이 방법은 StaticBatchingUtility
라는 클래스를 이용해서 런타임 중에 사용 가능하다.
플레이어 주변 일정 범위만큼의 Voxel만 Draw하기 위한 방법들이다.
주의할 점은 플레이어 일정 범위 내의 Voxel을 찾을 때, 모든 Voxel을 탐색하면 최적화를 하느니만 못한 결과가 될 것이다.
어떤 Voxel이 다른 Voxel과 붙어있다면, 그 붙어있는 면은 그려낼 필요가 없다.
이 방법은 잘 정리된 블로그가 있어서 참고해보면 좋을 것 같다 !
Voxel 100x100 총 10,000개를 생성해서 테스트해봤다.
80 ~ 100 프레임
배치 수는 8400개가 나온다.
100 ~ 125 프레임
배치 수는 1100가 나온다.