UWP + C++/CX 로 OneDrive앱 개발하기

그저 내가 개발중인 게임과 툴에서 OneDrive에 억세스 하고 싶었다. C++에서 C#코드를 부를 생각은 없었다. 네이티브 C++로 하고 싶었다. 예전에 Casablanca(C++ Rest SDK)를 사용해서 OneDrivePlayerW81이란 앱을 만든 적이 있다. 그때 Casablanca 쓰면서 엄청 짜증났던 기억이 있다. 그래서 이번엔 Casablanca를 쓰지 않고 UWP API와 C++/CX로 구현할 생각이다. 일단 UWP 앱이지만 데스크탑앱에서도 UWP의 HttpClient를 사용할 수 있으므로 추후 … More UWP + C++/CX 로 OneDrive앱 개발하기

Debugging – App의 명시적 종료의 필요성

적어도 디버그 빌드에 한해서라도 어플리케이션은 반드시 명시적 종료가 있어야한다. 명시적 종료 상황에서 힙을 비롯한 모든 리소스가 완전하게 해제되었는지 체크할 수 있어야 한다. 무엇보다 heap이 손상되었는지를 체크할 수 있어야한다. 명시적 종료할때 이걸 체크하지 않으면 눈에 띄지 않는 버그가 계속 쌓임. 시한폭탄임. 실제로 내가 만들던 게임 서버에서 그런 사건이 있었다. 사내 테스트 하루 전날 팀 내 플레이 … More Debugging – App의 명시적 종료의 필요성

오래된 디버깅 얘기 한 토막

2003년인가 2004년에 Visual Studio .NET 따위엔 아무도(적어도 게임업계에선) 관심 없었고 Visual C++ 6.0으로 개발하던 시절에 스택 프레임의 리턴 어드레스가 정상인지 판별하기 위해서 컴파일러가 해줄 수 있는게 없었다. 내가 다니던 회사의 C모 온라인 서버가 동접 1000만 넘어가면 죽어나갔는데 아무도 원인을 몰랐음. 디버거로 보면 IP(Instruction Pointer)가 엉뚱한 어드레스로 튀어있으니 리턴 어드레스에 잘못된 값이 들어간걸로 보이는데 대체 그게 … More 오래된 디버깅 얘기 한 토막

SSE를 이용한 4샘플 무분기 치환 for SW Occlusion Culling

요 근래에 Voxel 오브젝트 컬링을 위해 SW Occlusion Culling을 사용한다고 포스팅 했었다. SW Occlusion Culling이라봐야 별거 없다. 잠깐 그 내용을 상기해보면… CPU측에서 사용할 수 있는 Z-Buffer(그냥 32bits float타입의 메모리 버퍼)를 잡는다. Voxel오브젝트의 Min박스의 z값을 그린다. z값이 기존 값보다 작거나 같을 경우만 덮어쓴다. 이후에 테스트할 다른 Voxel오브젝트의 Max 박스의 z값을 z-buffer의 값과 비교한다. 기존값보다 z값이 작으면 … More SSE를 이용한 4샘플 무분기 치환 for SW Occlusion Culling

Engine Dev – Deferred Shading적용

D3D12엔진을 Forward Shading에서 Deferred Shading체계로 바꿨다. 아니 정확히는 Lighting은 Forward로 두고, 그림자 처리는 Deferred로 바꿨다. 부분적이지만 Deferred Shading으로 바꾼 이유는 대량의 Voxel을 출력할때 self-shadow를 적용하면 forward에선 와장창 느려지기 때문이다. 사실상 상당히 많은 voxel들이 가려져서 보이지 않음에도 불구하고 보이지 않는 voxel들까지도 depth-test를 하고 있는게 꽤 심각한 성능저하를 가져왔다. 이 부분은 Deferred Shading으로 바꾸고 확실한 속도향상을 기대하고 있다. … More Engine Dev – Deferred Shading적용

GetTickCount() -> GetTickCount64()로 변경하기.

1. Redstone에선 UWP에서 IOCP를 쓸 수 있다. 그래서 개발중인 프로젝트의 UWP버전에서 StreamSocket을 사용한 네트워크코드를 걷어내고 IOCP기반의 win32코드로 교체하기로 결정. 2. 코드 고치다보니 GetTickCount()가 거슬림. PC가 부팅되고 최대 47일밖에 보장이 안되는 카운터라 안그래도 계속 바꾸려고 생각하고 있었음. 좋다. GetTickCount64()로 바꾸자. 3. 이게 조심해서 고쳐야 하는게  4바이트에서 8바이트로 사이즈가 증가하는거라 메모리 옵셋으로 다루는 부분이 있는지 확인하고 언더플로우나 … More GetTickCount() -> GetTickCount64()로 변경하기.

Windows 10 Redstone의 UWP에서 IOCP사용 가능.

예전에도 언급했지만 Windows 10 Redstone에선 UWP에서도 IOCP사용가능하다. 예전에 만들었던 IOCP 네트워크 라이브러리를 UWP로 포팅완료했다. 잘 작동한다. 수정한 코드는 클라이언트에서 사용시 소켓이벤트를 통보하기 위한 HWND와 PostMessage()를 CoreDispatcher와 람다함수로 바꾼것 뿐. 스레드와 winsock코드는 한줄도 안고치고 빌드 성공. 이제 UWP로 서버도 만들 수 있다.… 만세~

Clipping Triangle for SW Occlusion Culling

어제 x:-1 – +1, y:-1 – +1, z:0 – +1 볼륨에 대해 삼각형 클리핑 코드를 완성했고 잘 작동함을 확인했다. 그런데 카메라 돌리다보면 삼각형이 사라지거나 원래 삼각형의 빗면과 같은 기울기로 엉뚱한 곳에 삼각형이 나타나는 현상이 발생함. 원인 찾느라 엄청 해맸다. [원인] 커다란 삼각형의 점 일부가 카메라 뒷쪽으로 가는 경우, 프로젝션하고 보면 w값이 음수가 나옴. 이 경우 … More Clipping Triangle for SW Occlusion Culling