3. IGC(INVEN GAME CONFERENCE) 2018
소개
PC, Mac, PS4, Xbox One, iOS, 안드로이드, 닌텐도 스위치
모든 유저들이 같이 크로스 플레이 가능!
● 같은 콘텐츠 – 콘솔/PC 부터 모바일까지 아주 넓은 영역의 하드웨어 지원
● 게임 콘텐츠도 같이 계속 업데이트
○ 새로운 기능들 (자동차, 코스튬, 새로운 게임 모드)
도전 과제들 - 멀티플랫폼 지원
7. IGC(INVEN GAME CONFERENCE) 2018
● 게임 플레이어들을 아래에 기초해 Significance Bucket 에 할당:
○ 거리
○ 화면에서의 크기
○ 보이는지 여부
● 많은 스케일러빌티티(scalability) 시스템을 컨트롤
● 엔진 기능!
○ 하지만 게임에 의존적
SIGNIFICANCE MANAGER
플레이어
중요도 높음
중요도 낮음
다른 플레이어
8. IGC(INVEN GAME CONFERENCE) 2018
애니메이션 - UPDATE RATE OPTIMIZATION
● 애니메이션 계산을 줄이는 엔진 기능
● Significance 에 의해서 컨트롤됨
URO 없음 URO 4 URO 10 URO 4 – 보간 없음
10. IGC(INVEN GAME CONFERENCE) 2018
애니메이션 – 모듈형 캐릭터
● 5개의 메쉬로 이루어진 모듈형 캐릭터
● 각 파츠가 애님 블루프린트를 따로 가지고 있음!
1 – 기본 스켈레톤
2 - 머리
3 - 몸
4 - 가방
5 - 무기
11. IGC(INVEN GAME CONFERENCE) 2018
애니메이션 – 네이티브 코드화 작업
● 매 Tick 마다 일어나는 이벤트 그래프의 블루프린트를 C++로 변경
최적화 전
0.93 ms
최적화 후
0.19 ms
12. IGC(INVEN GAME CONFERENCE) 2018
TICKING - 액터
● ‘Dumpticks’ 콘솔 명령어로 사용 분석
● Tick 이벤트를 사용하는 블루프린트들
● Overlaps은 느린 것 중에 하나
○ 문열기
○ 회전하는 토마토 머리
13. IGC(INVEN GAME CONFERENCE) 2018
SPAWNING
● 많은 액터들이 생성됨(Spawning)
○ 벽 건설
○ 보물상자 열기
○ 플레이어 제거
○ 네트워크 관련성(Network relevancy)
○ 발사되는 총알들
● 파티클 풀링(Pooling) 시스템 추가!
○ 이펙트를 생성하는 비용 절감
■ ParticleSystemComponent 생성
■ ParticleSystem 설정
○ Spawn Emitter 함수에 Pooling Method 옵션
14. IGC(INVEN GAME CONFERENCE) 2018
TICKING - HUD
● Slate HUD가 ~2.6ms 비용 소요
● ~1ms 정도로 최적화
○ 느린 블루프린트 제거
○ 위젯들을 캐쉬하기 위해서 invalidation panels 사용
○ 느린 위젯들 최적화
● 추가적인 Slate 최적화 계획 중
15. IGC(INVEN GAME CONFERENCE) 2018
TICKING – 하루의 변화 시스템
● MaterialParameterCollection에서 많은 라이팅 관련 변수들 변경
● 프레임당 하나의 변경만 업데이트 하도록 시스템 최적화
20. IGC(INVEN GAME CONFERENCE) 2018
서버 퍼포먼스 - 리플리케이션
- ~50,000 리플레케이트되는 액터들
- 100 개의 연결
- 400+ 스트리밍 레벨들
- 20 Hz tick 속도
- 최대한 낮은 빈도의 net 업데이트/ForceNetUpdate()
- 관련성(relevancy) 거리를 최대한 줄이기
- 관련 없는 상태를 최대한 정확히 걸러내기
21. IGC(INVEN GAME CONFERENCE) 2018
● 네트워크 관련성(network relevancy)을 다시 정의
○ IsNetRelevantFor과 GetNetPriority가 사용되지 않음
● 그래프로 관련이 있는 액터들만 필터링
○ 공간 그리드(Spatial grid)
○ 스트리밍
○ 항상 관련있음(Always Relevant)
(팀/연결된 것들/모두)
서버 퍼포먼스 - 리플리케이션 그래프(REPLICATION GRAPH)
22. IGC(INVEN GAME CONFERENCE) 2018
데디케이티드 서버 - REPLICATED STATE 공유
- 자주 같은 state가 많은 클라이언트에 보내짐
- State를 따로 만들지 않고, 최대한 캐쉬/재사용하는 기능 추가
Actor
Actor
State
Client
Actor
State
Client
Actor
State
Client
Actor
Client
Actor
State
Client Client
23. IGC(INVEN GAME CONFERENCE) 2018
서버 퍼포먼스 - 게임플레이
● 클라이언트 최적화가 많은 도움이 됨
● 클라이언트 캐릭터 이동을 합쳐 처리하도록 노력
○ 높은 FPS에서 너무 많은 RPC 호출 피하기
○ 공격적으로 최소 프레임으로 처리 (약 20 Hz)
○ 레이턴시(latency)를 줄이기 위해 중요 이동의 경우 바로 보냄
● 애니메이션
○ 서버에서는 애니메이션 처리하지 않음
○ 플레이어 컬리젼 비활성화
○ 모든 불필요한 보여주기를 위한 컴포넌트들 제거
25. IGC(INVEN GAME CONFERENCE) 2018
프로파일링
● QA 팀은 데일리 100인 플레이 테스트에서 프로파일 데이터를 수집
● 하나의 완벽한 게임 플레이에서 얻어진 프로파일 데이터로 게임에서
발생한 각각의 히치/느려지는 구간 분석 가능
○ 히치가 60ms 이상으로 걸리는 경우 버그로 등록
○ 성능 관련 버거는 크래쉬 다음으로 중요도가 높은 버그로 대응
● 게임을 Reply 시스템으로 레코딩해서 확인 및 다른 플랫폼에서 테스트 가능
28. IGC(INVEN GAME CONFERENCE) 2018
이슈
30fps 게임을 60fps 으로 만드는 것은 여러 도전 이슈들이 생김
핵심 솔루션들:
● GPU Dynamic Resolution & Temporal AA
● GPU 디바이스 프로파일을 통한 스케일링
○ 그려지는 거리, 그림자 퀄리티, AO, 폴리지 밀도, 최소/최대 dynamic resolution
● CPU 스케일링
○ 모바일 CPU 개선을 사용 (Ticking, LOD, 드로콜)
29. IGC(INVEN GAME CONFERENCE) 2018
Spatial Upscale
Spatial Upscale
● UI 전에 업스케일링
● r.screenpercentage 으로 해상도 변경시
30. IGC(INVEN GAME CONFERENCE) 2018
Temporal Upsampling & Dynamic Resolution
● 해상도를 조절하는 옵션으로 UE4.19 추가됨
● Temporal Upsampling
○ Temporal upsampling은 높은 퀄리티의 업샘플링 가능
○ TemporalAA 패스에서 업샘플링
● Dynamic Resolution
○ GPU 부하에 따라서 자동으로 해상도가 변경되고, Temporal Upsampling을 통해 그 변화가
거의 느껴지지 않음
31. IGC(INVEN GAME CONFERENCE) 2018
Temporal Anti-Aliasing Upsample
Temporal Upsample (TAAU)
• TemporalAA에서 업샘플링
• 모션블러 블룸이 고해상도에서 처리되어서 Spatial Upscale에서
부하가 더 있음
• Dynamic Resolution 해상도가 여기서 변경됨
32. IGC(INVEN GAME CONFERENCE) 2018
Temporal AA Upscale Settings
● Temporal upsample로 해상도 변경
○ 차이가 거의 느껴지지 않음
○ 매 8 프레임마다 정한 GPU 허용량에 맞도록 동작
Xbox One X 예제 @ 65% 화면 비율
1: 렌더링 해상도 = 2080x1170
2: 버퍼 해상도 = 3200x1800
36. IGC(INVEN GAME CONFERENCE) 2018
닌텐도 스위치
도킹 및 휴대용 모든 모드에서 GPU 사용을 최대화 하기 위해서
Dynamic resolution과 TAAU + 디퍼드 렌더러 사용. 그래도 30Hz 고정
최근에 Clustered Forward Renderer로 변경을 통해 10% 더 빠른 퍼포먼스
핸드헬드 모드에서는 배터리 사용량을
위해서 100% 퍼포먼스를 사용하지 않음
37. IGC(INVEN GAME CONFERENCE) 2018
캐릭터 최적화
● 캐릭터 4 LOD, 무기 3 LOD
● LOD에서는 얼굴본 제거
● 모바일에서는 LOD 1 최소 LOD
● 캐릭터 LODs
○ LOD0 30,000 tris
○ LOD1 15,000 tris
○ LOD2 3,000 tris
○ LOD3 300 tris
38. IGC(INVEN GAME CONFERENCE) 2018
풀(GRASS) 최적화
● 풀(Grass) 최적화는 중요 요소 중에 하나
○ LOD 추가
○ 회전 제거등으로 버텍스 셰이더 최적화
○ 모바일에서는 버텍스 셰이더 제거
○ 게임에 영향을 주지 않는 풀의
Density scale 조정
40. IGC(INVEN GAME CONFERENCE) 2018
다이나믹 HLOD를 통한 부서지는 건물
● 틸티드 타워 지역은 15개의 빌딩과
오브젝트들로 약 2000개의 드로콜이였음
● 새로운 다이나믹 HLOD로 하나의 전체
빌딩을 1개의 드로콜로 줄임
● 렌더타켓 이용
● 각 벽들의 부서진 여부를 처리하기 위해서
부서진 벽에 대한 인덱스를 렌더타켓에
검은 텍셀로 표시
● UV와 버텍스컬러를 이용해서 RT를 읽어서
버텍스 셰이더에서 처리
44. IGC(INVEN GAME CONFERENCE) 2018
나무 임포스터
● Hemi-octahedral 캡쳐 레이아웃
● 각 프레임을 2D texture atlas로 만듬
● Vector->Octahedron 변환을 사용해서
프레임 인덱싱
● UV 공간에서 +X, +Y, +XY 주변 좌표를 통한
간단한 주변 프레임 접근
● 추가적인 정보:
https://shaderbits.com/blog/octahedra
l-impostors
47. IGC(INVEN GAME CONFERENCE) 2018
하나의 게임, 모든 플랫폼
크로스 플레이 지원을 위한 필수 조건들:
● 하나의 같은 맵으로 모든 플랫폼 지원
● 게임플레이에 영향을 주는 모든 요소들이 똑같이 지원되어야 함
● 전투가 가능한 거리가 모든 플랫폼에서 같아야 함
모바일 포팅이나 새로운 맵 추가가 아닌
하나의 같은 맵!
51. IGC(INVEN GAME CONFERENCE) 2018
하나의 게임, 모든 플랫폼
모바일 지원 중요 이슈들
● CPU - Thermal throttling
● 메모리
● 드로콜 줄이기 - HLOD
● GPU 속도 및 GPU 드라이버 – 해상도 줄이고 업스케일링
52. IGC(INVEN GAME CONFERENCE) 2018
THERMAL THROTTLING
가장 높은 수준의 퀄리티로 30fps 을 원했음. 하지만..
CPU와 GPU를 최대치로 사용하는 것은 열을 발생했고, 결국 디바이스
다운클럭(downclock) 발생
해결을 위한 키 포인트:
CPU 코어들이 시간의 약 50%는 idle 상태로
있도록 했음. 그래서 60fps 타켓으로 최적화
하고, 30fps에 vsync 했음
53. IGC(INVEN GAME CONFERENCE) 2018
메모리: 타켓
iOS에서 피지컬 메모리 GB당 700MB을 허용 버짓으로 잡음
● 2GB 디바이스에서 <1.4 GB (대부분의 폰들)
● 3GB 디바이스에서 <2.1 GB (“+” 폰들)
● 4GB 디바이스에서 <2.8 GB (큰 iPadPro)
안드로이드에서 메모리 상황은 디바이스마다 더 복잡함
● 2GB 디바이스에서 <500 MB (아직 작업중)
● 3GB 디바이스에서 <1.4 GB (대부분의 경우 괜찮음)
● 4GB 디바이스 중에 특정 디바이스들 <1.4 GB (구글 픽셀폰!!!!)
안드로이드에서는 정확한 메모리 정보를 얻어오기 힘듬...
54. IGC(INVEN GAME CONFERENCE) 2018
디바이스별 튜닝 – 스케일러빌리티(SCALABILITY)
애플/iOS
● 알고 있는 제한된 디바이스 종류만 존재, 디바이스별로 값들 세팅
● 메모리 허용량 – 폴리지 사용여부 (3GB 이상의 디바이스에서만)
● 디바이스별 설정 – 스케일러빌리티 세팅(해상도, 그림자 on/off, LOD 거리 등등)
안드로이드
● 엄청나게 많은 종류의 디바이스들 (10,000+). 일반적으로 그래픽 API가 iOS만큼 빠르지 않음.
● 알려진 특정 디바이스나 테스트한 디바이스들은 각각에 맞는 튜닝
● GPU 타입(Adreno 6xx 또는 Mali G7x등등)에 따른 세팅(Lowest, Low, Med, High 등등)
● 낮은 사양의 안드로이드 폰에는 특별히 낮은 FPS(20Hz) 사용
● Vulkan은 현재 가장 높은 스펙의 삼성 디바이스에서만 더 빠름 (Adreno 630)
안드로이드 지원을 위해서 3월부터 8월초까지 최적화 및 안정화 작업이 필요했음!
55. IGC(INVEN GAME CONFERENCE) 2018
모바일 개선 사항들
안드로이드
Program Binary Cache와 shader precompilation을
통한 시작 시간 계산
Shader LRU Cache 를 통한 엄청난 메모리 절약
셰이더 사이즈 줄이기 위한 Emulated Uniform
Buffers 개선
Vulkan 호환성 개선 및 최적화
CPU core thread affinity 조정
디바이스별 Mobile PIE 개선
안드로이드 Occlusion Query 개선
디바이스 프로파일 개선
Virtual Keyboard 수정
많은 버그들 수정
IOS
Web Browser Widget UObject 바인딩 지원
iPhone XS/XSMax/XR 지원
버그들 수정
모바일
GPU particle 시뮬레이션 성능 개선
dithered LOD transitions 수정
Sky cubemap 반사 수정
터레인 웨이트맵 텍스처 압축