NHN NEXT 게임 서버 프로그래밍 강의 자료입니다. 최소한의 필요한 이론 내용은 질문 위주로 구성되어 있고 (답은 학생들 개별로 고민해와서 피드백 받는 방식) 해당 내용에 맞는 실습(구현) 과제가 포함되어 있습니다.
참고로, 서버 아키텍처에 관한 과목은 따로 있어서 본 강의에는 포함되어 있지 않습니다.
NHN NEXT 게임 서버 프로그래밍 강의 자료입니다. 최소한의 필요한 이론 내용은 질문 위주로 구성되어 있고 (답은 학생들 개별로 고민해와서 피드백 받는 방식) 해당 내용에 맞는 실습(구현) 과제가 포함되어 있습니다.
참고로, 서버 아키텍처에 관한 과목은 따로 있어서 본 강의에는 포함되어 있지 않습니다.
NHN NEXT 게임 서버 프로그래밍 강의 자료입니다. 최소한의 필요한 이론 내용은 질문 위주로 구성되어 있고 (답은 학생들 개별로 고민해와서 피드백 받는 방식) 해당 내용에 맞는 실습(구현) 과제가 포함되어 있습니다.
참고로, 서버 아키텍처에 관한 과목은 따로 있어서 본 강의에는 포함되어 있지 않습니다.
NHN NEXT 게임 서버 프로그래밍 강의 자료입니다. 최소한의 필요한 이론 내용은 질문 위주로 구성되어 있고 (답은 학생들 개별로 고민해와서 피드백 받는 방식) 해당 내용에 맞는 실습(구현) 과제가 포함되어 있습니다.
참고로, 서버 아키텍처에 관한 과목은 따로 있어서 본 강의에는 포함되어 있지 않습니다.
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~YEONG-CHEON YOU
Windows 10의 UWP 앱을 개발하면 모든 Windows 10 디바이스에서 앱을 작동할 수 있습니다.
이 UWP 앱을 C++로 개발할 수 있습니다. C++로 앱을 개발하면 크로스 플랫폼 지원의 유리함, 기존 코드의 재활용, 성능향상 등의 이점이 있습니다. 본 세션에서는 몇 가지 예를 들어 C++로 UWP 앱을 개발하는 방법을 소개하며 특히 win32와 C++을 사용하던 개발자가 쉽게 UWP 앱 개발에 적응할 수 있도록 돕습니다.
2. GPGPU(General-Purpose computing on GPU
• GPU를 사용하여 CPU가 젂통적으로 취급했던 응용
프로그램들의 계산을 수행하는 기술
• GPU 코어 1개의 효율은 CPU 코어 1개에 비해 많이
떨어지지만 코어의 개수가 엄청나게 많다.
• 많은 수의 코어를 사용하면 산술술 연산
성능(Throughput)은 CPU의 성능보다 훨씬 뛰어나다.
7. GPGPU의 특징
강점
• 엄청난 수의 스레드를 사용할
수 있다.
• 부동소수점 연산이 엄청
빠르다.
• 컨텍스트 스위칭이 엄청
빠르다.
• 그래서 충분히 병렬화된
산술처리에는 짱.
약점
• 흐름제어가 per SM으로
이루어진다.(2인3각 경기)
• 흐름제어 성능이 CPU에 비해
많이 떨어진다.
• 프로그래밍 기법의
제약(재귀호출불가)
• Core당 클럭이 CPU에 비해 많이
느리다(1/4 – 1/3수준)
14. GPGPU를 게임 프로젝트에 적용할 수
없을까?
• GPU의 엄청난 성능을 썩히고 싶지 않아!!!
• 병렬처리가 가능하면 좋을 것 같다는 느낌이 올
때가 있다.
– Light map 구우면서 꾸벅꾸벅 졸 때.
– 서버에서 충돌처리를 하는데 CPU점유율이 98%
– Xeon 8 core CPU는 너무 비싸!!!
15. 게임 프로젝트 적용의 난점
• 유져의 장비가 GPGPU를 지원한다는 보장이
없다.(CUDA는 오로지 nvidia제품만 지원한다.
• 게임코드의 대부분은 의존성이 강하다. 즉
병렬처리에 적합하지 않다.
• 디버깅이 어렵다.
16. • 유져의 장비가 GPGPU를 지원한다는 보장이 없다.(CUDA는
오로지 nvidia제품만 지원한다.
– 게임 서버나 툴에서 사용한다.
– 게임 클라이언트에는 Direct Compute Shader를 사용한다.
• 게임코드의 대부분은 의존성이 강하다. 즉 병렬처리에
적합하지 않다.
– 병렬처리 할 수 있는 영역을 찾아보자.충돌처리라든가.
• 디버깅이 어렵다.
– CUDA + Parallel NSight를 사용한다.
그래도 게임프로젝트에 적용해보자.
17. CUDA (Compute Unified Device Architecture)
• C언어 등 산업 표준 언어를 사용하여 GPU에서
작동하는 병렬처리 코드를 작성할 수 있도록 하는
GPGPU기술
• nvidia가 개발,배포.그래서 nvidia GPU만 가능.
• PhysX,APEX,NVEncoder등 nvidia의 API들이 CUDA를
사용.
18. CUDA의 장점
• 자료가 많다.
• 유일하게 GPU상에서의 디버깅이 가능하다.
• C/C++에서의 포팅이 쉽다.
• 현재 나와있는 제품 중 가장 앞서있다.
– Dynamic parallelism, Hyper-Q, Unified Virtual
Addressing,…
21. 서버에서 충돌처리를 하면 좋은 점
• 위치,속도 Hack의 원첚 봉쇄
• 서버측에서 능동적으로 이것저것 하기 좋음
• 정밀한 위치 추척 가능(30,60프레임 단위로 처리 가능)
• 클라이언트에서 플레이어 제어하듯 서버에서도
플레이어,NPC,몬스터의 이동을 프로그래밍 가능.
22. CPU->GPGPU의 장점
• Throughput과 Responsibility를 향상시킨다.
• 비용을 줄인다
– [xeon급 이상에 한해서] 2배 성능의 CPU로
업그레이드 하는 것보다 2배 성능의 GPU로 GPU로
업그레이드 하는 편이 훨씬 싸다.
• 확장성이 좋다. GPU업그레이드에 따라 코드를
(거의) 수정하지 않아도 된다.
• 서버의 CPU자원을 남겨둘 수 있다.
23. 구현 포인트
• 게임 오브젝트는 -> 타원체
• 건물,지형 -> 삼각형 집합
• 타원체 -> 1 Block에 대응
• Block내의 스레드들이 협력하여 충돌검출 및 리액션 처리
• Ex)
– 미끄러짐 예제
– 반사 예제
– 게임 클라이언트 적용 예제1
– 게임 클라이언트 적용 예제2
28. Baking Light Maps
• 건물,지형등 정적인 매시에 대해서 라이팅된
상태를 텍스쳐에 구워놓는다.
• Ambient Occlusion이나 Radiosity를 적용하려면
baking시갂이 엄청나게 오래 걸릮다.
• 텍셀갂 의존성이 거의 없고 throughput이
중요하므로 GPGPU로 처리하기에 매우
적합하다.
29. 구현 포인트
• 게임의 맵에서 정적 라이트를 표현하는 Light Map을
CPU가 아닌 GPGPU(CUDA)로 굽는다.
• Directional Light, Omni Light계산 후 Radiosity로
난반사를 처리한다.
• Scene을 미리 KD-Tree로 만들어둔다.CUDA Global
Memory상에서 Tree를 빌드하는 것이 까다로울 수
있다.
• Texel당 CUDA 1 Thread로 처리한다.
• KD-Tree Traversal참고
30. 성능
• 테스트 조건
– Light Map의 Texel수 = Patch수 = 386918개
– Directional Lighting후 1 pass Radiosity처리에
걸리는 시갂 측정
36. 기본원리
• Occluder(raw맵 데이타나 거의 꼭 맞는
바운딩매쉬)를 그려서 Z-Buffer를 구성한다.
• Occludee(아마도 캐릭터나 맵데이타,기타 배치
가능한 오브젝트)를 그리되 pixel은 write하지
않고 z-test만 한다.
• 그려지는 픽셀 수를 GPU측 메모리에
기록해둔다.
• 나중에 GPU로부터 픽셀수를 얻어온다.
37. 구현 포인트
• 갂략화된 Occluder매시(건물,산 등)를 z-buffer에
그릮다.
• Z-buffer의 mip-chain을 생성한다.
• Occludee의 경계구 목록을 Compute Shader로
넘긴다.
• Compute Shader에서 Occludee 경계구의 사이즈에
맞는 z-map을 선택하고 z값을 비교한다.
• Compute Shader에서 버퍼에 저장한 결과를
CPU측에서 읽어온다.
38. Compute Shader사용의 장점
• 다수의 Occludee에 대해 병렬적으로 Z-Test를
수행할 수 있다.
• Z-Buffer에 Lock을 걸어서 메모리로 읽어오지
않아도 된다.(속도 차이가 엄청나다!)
39. 성능
<입력 오브젝트 대략 700개일때>
Method Objects FPS
No Occulusion Culling 376 430
D3DQuery Occlusion Culling 31 561
Hierarchical Z Map Occlusion Culling
– Compute Shader
31 713
테스트하는 Occludee 개수가 많아질수록 격차가 더 커짐
48. 병렬화에 적합한지를 따져보자
부적합한 경우
• 분기가 많다.
• 각 요소들의 의존성이
높다.(병렬화 하기 나쁘다)
• Throughput보다
Responsibility가
중요하다.(100ms or
50ms에 목숨을 건다!)
적합한 경우
• 코드에서 분기가 적다.
• Image Processing처럼 각
요소들의 의존성이 낮다.
– (병렬화 하기 좋다.)
• Throughput이 중요한
경우.(3일걸리던 작업을
1일로 줄였다!!!)
49. GPGPU적용시 고려사항
• 용도 – 병렬화에 적합한지
• 비용 – CPU vs GPU추가 비용
• 유지보수 – 디버깅과 코드 작성 비용
• 확장성 – CPU추가 or GPU업그레이드시
성능향상폭