directx + c++을 이용한 windowsstore app과 windows phone용 게임 개발

52
C++과 DirectX를 이용한 Windows Universal App 게임 프로그래밍 Visual C++ MVP 유영천 twitter:@dgtman http:yuchi.net http://blog.naver.com/shovelmaster

Upload: -

Post on 16-Jul-2015

495 views

Category:

Software


10 download

TRANSCRIPT

Page 1: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

C++과 DirectX를 이용한Windows Universal App

게임 프로그래밍

Visual C++ MVP 유영천

twitter:@dgtman

http:yuchi.net

http://blog.naver.com/shovelmaster

Page 2: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

강연 목표

• Win32 + DirectX + C++이 이미 익숙한 프로그래머가Windows Store App과 Windows Phone포팅을 쉽게 하도록 팁을 제공한다.

• 자세한 프로그래밍 테크닉은 다루지 않습니다. 개요만…문서보고 직접 해보세요.

Page 3: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

• DirectX 개발경력 있음 ->이렇게 저렇게 하면 내가 만든 게임을 Windows Store App과 Windows Phone으로 포팅할 수 있겠군!

• DirectX 사용 경험 없음 -> 저렇게 개발하는 방법도 있구나. 참고지식 습득!

Page 4: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

App개발 관점에서 본Windows 플랫폼별 차이

Page 5: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Windows Desktop

• 모든 x86용 Windows버전

• Windows 2000/XP/2003 Server -> NT 5.x

• Windows Vista/7/8/8.1 -> NT 6.x

• Win32 API , .NET 사용

• DirectX, OpenGL 사용

• 흔히 말하는 PC게임은 모두 Windows Desktop용 게임.

• 게임 프로젝트라면 일반적으로 Win32 + DirectX + C++

Page 6: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Photoshop CC Visual Studio 2013

Windows Desktop Applications

Page 7: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Windows 8 or Later

• Windows 8/8.1 , Windows Server 2012/2012R2

• 기존 Windows API 그대로 지원 (Win32, WPF등)

• 통칭 WinRT(Windows Runtime)이라 부르는 API탑재.

• Windows 8/8.1/Windows RT용 앱은 공식적으로 Windows Store App으로 칭함.

• C++ / Java Script/ C#으로 개발 가능.

• Windows Store 를 통해서 배포.

Page 8: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Windows RT

• Windows 8/8.1의 ARM 버전.

• Windows RT는 내부적으로 Win32(MFC포함)와 .NET을 완전히지원하지만 정책적으로 외부에서의 개발을 차단. 컴파일만 다시하면 기존 Windows Desktop App도 돌아감.

• 공식적으로는 WinRT App앱만 개발가능

• C++ / Java Script/ C#으로 개발 가능.

• Windows Store 를 통해서 배포.

• 최근 사실상 사망선고가 내려짐.(100만원 주고 산 내 Surface RT는…T_T)

Page 9: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

XBOX Music Windows Store

Windows Store Apps

Page 10: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Windows Phone 8.1

• 흑역사였던 WinCE를 버리고 NT Kernel로 태어난 MS의 스마트폰 OS.

• WinRT(Windows Runtime) API를 사용.

• 일부 Win32 API사용 가능.

• DirectX 사용 가능 (C++로만 가능).

• C#,C++,Java Script로 개발.

• Windows Phone Store로 배포.

Page 11: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Windows Phone Store Health App

Windows Phone Apps

Page 12: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Platform CPU OS API Tool Language Debugging Type

Windows Desktop x86,x64 Windows 95 ~ Win32,.NET,DirectX 9,DirectX 11

Visual Studio(All) C/C++C#

Local ,Remote-LAN

Windows Store App

x86,x64, ARM

Windows RT,Windows 8 ~Windows Server 2012~

WinRTDirectX 11

Visual Studio 2012/2013 C++/CX ,C# ,Java Script

Local ,Hyper-V Simulator ,Remote-LAN

Windows Phone 8.1

ARM Windows Phone 8.1 WinRT, Winsock,DirectX 11

Visual Studio 2012/2013 C++/CX ,C#

Hyper-V Emulator ,Remote-USB Cable

iOS ARM iOS COCOA Touch,OpenGL ES

XCode Objective C ,C/C++

Remote-USB Cable

개발방식에서의 차이

Page 13: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Windows Store App 개발의 간략소개

• Win32API는 대부분 사용하지 못한다.

• WinRT API는 C# , C++ , Java Script를 지원한다.

• DirectX는 C++로만 사용할 수 있다.

• UI체계 XAML UI라고 하는 XAML스크립트를 사용한다.

Page 14: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Windows Store App 개발의 간략소개

• XAML UI와 DirectX를 조합해서 사용하는 것이 가능하다.

• 웬만한 I/O처리는 죄다 비동기. Lambda함수를 적극 활용.

• C/C++ Runtime Library는 대체로 사용 가능하나 I/O함수는 제한적, Process,Thread쪽 함수들 사용 불가.

• HTTP클라이언트 기반의 앱이라면 매우 쉽게 만들 수 있다.(Youtube앱이 난립하는 이유)

Page 15: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

• WinPRT를 사용.기본적으로는 WinRT용 코드를 거의 그대로 사용할 수 있다.

• WinRT의 제약사항 + WinPRT의 제약사항을 가지고 있다.

• XAML UI는 C#만을 지원한다.C++ 사용 불가.

• XAML UI를 C#으로 작성하고 DirectX코드를 C++로 작성하는 방법이 있는데 굉장히 꿀꿀하다. MS에서도 별로 권장하진 않는것같다.

• 사실상 게임 개발은 C++, 일반앱은 C#으로 작성해야한다.

Windows Phone 8 개발의 간략소개

Page 16: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

• WinPRT를 사용.기본적으로는 WinRT용 코드를 거의 그대로 사용할 수 있다.

• WinRT의 제약사항 + WinPRT의 제약사항을 가지고 있다.

• XAML UI는 C#만을 지원한다.C++ 사용 불가.

• XAML UI를 C#으로 작성하고 DirectX코드를 C++로 작성하는 방법이 있는데 굉장히 꿀꿀하다. MS에서도 별로 권장하진 않는것같다.

• 사실상 게임 개발은 C++, 일반앱은 C#으로 작성해야한다.

Windows Phone 8 개발의 간략소개

이제필요없음!!!

Page 17: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

• Windows 8.1과 Windows Phone 8.1은 API가 WinRT로 통합됨

• Windows Phone 8.1의 WinRT는 Windows 8.1의 WinRT를 95%이상 지원함.

• 따라서 동일 코드로 Windows Store App과 Windows Phone을 함께 지원하는것이 가능함.

• XAML UI를 제외하고 대부분의 코드를 공유할 수 있다.

• 정확히는….Windows Store앱 개발이 베이스가 되고 Windows Phone으로의 포팅이 쉬워짐.

Universal App

Page 18: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Universal App

OneDrivePlayer for Windows Phone OneDrivePlayer for Windows Store App

Page 19: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Universal App 의 허와 실

• Universal App이라도 XAML UI는 따로 만들어야 한다.

• 일반앱의 경우 XAML UI개발이 전체 작업량의 절반 이상인 경우도 많다. -> 메리트 없다-_-;

• 게임은 UI를 게임 자체적으로 제공한다.

• XAML UI를 거의 사용하지 않는다. -> Universal App으로 개발하는 것이 이득.

• New 프로젝트 에서 유니버셜앱을 선택하는것만으로 만사 OK!

Page 20: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Universal App 프로젝트 만들기

• 프로젝트 생성시 Universal App 을 선택하는것만으로 OK!

Page 21: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Windows Store App을 위한 소스 및리소스 파일을 추가

Windows Phone App을 위한 소스 및리소스 파일을 추가

공용으로 사용할 소스 및 리소스 파일을 추가

Page 22: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

WinRT + DirectX로 게임개발

• 자체 엔진 개발과 같은 얘기.

• 상용엔진 있는데 뭣하러? -> 오늘의 주제가 아닙니다.

• C++/CX로 개발. DirectX는 C++로만 제어 가능. C#으로 불가능.

• DirectX 11로 개발. DirectX 9랑 많이 다릅니다.

• OpenGL 사용 불가.

Page 23: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

WinRT 개발의 장애물

• C++/CX ->들어는 보셨나…?

• 대부분의 Win32 API 사용불가.

• C/C++ Runtime Library의 반쪽 지원.

• API는 DX11이지만 HW는 DX11은 지원 못하는 경우가 대부분.

• 폴더별 억세스 제한.

Page 24: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

C++/CX• C++11의 일부기능을 추가한 MS의 C++확장

• COM기반. 그러나 AddRef(),Release()는 사용하지 않는다. 컴파일러가 알아서 넣어줌.

• 처음엔 굉장히 부담스럽지만 익숙해지면 참을만함.

• 게임 코드 및 엔진 코드에선 사용할 일 없음.

• 패스워드 입력, 텍스트 표시 등 XAML UI와 게임화면의 상호작용을 위해서사용

• 터치입력, 네트워크 처리 정도에 사용.

Page 25: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

C++/CX example

Page 26: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

DirectX on WinRT• DirectX 11사용

• 대부분의 ARM 디바이스들은 Feature Level 9.x만 지원.

• 런타임에 Shader컴파일 불가. 컴파일된 바이너리만 사용가능.

• D3DX사용 불가. 대신 DirectXTex 사용(http://directxtex.codeplex.com/)

• SwapChain생성부가 Desktop버전과 다름. 그 외에는 거의 동일.

• Xinput사용가능->XBOX360 Controller도 사용 가능.

Page 27: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

DirectX on WinRT @ Windows Phone

• WinRT버전의 모든 제약사항을 포함

• Windows Phone 8에는 D2D와 DWRITE사용불가, 8.1에선 사용가능!!!!

• Xinput사용 불가 -> Hardware Controller지원 안됨.

• 그 외에는 Windows 8.1과 동일

Page 28: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Shader

• HLSL사용

• 실시간 컴파일 불가. 컴파일된 바이너리만 사용가능.

• SM2.0을 사용해도 되지만 코드호환성을 위해 4.0 level 9 사용을 권장.

• FXC로 컴파일시 vs_4_0_level_9옵션을 준다.

• Visual Studio에서 컴파일 가능하지만 다양한 옵션을 위해서는 옵션조합에 따라 개별 바이너리들로 컴파일해서 사용하는게 좋다.

Page 29: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Windows Phone 에서 Shader사용 예

1. Windows Store App x86/x64 debug버전으로부터 런타임시Shader컴파일 -> Shader 캐시파일 생성.

2. Shader 캐시파일 -> Windows Phone 프로젝트에 content로추가.

3. Windows Phone 렌더러에서는 실시간 컴파일 하지 않고shader cache파일로부터 shader생성.

Page 30: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Windows Phone 에서의 D3D성능

• 안드로이드만큼 파편화가 심하지는 않다. Qualcom의 AP사용.

• GPU는 대체로 adreno 225 - 330.

• 속도는 생각보다 빠른 편.

• .DDS파일 그대로 사용할 수 있다.

• 2048*2048 텍스쳐도 읽어들인다.

Page 31: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Network Programming on WinRT

• WinRT에서는 winsock사용 불가(-_-)

• Windows Phone 에서는 winsock사용 가능

• 어차피 WinRT로 개발할거니까 winsock안쓴다.-_-;

• Windows::Networking::Sockets::StreamSocket를 사용한다.

Page 32: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Network Programming on WinRT

• 모든 I/O는 비동기 처리

SOCKET -> Windows::Networking::Sockets::StreamSocket

Send -> Windows::Storage::Streams::DataWriter

Recv -> Windows::Storage::Stremas::DataReader

Page 33: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

소켓 생성

Page 34: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

비동기 패킷 수신

Page 35: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

비동기 패킷 전송

Page 36: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Asset추가

• Asset들은 프로젝트에 포함시키고 Property에서 Contents항목을 true로 체크해준다.

Page 37: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Asset 폴더구조

• 계층구조는 가지지만 상위 폴더와 하위 폴더를 오가는건 불가능.

• chgDir(), SetCurrentDirectory(), GetCurrentDirectory() 사용 불가. -> 엄청나게 치명적이다.

Page 38: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Asset 폴더구조

Page 39: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

저장공간

• 앱이 인스톨된 폴더에는 쓰기 불가.

• Windows Store App과 Windows Phone 모두 Local Storage라고 하는 영역을 제공. 쓰기는 이 곳에.

-> C:\users\AppData\Local\Packages\AppID\LocalState

• 지정된 폴더와 App폴더 바깥의 파일을 억세스하려면 FilePicker를 사용해야함.(자막 자동으로 읽어주는 동영상 플레이어가 없는 이유)

Page 40: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Debugging

Page 41: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Debugging

• Crt Heap함수들은 모두 정상 작동한다.

• App종료 개념이 없다. 따라서 Heap Corruption과 Memory Leak 체크를 해야할 타이밍이 모호하다.

• 임의로 종료 시점을 정의하자.

• Debugger가 붙어있는 경우 Suspend 이벤트를 종료 이벤트로간주하기로 하자.

• 여기서 Cleanup을 수행하고 Memory Leak체크 및 Heap Corruption체크를 한다.

Page 42: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Suspend시점에 Cleanup

Page 43: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

COM객체의 Reference Count확인

• DX 객체들처럼 IUnknown이면 아래처럼…(x86기준)

Page 44: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

^타입 COM객체의 Reference Count확인

• ^타입은 내부적으로 Iinspectable : IUnknown객체이다.

• 아래처럼 IUnknown포인터를 얻을 수 있다

• IUnknown을 얻으면 Reference Count확인 가능

Page 45: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

D3D Resource Leak체크• D3DDevice11객체의 Reference Count가 0이 되는지 확인. 0이 아니면 해제되지 않은 리소스가 존재함.

Page 46: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

개발 TIP

• Windows Desktop 버전으로 먼저 개발한다. 그 다음 WinRT로포팅

• WinRT는 Current Path라는 개념 자체가 없으므로 Relative Path를 저장할 자료구조를 만드는게 좋다. (./ , ../ 등…)

• 지원되지 않는 Win32용함수와 데이터 타입의 경우 똑같은 이름의 함수와 데이터타입을 정의해둔다.

Page 47: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Ex)GetClientRect()함수와 HWND는 WinRT API에선 정의되지 않는다.

포팅을 용이하게 하기 위해 비슷한 기능을 하도록만들거나 껍데기만 만들어둔다.

Page 48: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

점진적인 포팅

• Windows Desktop DX9 & DX11에서 시작

• Win32API는 대부분 걷어내야함.

• 굉장히 먼 길 같지만 Desktop DX9-> DX11로 포팅하는것만으로도 절반은 완료. 절반 가는데 얼마 걸리려나…

• Window Desktop -> WinRT까지 도달했다면 iOS포팅도 어렵지않음.

Page 49: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Windows Desktop DX9

Windows Desktop DX11

Win Store App DX11

Windows Phone DX11

iOS & Android

• DX9 API -> DX11 API• SM2.0 -> SM4.0/5.0

• SwapChain코드 수정• Win32API제거• Shader Pre-Compile• Message처리 코드 수정

• 입력장치 맞춰서 코드 수정

• DirectX -> OpenGL ES• Message처리 수정• .DDS textures-> .PVR, .ETC textures• DirectWrite Font -> COCOA UI Font

Page 50: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Windows Desktop -> Windows Store App & Windows Phone

• 개발했던 PC용 MMORPG를 Desktop DX9 -> Desktop DX11 -> Windows Store App & Windows Phone으로 포팅했음.

• 네트워크 연동한 플레이 가능.

• http://youtu.be/iZkxorgAxcg

Page 51: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

시연 – (가칭)VOXEL HORIZON

Page 52: DirectX + C++을 이용한  WindowsStore App과 Windows Phone용 게임 개발

Reference

• http://channel9.msdn.com/Series/Introduction-to-C-and-DirectX-Game-Development

• Modern C++ and Windows Store Apps. Sridhar Poduri

• http://developer.windowsphone.com/