NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung HaNDC 2017 발표 슬라이드
시연 영상 링크: https://youtu.be/e9Tv3jkmqKk
게임 내 정보를 추가 구현이나 패치 없이 실시간으로 수집할 수 있다면 어떨까요? 이런 아이디어를 실제로 가능하게 구현한 NEXON ZERO 발표 슬라이드 입니다.
Unity3D 엔진을 활용한 게임환경 분석 및 3D 그래픽스 기술 /제작 사례SangYun Yi20160305 부산 정보산업 진흥원 주최
부산 문화 컴플렉스(Busan Culture Complex) 컨퍼런스 발표 자료
Unity 3D를 통한 게임 환경 분석 및 개발 사례 공유
NDC 11 자이언트 서버의 비밀승명 양2011 NDC(Nexon Developers Conference)에서 발표한 마비노기 영웅전(미국명 Vindictus)의 자이언트 서버 아키텍처에 대한 슬라이드입니다. 게임 서버의 분산 서비스 아키텍처를 바닥부터 만들어낸 과정과 결과에 대한 내용을 담고 있습니다.
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기강 민우펄어비스의 MMORPG, 검은사막에 적용되어있는 AI 네비게이션 기능은 VOXEL 기반으로 자체 개발한 엔진을 이용해 구현되어 있습니다. 기존의 대다수 상용 라이브러리들이 네비 메쉬라고 하는 이동가능한 평면을 표현하는 폴리곤 기반의 데이터를 이용해 길찾기를 수행해주는 것에 비해 근간이 다릅니다. 이 강연에서는 검은사막의 네비게이션 엔진을 구현하고, 서버 / 클라이언트에 적용하면서 얻게된 노하우와 적용된 결과물들을 소개합니다.
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담Sumin Byeon이 발표는 넥슨의 신규 개발 게임인 듀랑고의 생태계에 대한 간략한 소개와 OpenCL 을 이용한 병렬 처리에 관한 전반적인 기술적 내용을 다룹니다. 게임 속의 세계에서 지형과 기후, 지질 조건에 맞게 여러 종류의 식물과 광물들을 알맞은 곳에 배치시키는 것이 생태계 시뮬레이터의 역할인데, 이 시뮬레이터는 방대한 양의 계산을 수행합니다. 초기에 만들어진 프로토타입은 이러한 계산을 수행하는데 30분이 넘게 걸렸지만, 병렬처리, 알고리즘 시간복잡도 개선 등의 여러가지 방법들을 통해 그 시간을 11초까지 단축시켰습니다. 구체적으로 어떤 방법들을 시도했었고, 어떤 방법들이 효과가 있었는지 여러분과 그 경험담을 공유하고자 합니다.
Unity3D 엔진을 활용한 게임환경 분석 및 3D 그래픽스 기술 /제작 사례SangYun Yi20160305 부산 정보산업 진흥원 주최
부산 문화 컴플렉스(Busan Culture Complex) 컨퍼런스 발표 자료
Unity 3D를 통한 게임 환경 분석 및 개발 사례 공유
NDC 11 자이언트 서버의 비밀승명 양2011 NDC(Nexon Developers Conference)에서 발표한 마비노기 영웅전(미국명 Vindictus)의 자이언트 서버 아키텍처에 대한 슬라이드입니다. 게임 서버의 분산 서비스 아키텍처를 바닥부터 만들어낸 과정과 결과에 대한 내용을 담고 있습니다.
[IGC 2017] 펄어비스 민경인 - Mmorpg를 위한 voxel 기반 네비게이션 라이브러리 개발기강 민우펄어비스의 MMORPG, 검은사막에 적용되어있는 AI 네비게이션 기능은 VOXEL 기반으로 자체 개발한 엔진을 이용해 구현되어 있습니다. 기존의 대다수 상용 라이브러리들이 네비 메쉬라고 하는 이동가능한 평면을 표현하는 폴리곤 기반의 데이터를 이용해 길찾기를 수행해주는 것에 비해 근간이 다릅니다. 이 강연에서는 검은사막의 네비게이션 엔진을 구현하고, 서버 / 클라이언트에 적용하면서 얻게된 노하우와 적용된 결과물들을 소개합니다.
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담Sumin Byeon이 발표는 넥슨의 신규 개발 게임인 듀랑고의 생태계에 대한 간략한 소개와 OpenCL 을 이용한 병렬 처리에 관한 전반적인 기술적 내용을 다룹니다. 게임 속의 세계에서 지형과 기후, 지질 조건에 맞게 여러 종류의 식물과 광물들을 알맞은 곳에 배치시키는 것이 생태계 시뮬레이터의 역할인데, 이 시뮬레이터는 방대한 양의 계산을 수행합니다. 초기에 만들어진 프로토타입은 이러한 계산을 수행하는데 30분이 넘게 걸렸지만, 병렬처리, 알고리즘 시간복잡도 개선 등의 여러가지 방법들을 통해 그 시간을 11초까지 단축시켰습니다. 구체적으로 어떤 방법들을 시도했었고, 어떤 방법들이 효과가 있었는지 여러분과 그 경험담을 공유하고자 합니다.
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기강 민우Unreal4 엔진을 사용하여 모바일 프로젝트를 제작하는것에 있어서 PC프로젝트를 진행할때와 달리 주의해야 하는 점과 팁들에 관하여 이야기하고, 이를 HIT 프로젝트에는 어떻게 접목시켰는지에 대하여 강연합니다.
[NDC2016] 신경망은컨텐츠자동생성의꿈을꾸는가Hwanhee Kim2016년 4월 27일, NDC2016 발표자료입니다.
전통적인 콘텐츠 생산은 기획자, 개발자가 하나하나 컨트롤해야 하는 노동집약적 산업입니다. 저 또한 처음에 입사했을 때 출시를 위해 며칠 만에 이백여 개가 넘는 맵을 찍어야 했던 아픔이 있습니다. 그 뒤에도 플레이어들을 위한 콘텐츠 생산은 계속되었지만, 플레이어들의 콘텐츠 소비 속도는 생산 속도를 뛰어넘은 지 오래되었습니다. 대안은 로그라이크 같은 장르에서 널리 쓰이는 Procedural Contents Generation이라고 생각합니다. 외국 인디 씬에서는 이미 많이 사용되고 있는 이 방법에 최근 점점 더 많이 사용되고 있는 신경망을 활용해서 색다른 콘텐츠 생산 기법을 소개하려 합니다.
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템Young Soo KimProtocol:hyperspace Diver 개발 포스트모템
IGC2017에서 발표한 세션의 자료를 공유합니다.
이전 NDC17에서 발표한 내용과는 초점을 조금 다르게 잡고 새롭게 구성한 것입니다.
[데브루키] Color space gamma correctionMinGeun Park데브루키 2018.12.1 발표자료
알콜코더
박민근
유니티에서 Color Space - Linear Color Space 설명
Gamma Correction 설명
유니티 Linear Color Space에서 UI의 알파 문제 해결 방안
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현MinGeun Park유니티의 기본 툰셰이딩을 이용하여, 애니메이션 풍의 카툰 렌더링을 구현 하는 방법입니다.
아래 내용을 번역 하였습니다.
http://qiita.com/MuRo_CG/items/c417ef6d6cbeed3dd42b
4. 들어가기에 앞서
본 내용은 인터넷에 공개된 다양한 참고 자료들을 바탕으로 작성 되었습니다.
유니티의 버전업에 따라서 본내용이 다를 수도 있습니다. (ex. Unity 5.x)
보다 자세한 내용은 마지막 참고자료 링크를 참조해 주세요.
5. 알콜코더 박민근(@agebreak)
현재 시프트업 클라이언트 프로그래머–미소녀 게임 프로젝트 개발 중
NHN NEXT 게임 전공 교수
쿠키 소프트 – 모바일 격투게임 프로젝트 (Unity)
네오위즈 게임즈 - 야구의 신 개발
NTL-inc - 드래곤볼 온라인 개발
엔씨소프트 – PlayNC 빌링 서버 개발
‘신입 게임 개발자의 서울 상경기’
(http://agebreak.blog.me)
‘초중급 게임 개발자 스터디 (데브루키)’
(cafe.naver.com/devrookie)
게임 개발자 랩소디 (팟캐스트)
(http://www.podbbang.com/ch/3921)
게임 클라이언트 프로그래머
30대… 그리고 오타쿠 프로그래머...
언젠가는 우즈벡에.. 일류젼 우즈벡 지사를 설립할 예정
8. 8
최적화의 시작은 병목 파악부터
CPU
• 너무 많은 DP CALL
• 복잡한 스크립트나 물리 연산
Vertex Processing
• 너무 많은 버텍스들
• 버텍스당 너무 많은 연산 (버텍스 셰이더)
Fragment Processing
• 너무 많은 픽셀, 오버 드로우(OverDraw)
• 프래그먼트당 너무 많은 연산 (프래그먼트 셰이더/픽셀 셰이더)
Band Width
• 크고, 압축되지 않은 텍스쳐
• 고해상도 프레임 버퍼
10. 10
스크립트 최적화 (1)
• 유니티의 핵심 기능은 모두 C++로 제작되어 있다
• 예) Transform.position 에서 Transform은 C# 속성, position은 C++ 영역
• 유니티 객체들을 변수에 저장해서, 캐싱해서 사용하는것이 좋다.
• FindObject 계열 함수들은 매우 느리다. (미리 찾아서 캐싱)
• Instanitate 와 Destory 함수를 이용한 프리팹의 생성/해제는 비용이 크다
• 활성화/비활성화를 활용 -> 오브젝트 풀링
• Update 함수보다는 Coroutine을 활용한다.
11. 11
스크립트 최적화 (2)
• 박싱과 언박싱은 부하가 큰 작업이다
• 나눗셈보다는 곱셈이 몇십배 빠르다
• magnitude 보다는 sqrMagnitude를 사용해서 비교한다. (제곱근 계산 x)
• 삼각함수의 값은 상수로 저장하고, 사용하는 것이 좋다.
• 문자열은 readonly 혹은 const 키워드를 사용하여, 가비지 컬렉션으로부터 벗어나도록 한다.
13. 13
만흉의 원인 : 가비지 컬렉터
가비지 컬렉터(GC)는 언제 일어날지 모른다.
• Mono의 동적 메모리 관리 때문에, 메모리 해제를 위해 GC가 자동 호출 된다.
• GC는 언제 일어날지 모른다.
• GC가 일어나면, 게임이 멈추는 현상(랙)이 발생하게 된다.
• 동적 메모리 해제가 가능한 일어나지 않도록 하는것이 GC 관리의 핵심
14. 14
만흉의 원인 : 가비지 컬렉터
오브젝트 풀링
• 오브젝트(or 프리팹)의 동적 생성과 해제는 부하가 크다.
• 오브젝트가 해제되면, 언젠가는 GC가 동작하여 정리 한다 = 랙이 발생
• 오브젝트를 풀을 만들어 미리 많이 만들어 두고, 활성화/비활성화로 사용한다.
• 풀에서 가져와서 사용하고, 사용이 끝나면 비활성화 상태로 풀에 반환
• 오브젝트 풀링 사용은 선택이 아닌 필수!!
• 에셋스토어에도 이미 만들어진 오브젝트 풀링 소스들이 있다.
15. 15
GC에게 먹이 주지 않기
문자열 병합은 StringBuilder
• 일반 String + String을 쓰면 임시 문자열이 생성됨
• StringBuilder.Append() 함수를 사용하여 병합
foreach 대신에 for문 사용
• 일반 array에 한해서…
• Foreach는 한번 돌때마다 24byte의 쓰레기 메모리를 생성
• 10번만 돌아도 240byte의 GC 수거 메모리를 남김
태그 비교에는 compareTag() 사용
• If(go.tag == “enemy”) 대신에 go.compareTag(“enemy”) 사용
• 객체의 tag 프로퍼티를 호출하는것은 추가 메모리를 할당하고, 복사
16. 16
GC에게 먹이 주지 않기 (2)
데이터 타입에는 Class 대신 구조체 사용
• 구조체는 GC에 들어가지 않는다. Stack에 할당되기 때문
즉시 해제할 때는 Dispose 수동 호출
• 오브젝트의 dispose를 수동으로 호출하여, 즉시 cleanup
임시 객체들을 만들어내는 API들을 조심하라
• Ex. GetComponents<T>, Mesh.Vertices, Camra.allCameras, etc…
17. 17
C++ <-> C# 오버 헤드
객체의 변경 사항을 캐싱
• 객체의 이동과 변형에 대한 처리를 캐싱하고, 매프레임에서 딱 한번만 처리한다.
• Ex. Move()
컴포넌트 참조를 캐싱
• Getcomponent()는 한번만 호출하여, 객체를 캐싱해두고 사용 한다.
빈 콜백 함수는 제거
• Start()나 Update() 같은 콜백함수는 비어있어도, 성능에 영향을 끼친다.
20. 20
텍스쳐
• 텍스쳐 사이즈는 무조건 2의 제곱이어야 한다.
• POT(Power of Two)
• POT가 아닌경우 POT 텍스쳐로 변환되어 로딩 된다.
• 900 x 900 -> 실제로는 1024 X 1024로 변환
• 화면 해상도에 맞추어 1280으로 만드는 경우
-> 실제 메모리에는 2048로 생성된다.
21. 21
텍스쳐
• 텍스쳐 아틀라스를 활용 하라.
• 텍스쳐 아틀라스로 최대한 묶음
• UI 만이 아니라, 같은 재질의 오브젝트들을 묶음
• 한 화면에 나오는 텍스쳐끼리(UI)
• 알파가 있는 텍스쳐끼리,
알파가 없는 텍스쳐끼리 묶어야 한다
22. 22
텍스쳐
• 압축된 텍스쳐와 밉맵을 사용하자. (대역폭 최적화)
• 32bit가 아닌 16bit 텍스쳐 사용도 상황에 맞게 고려
24. 24
Mesh
Import시에 언제나 “Optimize Mesh” 옵션 사용
• 변환 전/변환 후 버텍스 캐쉬를 최적화 해준다
언제나 Optimize Mesh Data 옵션을 사용한다
• Player Setting > Other Settings
• 사용하지 않는 버텍스 정보들을 줄여 준다(tangents, Normal, color, etc…)
25. 25
오디오
• 모바일에서 스테레오는 의미 없다.
• 모두 92kb, 모노로 인코딩
• 사운드 파일을 임포트하면 디폴트로 3D 사운드로 설정
• 2D 사운드로 변경
• 압축 사운드(mp3, ogg), 비압축 사운드(wav) 구별
• 비압축 사운드 : 순간적인 효과음, 이펙트 등
• 압축 사운드 : 배경 음악
36. 36
오브젝트 통합(Combine)
• 드로우콜은 오즈젝트에 설정된 재질의 셰이더 패스당 하나씩 일어난다.
• 렌더러에 사용된 재질의 수만큼 드로우 콜이 발생
Combine (통합)
• 성질이 동일한 오브젝트들은 하나의 메쉬와 재질을 사용하도록 통합
• Script 패키지 – CombineChildren 컴포넌트 제공
• 하위 오브젝트를 모두 하나로 통합
• 통합하는 경우 텍스쳐는 하나로 합쳐서, Texture Atlas를 사용해야 된다.
37. 37
Batch
Static Batch
• Edit > Project Setting > Player 에서 설정
• 움직이지 않는 오브젝트들은 static으로 설정해서, 배칭이 되게 한다.
• Static으로 설정된 게임 오브젝트에서 동일한 재질을 사용 할 경우, 자동으로 통합
• 통합되는 오브젝트를 모두 하나의 커다란 메쉬로 만들어서 따로 저장(메모리 사용량 증가)
Dynamic Batch
• 움직이는 물체를 대상으로 동일한 재질을 사용하는 경우, 자동으로 통합
• 동적 배칭은 계산량이 많으므로, 정점이 900개 미만인 오브젝트만 대상이 됨
38. 38
라이팅
라이트 맵을 사용하자
• 고정된 라이트와 오브젝트의 경우(배경) 라이트 맵을 최대한 활용 한다.
• 아주 빠르게 실행된다 (Per-Pixel Light 보다 2~3배)
• 더 좋은 결과를 얻을 수 있는 GI와 Light Mapper를 사용할 수 있다.
라이트 렌더 모드
• 라이팅 별로 Render Mode : Important / Not Important 설정 가능
• 게임에서 중요한 동적 라이팅만 Important로 설정 (Per-Pixel Light)
• 그렇지 않은 라이트들은 Not Important로 설정
39. 39
Overdraw
화면의 한 픽셀에 두번 이상 그리게 되는 경우 (Fill rate)
• DP Call의 문제만큼이나, Overdraw로 인한 프레임 저하도 중요한 문제
• 특히 2D 게임에서는 DP Call 보다 더욱 큰 문제가 된다.
기본적으로 앞에서 뒤로 그린다
• Depth testing으로 인해서 오버드로우를 방지 한다
• 하지만 알파 블렌딩이 있는 오브젝트의 경우에는 알파 소팅 문제가 발생
반투명 오브젝트의 개수의 제한을 건다
• 반투명 오브젝트는 뒤에서부터 앞으로 그려야 한다. -> Overdraw 증가
• 반투명 오브젝트의 지나친 사용에는 주의해야 한다
41. 41
유니티 셰이더
기본 셰이더는 모바일용 셰이더 사용
• 기본 셰이더를 사용할 경우, 모바일용 셰이더를 사용.
• Mobile > VertexLit은 가장 빠른 셰이더
복잡한 수학 연산
• pow, exp, log, cos, sin, tan 같은 수학 함수들은 고비용이다.
• 픽셀별 그런 연산을 하나 이상 사용하지 않는 것이 좋다.
• 텍스쳐 룩업테이블을 만들어서 사용하는 방법도 좋다.
• 알파 테스트 연산(discard)는 느리다.
• 기본적인 연산보다는 최적화 시키고 간략화시킨 공식들을 찾아서 사용할 수 있다
42. 42
유니티 셰이더 (2)
실수 연산
• float : 32bit - 버텍스 변환에 사용. 아주 느린 성능 (픽셸 셰이더에서 사용은 피함)
• Half : 16bit – 텍스쳐 uv에 적합. 대략 2배 빠름
• fixed : 10bit – 컬러, 라이트 계산과 같은 고성능 연산에 적합. 대략 4배 빠름
라이트 맵을 사용하자
• 고정된 라이트와 오브젝트의 경우(배경) 라이트 맵을 최대한 활용 한다.
• 아주 빠르게 실행된다 (Per-Pixel Light 보다 2~3배)
• 더 좋은 결과를 얻을 수 있는 GI와 Light Mapper를 사용할 수 있다.
44. 44
Fixed Update 주기 조절
• FixedUpdate()는 Update와 별도로 주기적으로 불리며, 주로 물리 엔진 처리
• 디폴트는 0.02초. 즉 1초에 50번이나 호출됨
• TimeManager에서 수정 가능
• 게임에 따라, 0.2초 정도(혹은 이상)로 수정해도 문제 없음
45. 45
물리 엔진 설정
충돌체의 이동
• 리지드 바디가 없는 고정 충돌체를 움직이면, CPU 부하 발생 – 물리 월드 재구성
• 이럴 경우 리지드 바디를 추가하고, IsKinematic 옵션 사용
Maximum Allowed timestep 조정
• 시스템에 부하가 걸려, 지정되 시간보다 오래 걸릴 경우, 물리 계산을 건너뛰는 설정
Static Object
• 움직이지 않는 배경 물체는, static으로 설정
46. 46
물리 엔진 설정 (2)
Solver Iteration Count 조정
• 물리 관련 계산을 얼마나 정교하게 할지를 지정. (높을수록 정교)
• Edit > Project Setting > Physics
Sleep 조절
• 리지드 바디의 속력이 설정된 값보다 작을 경우, 휴면상태에 들어감
• Physics.Sleep() 함수를 이용하면, 강제 휴면 상태를 만들 수 있음
47. 47
2D 물리 vs 3D 물리
2D 게임에는 2D 물리를(RigidBody2D), 3D 게임에는 3D 물리를(RigidBody)…
Unity3D v4.3: 2D vs 3D Physics
48. 48
물리 엔진 스크립트
래그돌 사용 최소화
• 랙돌은 물리 시뮬레이션 루프의 영역이 아니기 때문에, 꼭 필요할때만 활성화 한다
태그 대신 레이어
• 물리 처리에서 레이어가 훨씬 유리. 성능과 메모리에서 장점을 가진다
메쉬 콜라이더는 절대 사용하지 않는다.
레이캐스트와 Sphere Check 같은 충돌 감지 요소를 최소화
49. 49
Tilemap Collision Mesh
2D 게임에서 타일맵의 Collison Mesh를 최적화하라
• Tilemap을 디폴트로 사용해서, 각 타일별로 충돌 메쉬가 있는 경우, 물리 부하가 커진다
• 연결된 Tilemap을 하나의 Collision Mesh로 물리 연산을 최적화 하라
50. 참고 자료
• Unity 3D 최적화 http://www.uzoo.in/?mid=master_codesnippet&order_type=desc&document_srl=539&listStyle=viewer
• 유니티3D 게임 리소스 최적화? 3가지만 기억해라 HTTP://TECHHOLIC.CO.KR/ARCHIVES/17907
• Optimizing Graphics Performance on Unity : 유니티에서 그래픽 성능 최적화 하기 http://smilemugi.net/wordpress/archives/227
• "14일만에 0에서 60프레임 만들기" Unity3D를 사용하여 우리의 게임을 최적화시키면서 배웠던 것들
• 유니티가 당신에게 알려주지 않는 것들 http://www.slideshare.net/MrDustinLee/ss-27739454?related=3
• NDC2013 - ‘갤럭시S1’ 에서 풀프레임 퍼즐주주 만들기 http://www.slideshare.net/olambdao/unity3d-2d-20130424?related=1
• Unite 2013 optimizing unity games for mobile platforms http://www.slideshare.net/hnam7/unite-2013-optimizing-unity-games-for-mobile-platforms-37933478
• Optimizing unity games (Google IO 2014)
• Unity Internals: Memory and Performance