지난 10여년간 수많은 온라인 게임 서버가 Windows NT의 스레드풀 API – I/O Completion Port(이하 IOCP)를 사용해왔다.
그 중에는 IOCP를 사용해서 서버/클라이언트 공용 네트워크 라이브러리를 구현한 경우도 있을 것이다. 바로 내가 그렇게 구현해서 사용해왔다.
매우 유용하게 잘 사용해왔으나 Windows Store App이 처음 나왔을때, 그러니까 Windows 8의 WinRT API였을때 이 바보같은 API는 winsock과 thread API들을 지원하지 않았다.
그리고 Windows 10의 UWP API에 이르러서야 winsock과 thread API들을 지원했다.
다만 IOCP는 여전히 지원하지 않았다. 기존에 데스크탑용으로 만든 네트워크 라이브러리 코드는 UWP용으로는 사용할 수 없었다.
그러던것이 올해 여름에 업데이트 되는 Windows 10 Redstone빌드(공식 네이밍은 Windows 10 Anniversary Update)에선 드디어 지원되는 모양이다.
물론 MS는 이 얘길 한마디도 꺼낸적이 없다. 뭐 이전에 Windows 10 발표하면서 UWP에서 winsock지원할때도 아무 얘기도 안했다. 뭔가 인정하고 싶지 않아서 그런건지 쓰지 말라는 의미인건지..-_-
하여간 나는 IOCP가 언젠가 UWP에서 지원될거라고 확실히 믿어왔기 때문에, 그리고 Windows 10에 이르러 winsock과 thread api를 지원했으니 이쯤이면 IOCP도 지원하지 않을까 해서 테스트를 해봤다.
IOCP 오브젝트는 CreateIoCompletionPort()함수를 호출해서 만든다.
이 함수가 호출 가능한지를 테스트 해보면 된다.
간단한 UWP프로젝트를 하나 만든다. 타겟 빌드는 10.0.10586.0 현재 Windows 10의 정식 빌드이다.그리고 CreateIoCompletionPort()를 호출해본다.
예상하듯 다음과 같이 빌드에 실패한다.
그런 함수 없댄다.
빌드 타겟을 바꾼다. Redstone빌드로. 물론 사전에 Redstone SDK는 설치되어있어야한다. 현재 내 머신에는 Windows 10 Preview SDK 14332가 설치되어있다.
만세~
이제 기존에 만든 온라인 게임용 네트워크 라이브러리를 거의 수정하지 않고 UWP로 가져올 수 있게 됐다.
아마도 GDI를 제외한 거의 모든 win32 API는 UWP API로 돌아오게 될 것이다. MS가 왜 이런걸 하느냐고 하면 데스크탑 어플리케이션 수준의 성능을 가지는 UWP앱의 필요성을 느끼기 때문이다.
최근 AAA PC/콘솔 게임들이 UWP로 출시되고 있는데 이것도 다른 맥락이 아니다.
그리고 이런 대작 게임이나 다양한 기능을 가진 어플리케이션들이 UWP앱으로 출시되려면 API개선이 필요하다. 이제는 MS도 이 점을 받아들이기로 한것 같다.
이젠 UWP로 뭘 좀 해볼 수 있을것 같다.