예전에도 포스팅한적이 있는데 나는 지금껏 작업해온 엔진을 UWP용으로도 유지하고 있었다.
아니 정확히는 유지는 잘 못했다. 작년 12월 이후로는 유지보수를 못하고 있었다.
데스크탑 버전의 경우 12월부터 지금까지 DX12를 지원하는데 대부분의 시간을 보냈다. 그런데 DX12를 지원하면서 DX11버전도 사실 많이 바뀌었다.
DX12와 인터페이스를 맞춰야하다보니 그리 된것도 있고 이번 게임데모 프로젝트를 위해서 렌더러 외의 모듈에도 기능추가가 있었기 때문에 많은 부분이 수정되었다. 그리고 그런 변경점이 UWP엔진에는 전혀 반영되지 않은 상태였다.
지난 몇일간 열심히 지루한 작업을 해서 UWP의 DX11엔진에 그동안의 변경사항을 모두 적용시켰다.
뭐 겉보기엔 복셀 오브젝트 렌더링이 추가된것 뿐이지만 내부적으로는 정말 많이 바뀌었다.
UWP 버전의 경우 충돌처리 엔진이 싱글스레드로 작동했는데 그것도 데스크탑 버전과 같은 완전한 멀티스레드 기반으로 바꿨다.
그리고 그 와중에 DirectX 11 Feature Level9 렌더러는 일단 프로젝트에서 제외시켰다.
복셀 오브젝트를 렌더링하는데 Geometry Shader를 쓰는데 Feature Level 9로 돌리려면 굉장히 귀찮은 작업이 필요하다. 점 리스트를 주고 Geometry Shader에서 육면체를 만들어내야하는데 이건 Vertex Shader로 대신할수가 없다. 바깥쪽 코드에서 육면체 리스트를 만들어서 버텍스 버퍼에 넣어줘야하는데 Feature Level 11코드와 너무 많은 차이가 생긴다. 추가작업이 너무 많다.
어차피 FeatureLevel 11을 지원하지 않는 장비로 게임을 할 수 있다고 생각되지 않는다.
내가 루미아 1520을 포기하고 차라리 루미아 950을 새로 사고 말지. 폰 디바이스를 위해서도 더 이상 그런 귀찮은 작업을 하고 싶지 않다. 그래서 그냥 버렸다. 뭐 마음 바뀌면 다시 살릴지도 모르겠다만.
하여간 그래서 포팅을 대충 완료했다.
일단 잘 돌아감.
첨부한 스샷에서 왼쪽 UWP버전, 오른쪽이 데스크탑 DX12버전이다.
폰트 렌더링쪽이 미묘하게 다를것이다. UWP에선 DirectWrite를 사용하고 데스크탑 버전에선 GDI를 사용해서 그렇다.뭐 그 외에는 눈에 띄게 차이가 드러나진 않는다.
현재 UWP엔진의 네트워크 코드는 UWP에서 지원하는 API-StreamSocket으로 작성되어있는데 이것은 조만간 winsock+IOCP로 바꿀 것이다.
예전에 만들어둔 IOCP네트워크 라이브러리를 UWP로 포팅할 예정이니까. 그걸 갖다붙일 생각이다.
먼저 포스팅한바 있다시피 Redstone빌드에서부턴 IOCP를 지원한다.
속도도 빠르고 직관적이고 기능도 뛰어난 winsock + IOCP를 사용하지 않을 이유가 없다. 지원만 된다면 말이다.
그리고 이번 프로젝트의 목표는 다음과 같다.
1. MSX용 warroid비슷한 게임을 만든다.
2. 멀티플레이 가능. Dedicated Server, 및 Local Server지원
3. Desktop DX11/DX12 버전, UWP DX11/DX12버전 지원
4. XBOX ONE지원(UWP)
현재까지 만들어놓은걸로 볼때는…가능은 할것 같다.
게임 데모 자체는 별로 그럴싸하지 않겠지만.