Voxel Horizon 프로젝트 현재까지 구현된 기능들.
구성요소
- Game Server (C++, win32)
- Certification Server (C++ , win32)
- MSSQL
- Client (C/C++ , win32/UWP , DirectX11/12)
구현된 기능목록
- 기본적인 지형편집 가능.
- 복셀 오브젝트 생성
- 복셀 오브젝트 디테일 조정 1×1 – 8×8까지
- 복셀 추가
- 복셀 삭제
- 복셀 컬러 변경
- 실시간 라이트 갱신
- CPU를 이용한 실시간 라이트맵 생성
- 복셀의 삭제/추가에 따라 변경된 영역을 계산해서 리얼타임으로 다시 계산
- 라이트맵 갱신도중 일정 시간을 초과하면 다음 프레임으로 연기한다.
- SW Occlusion Culling
- OCTree탐색시에 복셀 오브젝트를 시스템 메모리의 Z-Buffer에 미리 그려보고 node가 보이는지 안보이는지를 판별한다. 안보이면 node째로 culling한다.
- SSE를 이용해서 성능을 2배이상 향상시켰다.
- 멀티스레드를 이용해서 Raster작업의 성능을 2배 이상 향상시켰다.
- 탐색의 깊이가 깊어질 경우 SW Occlusion Culling으로 너무 많은 시간을 소모할 수 있다. 매 프레임마다 탐색할때, 5ms이상 탐색에 시간을 보냈다면 그 프레임에 한해서 SW Occlusion Culling은 자동으로 꺼진다.
- 서버에 복셀 데이터 저장
- 서버로부터 복셀 데이터 스트리밍
- 복셀 데이터를 수신했을때 복셀 데이터-> 삼각형 데이터로의 변환을 즉시 수행하지 않고 지연처리한다.
- 멀티스레드로 복셀데이터->삼각형 데이터/ 패치데이터(for Lightmap)로의 변환은 멀티스레드로 처리한다.
- 충돌처리 등으로 삼각형 데이터가 필요한 경우 복셀 데이터 ->삼각형 데이터로 즉시 변환한다.
- 복셀 데이터의 RLE압축
- 멀티스레드를 이용한 백그라운드 압축
- 멀티플레이
- 복셀편집/전투/이동 모두 서버 베이스
- 이동/전투 판정의 충돌처리를 위해 OCTree에서 복셀 데이터로부터 필요한 삼각형 리스트를 실시간으로 변환.
- 각 플레이어들이 전체 맵의 얼마만큼을 스트리밍했는지 플레이어마다 비트테이블로 저장. 플레이어가 이동할때마다 비트테이블을 참고하여 복셀 데이터를 전송할지 여부를 결정한다.
- DirectX 12지원
- DirectX 12 API를 사용한다. DX11과 DX12양쪽에 모두 대응한다.
- DX12사용시 리소스의 64KB Align문제로 GPU 메모리를 지나치게 소모하는 문제가 있었다. Vertex Buffer/Index Buffer/Texture를 heap에 맵핑해서 64KB단위로 할당된 D3DResource를 최대한 남김없이 사용하도록 했다. 현재는 DX11보다 GPU메모리를 약간 더 소모한다.
- UWP 지원
- win32 데스크탑 프로젝트가 기본이지만 UWP버전도 같이 유지하고 있다. 98%이상의 코드를 공유한다.
- Windows 10 Moblie에서 작동한다. Lumia 950XL에서 잘 작동한다. Direct X Feature Level 11을 지원하는 GPU가 장착되어 있어야한다. Snap Dragon 808이상.
- XBOX ONE에서 작동한다.(UWP App으로 작동한다)
- HoloLens도 지원한다. Windows Graphcis API와 Perception API를 사용해서 HoloLens를 지원한다. 단 작동은 하고 다른 플레이어들의 움직임을 볼 수 있지만 UI문제가 있어서 현재는 다른 버전과 똑같은 방법으로 플레이할수는 없다.
테스트 동영상
PC(win32)와 PC(win32) 멀티플레이 테스트
PC(win32)와 Windows Phone의 멀티 플레이 테스트
PC(win32)와 PC(UWP)의 멀티 플레이 테스트
PC(win32)와 XBOX ONE(UWP)의 멀티 플레이 테스트
HoloLens 테스트