Voxel Horizon 현재까지 진행상황

Voxel Horizon 프로젝트 현재까지 구현된 기능들. 구성요소 Game Server (C++, win32) Certification Server (C++ , win32) MSSQL Client (C/C++ , win32/UWP , DirectX11/12) 구현된 기능목록  기본적인 지형편집 가능. 복셀 오브젝트 생성 복셀 오브젝트 디테일 조정 1×1 – 8×8까지 복셀 추가 복셀 삭제 복셀 컬러 변경 실시간 라이트 갱신 CPU를 이용한 실시간 라이트맵 생성 복셀의 삭제/추가에 … More Voxel Horizon 현재까지 진행상황

DX12엔진에서 64KB Align문제 해결 – Texture

몇일전 포스팅 했다시피 DX12에선 모든 D3DResource가 64KB Align을 요구하고, 그래서 1Byte짜리 버퍼만 할당해도 64KB짜리가 할당된다. Voxel Horizon은 상당히 많은 개수의 Voxel-Object를 만들어내므로 DX12버전에선 GPU메모리를 미친듯이 먹고 있었다. 앞선 포스팅에서 언급했다시피 Vertex Buffer와 Index Buffer에 대해서는 직접 만든 heap에 64KB Align된 D3DResource를 결합해서 해결했다. 그리고 Texture가 남았다. 이게 처음에 좀 난감했다.  왜냐하면 1차원 버퍼가 아니고 2차원 … More DX12엔진에서 64KB Align문제 해결 – Texture

SRWLock 빠른 성능의 비결

Windows Vista부터 추가된 스레드 동기화 API가 있다. AcquireSRWLockExclusive()/ReleaseSRWLockExclusive() AcquireSRWLockShared()/ ReleaseSRWLockShared() 가 그것이다. 뭐 함수이름을 보면 금방 눈치챌 수 있듯이 여러 스레드가 동시에 락을 읽기 전용으로 획득하려고 AcquireSRWLockShared()를 호출한다면 대기없이 않고 바로 락을 통과한다. 쓰기 작업을 해야할 경우 AcquireSRWLockExclusive()를 호출하면 된다. 이 경우는 다른 스레드가 AcquireSRWLockShared()로 락을 획득하려고 하는 경우에도 무조건 락이 걸린다. 이게 중요한게 아니고… … More SRWLock 빠른 성능의 비결

DX11 vs DX12 리소스 사용량

어쩐지 무겁더라… Voxel Horizon의 DX12버전을 작업하던중 너무 무겁다고 생각했다. Project D Online의 dx12버전은 dx11버전에 비해 50%만(?) 메모리(GPU/GPU Mapped System Memory)를 더 먹었지만 Voxel Horizon프로젝트에선 8배를 더 처먹는다! Voxel Horizon은 정해진 맵데이터가 없는 대신 최대 8x8x8개의 복셀로 이루어진 수만개의 복셀 오브젝트가 존재한다. 복셀 오브젝트 한개당 Vertex Buffer 1개, Index Buffer 2개, Texture 1개를 만드는데 얘네들이 64KB얼라인이 … More DX11 vs DX12 리소스 사용량

Voxel Horizon – 백그라운드 컬러 테이블 RLE압축 in Server

서버에서 복셀 오브젝트의 정보를 패킷으로 날릴때마다 컬러테이블을 RLE압축하는건 아무래도 낭비. 최초 접속시 캐릭터 위치 기준으로 오브젝트를 1700개나 받아가는데 아무리 간단한 코드라도 1700번이나-그것도 싱글스레드로- 돌게 할 순 없다. 따라서 다음과 같이 처리한다. 1.복셀의 기하구조가 바뀌거나 컬러테이블 정보가 바뀌었을 경우, 복셀 오브젝트를 ‘컬러테이블->RLE압축’을 위한 업데이트 링크에 넣는다. 2. 매니저에서 일정 시간마다 업데이트 링크에 들어있는 오브젝트들에 대해서 컬러테이블을 … More Voxel Horizon – 백그라운드 컬러 테이블 RLE압축 in Server

Voxel의 컬러테이블 압축

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

Voxel Horizon – Voxel Data Streaming from Server #2

서버로부터 Voxel 데이터 수신 후 3D Mesh빌드. 체감상 1프레임도 안떨어지는 정도로 개선했다. 서버로부터 Voxel데이터 수신 -> 멀티스레드로 Voxel데이터 -> 삼각형 매시 변환, 라이트 계산을 위한 Patch데이터 생성 -> 멀티스레드로 라이트 계산 이 과정으로 진행된다. 라이트 계산이 좀 오래 걸리는데 대략 20ms정도 초과하면 일단 끊고 라이트 계산을 종료하도록 했다. 라이트 계산을 완료하지 못한 오브젝트들은 라이트 계산을 … More Voxel Horizon – Voxel Data Streaming from Server #2

Voxel Horizon – Voxel Data Streaming from Server

지금껏 내가 만든 게임엔진+기반 플랫폼은 언제나 로딩 속도가 충분히 빨랐기 때문에 지연로딩같은건 사용해본적이 없다.  뻥 안까고 캐릭터 로딩할때 아무도 캐릭터 로딩하는줄 모르는 정도로 빠르게 만들었다. 맵로딩할때도 로딩이 너무 빨라서 로딩시간에 보여주는 일러스트를 볼 수 없으니 로딩시간을 느리게 해달라는 요구도 받은적이 있다. 하지만 이번의 경우는 복셀 데이터를 서버에서 스트리밍 해야하고 데이터량이 적지 않을뿐더러 복셀데이터->삼각형데이터->(최적화된 충돌처리용 삼각형매시, … More Voxel Horizon – Voxel Data Streaming from Server

복셀의 사각형당 2×2텍셀의 라이트맵 적용

각각의 복셀오브젝트에 할당된 라이트맵. 라이트 계산은 안했고 좌표가 제대로 부여됐는지 확인. 현재 텍셀당 25cm x 25cm이다. 오브젝트의 복셀 구성이 가변이라 애먹었다. 좌측으로부터 8x8x8 2개, 4x4x4 ,2x2x2 ,1x1x1 1개씩이다. 삼각형 매시같으면 인접한 텍셀과 부드럽게 보간하기 위해서 비슷한 평면상에 존재하는 삼각형들끼리 묶어서 패킹 해야했다.또한 필터링시 의도하지 않은 번짐을 최소화하기 위해 텍스쳐상에서 패킹된 그룹 간에 2픽셀씩 건너뛰고 모서리 … More 복셀의 사각형당 2×2텍셀의 라이트맵 적용

Voxel Horizon 개발 근황

이전에는 GPU에서 라이트 계산과 그림자처리를 했었는데 CPU에서 하는걸로 바꿨다. 복셀 오브젝트가 2만개가 넘어가니 컬링을 해도 복셀 데이터를 Shadow Map에 그리는 시간을 무시할 수 없다. 쉐도우맵 스타일의 그림자가 크게 어울리는것도 아니고 해서 CPU기반으로 바꿨다. KD-Tree traversal로 복셀 최소단위 50x50cm 한 면씩 라이트/그림자 처리를 수행한다. 멀티스레드로 처리하고 한방에 맵 전체를 처리하거나 중간중간 복셀 데이터의 변동분에 대해서 최대 … More Voxel Horizon 개발 근황