51
NEXON DEVELOPERS CONFERENCE 2012 인인인인 인인 인인 Full 3D MMORPG 인인 인인인 인 인 인

삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

  • Upload
    ndoors

  • View
    2.801

  • Download
    2

Embed Size (px)

DESCRIPTION

삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

Citation preview

Page 1: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

인스톨이 필요 없는Full 3D

MMORPG 게임 만들기

박 현 우

Page 2: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

강연 내용

인스톨이 필요 없다 !• Web Full 3D MMORPG “ 삼국지를 품다”

Unity3D• Resources & Asset Bundle

문제 해결과 최적화• 버그 이슈• 메모리 이슈• 쾌적성 이슈• 생산성 향상 이슈

Page 3: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

인스톨 없이 MMORPG 게임을 ?도대체 어떤 게임인데 ?

Page 4: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

삼국지를 배경으로

웹 브라우저 상에서 인스톨 없이 실행하는

웹 Full 3D MMORPG 게임

Page 6: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

유니티는

모바일 전용 개발 툴 아닌가요 ?처음에는 그렇게 생각했지만 ,

이런 저런 이유로 전격 채택 !

Page 7: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

인스톨 없이 웹 브라우저에서 바로 실행멀티플랫폼 지원개발 생산성 향상• 별도의 툴 개발이 필요 없이 에디터 화면 내에서 거의 모든 것을 지원

2 년 6 개월<C# 스크립트임에도 불구하고…

각종 툴 제작하고 게임 프레임워크 코딩 하느라 시간이…

Page 9: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

웹 게임 증거

Page 10: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

천여 개 이상의 게임 드라마 턴 방식 전략 전투

모바일 기기 지원열심히 준비 중

내정

Page 11: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

화려한 렌더링 옵션

Real-time ShadowSSAO

BloomContrast Enhance

Color CorrectionFull Texture Size

Anisotropic Filtering

Terrain LODShader LOD

25 일 수 14:10 308 호삼국지를 품다 테크니컬 아트

엔도어즈 TAD 정종필세션을 참고해 주세요

Page 12: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

Page 13: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

현재 3 차 서포터즈 테스트까지 마무리 .

4 차 서포터즈 테스트 이후 클로즈 베타 예정

올 여름에는 오픈 ?

이상 ! 광고 끝 .

Page 14: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

이제 본격적으로 …

Page 15: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

MMORPG 설치 용량 비교

4G, 라이트 버전은 1G

13G

13G+@ 설치 시간은 ?

오래 걸립니다 ㅠㅠ

Page 16: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

1M Under

9M

230M

4G+@

웹 플레이어 설치

게임 구동 최소 데이터

게임 진입

개발된 컨텐츠

플레이어 설치

1 분 미만

게임 진입까지

1 분 미만

i5 CPU100Mbps

Page 17: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

처음 실행하는데 고작 1 분 !

하지만 처음부터 그런 건 아니었으니…• 프로젝트 초반부에는 컨텐츠가 적어서 3 분 이내• 컨텐츠가 추가 되면서 점점 길어져서 5 분 이상 걸리기 시작• 유니티가 리소스를 다루는 방법 몇 가지가 있다

Page 18: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

유니티가 리소스를 다루는 법 !

게임에 리소스를포함시키는 방법과 분리 시키는 방법• All in one Scene• Resources• AssetBundle

Scene

게임 플레이에 필요한

데이터를 담고 있는

레벨 데이터

Page 19: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

유니티의 게임 빌드• 같은 리소스로 플랫폼 별로 빌드• 빌드 할 때 Target Platform 에

맞는 구조로 변경ex) OS 별 텍스처 압축 포맷

게임 빌드에 포함되는 것• 게임 씬

게임 화면에 보여질 것들을 담고 있는 게임 레벨 데이터

• Resources프로젝트의 폴더에 있는 모든

게임 리소스• 모든 스크립트 코드

Scene 에 모두 포함

Page 20: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

Resources 폴더• 게임 실행에 필요한 리소스를 담고 있는 특수한 폴더• Resources 폴더에 있는 데이터들은 모두 게임 빌드 할 때

포함• 런타임에 동적으로 Load

Resources.Load

Page 21: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

그런데 !Resources 폴더에 게임 리소스들을 담고 있으면• 용량 큰 Texture, BGM Audio, 게임 드라마 씬 etc.

게임 용량 증가 !• Standalone 일 때는 상관 없지만• Web Player 로 빌드 할 때는 초기 다운로드 용량에 포함

메모리 사용량 증가 !• Resources 폴더에 있는 모든 Asset 을 메모리에 한번에 올린다• 3.4 버전에서 실제 사용 할 때만 메모리에 올리도록 수정됨

Page 22: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

웹 플레이어에서는 초기 다운로드 용량을 줄이기 위해

Asset Bundle 사용게임에서 사용하는 모든 리소스의 묶음을 이르는 말AssetBundle 로 만들어서 웹 서버에 올려놓고런타임에 다운로드 받아 동적으로 생성 삭제

게임 빌드에 포함되지 않는다게임 빌드에서 제외시켜야 한다

Pro 버전에서만 지원

Asset [명사 ] 자산 ( 이 되는 물건 또는 사람 )게임에서 사용되는 모든 리소스• Mesh, Texture, Shader, Ani-

mation, Audio, Script etc.

Bundle[명사 ] 꾸러미 , 묶음 , 보따리

부분 유료화 모방 ?

Asset Bundle 로 만들고

프로젝트에서 제외!

Page 23: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

AssetBundle 관련 APICreation• BuildPipeline.BuildAssetBundle• BuildPipeline..BuildStreamedSceneAssetBundle

Loading• WWW• WWW.LoadFromCacheOrDonwload• AssetBundle.Load• Application.LoadLevel

Unloading• WWW.Dispose• AssetBundle.Unload• Resources.UnloadUnusedAsset

WWW

웹 서버에 올려진 리소스를

다운로드 받게 해주는 클래스

Page 24: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

AssetBundle Creation Sample Code

Page 25: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

AssetBundle Creation Sample Code번외 !

에디터 메뉴에 자동으로 추가

Page 26: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

Loading Sample Code

번외 ! Coroutine• 함수 호출을 잠시 중단 시키고 다음 업데이트에서 실행이 멈춘 이후부터 실행되는

기능• 쓰레드와 비슷하게 별도의 콜 스택을 가지고 동작하지만 쓰레드는 아님

Page 27: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

기본적인 사용법은 알고 프로그래밍 했지만…디버깅은 물론이고 기능 추가하기가 힘들었습니다 .

관련 코드가 여기저기 흩어져 있어서 ㅠㅠ

그리고 우리 팀에게 떨어진 일은…

디버깅과 최적화

Page 28: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

기존 코드로는 도저히 작업을 진행할 수가 없어서

전격 리팩터링 진행• AssetBundle 관련 코드 중앙 집중화• 여러 가지 디버깅 정보 추가

TsBundl

e

Page 29: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

문제 해결 (삽질 ) 과 최적화버그 이슈

메모리 이슈게임 플레이 쾌적성 이슈

생산성 향상 이슈

Page 30: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

버그 이슈 1/5종종 Asset Bundle 이 안 받아진다

원인 1. 웹 서버에 실제 파일이 없는 경우• 404 Page not foundWWW.text 에서 관련 문자열 찾아서 확인유니티 3.4 이후 버전에서는 WWW.error 에서 정상적으로 확인 가능

원인 2. 웹 브라우저의 동시 다운로드 개수 제한• 보통 2 개가 디폴트큐를 사용해 전체 다운로드 요청을 관리하고 동시에 제한된 개수만 처리함

WWW.asset

Bundle

WWW.textur

e

WWW.bytes

WWW.text

WWW.error

Page 31: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

버그 이슈 2/5Resources 폴더에 포함할 때 보다 메모리 사용량이 증가

C# 이라서 Garbage Collection 을 믿고 삭제 없이 생성만 했더니…

메모리 해제 코드 누락• WWW.Dispose()• WWW.assetBundle.Unload(false) 누락

유니티가 제공하는 API 는 C++ 로 구현되어 있어요 ~리소스 해제에 관련된 함수를 꼭 찾아봅시다 !

Page 32: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

버그 이슈 3/5맵을 로딩을 했는데 안 보인다

Resources.UnloadUnusedAsset 호출 후 바로 Load 할 경우 발생• 삭제 마킹만 해놓고 다음 프레임에서 실제 삭제되는 경우가 많다

Resources.UnloadUnusedAsset• 더 이상 레퍼런스가 없는 객체들을 모아 메모리에서 삭제• 호출한 현재 프레임에서 작업이 완료되는걸 보장하지 않음

런타임 컨텐츠 씬그래프

Page 33: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

버그 이슈 4/5게임 플레이 중 메모리가 계속 증가하다가 씬 전환할 때 줄어든다씬 전환시에만 런타임에 할당한 메모리를 정리하는 기능이 들어가 있다• 주기적으로 Resources.UnloadUnusedAsset() 호출해준다

GC.Collect 도 함께 호출 됨• 부하가 크기 때문에 적절한 시점을 찾아야 한다 !

Page 34: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

필수 메모리 정리 코드 샘플

1 Frame Skip

Page 35: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

버그 이슈 5/5Asset Bundle 에 포함된 스크립트가 없거나 동작하지 않아요• Asset Bundle 을 만들었을 때와 스크립트 코드가 틀려져서 발생• Asset Bundle 에 포함되는 스크립트는 수정시 유의해야 함Asset Bundle 을 새로 만들어야 하는 경우• 데이터 필드의 변수 이름이 변경된 경우• 데이터 필드가 추가된 경우• 클래스를 삭제한 경우구 버전 Asset Bundle 을 사용해도 되는 경우• 데이터 필드가 삭제된 경우• 스크립트의 실행 코드만 변경된 경우• 클래스 이름이 변경된 경우

반드시 유니티 에디터 상에서 바꿔야 함 . 탐색기에서 바꾸면 헛일 .

클래스의 자동 Serialize 속성

Page 36: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

메모리 이슈 1/5Audio 메모리 해제가 안 된다오디오가 플레이 될 때마다 메모리 증가그런데 사용 후 메모리가 반환 되지 않음Audio 는 특이하게 AssetBundle.Unload(true) 를 호출해 주어야만메모리에서 완전히 정리된다

Unload(false) 는 레퍼런스가 있으면 남겨둔다 .Unload(true) 는 레퍼런스가 있어도 강제 삭제

Page 37: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

메모리 이슈 2/5메모리 스파이크 발생게임 드라마를 볼 때 메모리가 심하게 증가게임 드라마의 경우 연출을 위해 많은 카메라를 사용활성화된 많은 카메라가 있을 경우 씬에 있는 거의 모든 객체가 로딩카메라를 끄면 문제 해결

Page 38: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

메모리 이슈 3/5점진적인 메모리 증가 현상유니티 Garbage Collection 모듈 특징• 메모리가 부족할 때 추가 할당• 이미 잡은 메모리는 내부에서 관리하고 해제하지 않는다

잦은 new 할당 객체는 객체 메모리 풀로 완화 !• 너무 잦은 new 할당은 오브젝트 풀로string 연산은 StringBuilder 로 대체

Page 39: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

string 연산의 위험성String 은 Immutable 패턴 객체생성시 초기화 이후에는 절대로 내부의 데이터를 바꿀 수 없다 !데이터를 참고하고자 할 때는 임시객체를 생성한다 .

Page 40: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

메모리 이슈 4/5그래도 발생하는 지속적인 메모리 증가 현상• 씬 전환시 메모리가 완전히 정리되지 않는 상황 발생

• 웹 브라우저 비정상 종료 후 메모리 해지가 안되고 재실행시 초기 점유량 높음첫 비정상 종료 이후 더 빨리 비정상 종료됨

• Garbage Collection 모듈 문제Mono Boehm GC 문제 Sgen-GC 로 업데이트 예정

Page 41: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

메모리 이슈 5/5메모리 할당 실패• Too many heap section

한 프레임 내에서 한번에 너무 많은 객체 할당이 일어날 경우 발생• 원인이 밝혀지지 않은 유니티 모듈 내 malloc 실패

Page 42: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

게임 플레이 쾌적성 이슈 1/4Asset Bundle Caching• 매번 웹 서버에 접근하고 다운로드하는 오버헤드를 없앤다 .• 처음 한번만 캐시에 저장하고 로컬 파일처럼 사용 .WWW.LoadFromCacheOrDownLoad(url, version) 사용• 파일 업데이트 패치를 위해 version 관리가 필요하다 .

Pro 버전에서 지원됨 .Free 버전에서는 무려 50M 지원유료 라이선스를 구입해서 용량 확장 가능

비꼬는 거 절대 아님 !

Page 43: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

Asset Bundle Caching Bug!파일이 많을 때 일부 캐시에 저장하지 못해서 매번 다운로드 받는 문제 .

이 외에도 많은 버그들을 알고 있어서유니티사와 협력하여 문제 수정 중에 있지만

해결은 언제나 다음 버전에서나…

Page 44: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

게임 플레이 쾌적성 이슈 2/4CPU 스파이크 발생게임 화면이 뚝뚝 끊기면 기분 나빠요 ~

Page 45: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

CPU 스파이크 발생 상황발생 상황 1. 서버에서 받은 여러 캐릭터 생성 명령• 한 프레임에서 처리하는 수를 조절하여 분산 시켜 해결발생 상황 2. Animation.AddClip 함수• 주인공 캐릭터의 경우 여러 파트로 나누어진 AssetBundle 을 다운로드 받아서

조립함• 그런데 애니메이션을 추가하는 순간 유니티 내부적으로 오버헤드 발생• 애니메이션이 포함된 캐릭터를 미리 만들어놓고 캐싱해서 문제 해결발생 상황 3. 순수 파일 IO 시간• Coroutine 과 비동기 로딩함수를 사용하여 Lag 현상 제거발생 상황 4. Garbage Collection• Immutable 패턴을 사용한 객체 사용 조심• Object Pool 로 Garbage 없이 재사용 하도록 수정

Immutable

대표적인 객체가 string

StringBuilder 사용 권장

Page 46: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

비동기 로딩함수 사용 샘플 코드

비동기 방식이기 때문에

요청한 후 바로 사용하면

바보됩니다 !

Page 47: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

게임 플레이 쾌적성 이슈 3/4Asset Bundle Pre-downloading• 웹 다운로드 시간을 없애기 위해 게임 진행에 맞추어 필요한 리소스를 미리

다운로드

Page 48: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

게임 플레이 쾌적성 이슈 4/4씬 전환 대기 시간을 줄이자 .씬 전환시 발생하는 로딩 시간 단축• 내정 씬과 전투 맵을 미리 로딩• 필드 맵과 전투맵은 공유• 씬 전환을 관리하는 씬 스위처 구현

필드

내정전투

Page 49: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

생산성 향상 이슈 1/2프로젝트의 거대화와 악몽의 시작• 메모리 부족과 에디터 비정상 종료• 변경 사항 반영하는데 반나절

프로젝트 분리와 악몽의 시작• 리소스 GUID 관리 문제 발생• 리소스가 사라지거나 덮어써지거나…

자세한 내용은 아래 세션 참고25 일 수 11 시 307 호 공현구 / 장건희대형 게임 개발환경과 Unity유니티를 사용한 대규모 프로젝트

어쩌라는 건지 ㅠㅠ어쨌거나 프로젝트는 분리

유니티는 아직까지는

대형 프로젝트에 대한

배려가 부족하다 .

Page 50: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

생산성 향상 이슈 2/2Local WWWAsset Bundle 이 서버에 올라가 있어야만 런타임에 리소스 확인 가능디자이너들은 서버에 올라갈 때 까지 일 주일 이상 확인 불가서버 접속 없이 작업한 리소스 확인 기능이 필요• WWW(“http://외에 사용할 수 있는 프로토콜” )

ftp:// file://• WWW(“file://c:/myResource/mywork.assetbundle”)

Page 51: 삼국지를품다- 인스톨이 필요없는 MMORPG 만들기 - 박현우, NDC12

NEXON DEVELOPERS CONFERENCE 2012

감사합니다

Q&A박현우

[email protected]