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

  • View
    2.801

  • Download
    2

  • Category

    Software

Preview:

DESCRIPTION

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

Citation preview

NEXON DEVELOPERS CONFERENCE 2012

인스톨이 필요 없는Full 3D

MMORPG 게임 만들기

박 현 우

NEXON DEVELOPERS CONFERENCE 2012

강연 내용

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

Unity3D• Resources & Asset Bundle

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

NEXON DEVELOPERS CONFERENCE 2012

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

NEXON DEVELOPERS CONFERENCE 2012

삼국지를 배경으로

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

웹 Full 3D MMORPG 게임

NEXON DEVELOPERS CONFERENCE 2012

유니티는

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

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

NEXON DEVELOPERS CONFERENCE 2012

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

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

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

NEXON DEVELOPERS CONFERENCE 2012

웹 게임 증거

NEXON DEVELOPERS CONFERENCE 2012

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

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

내정

NEXON DEVELOPERS CONFERENCE 2012

화려한 렌더링 옵션

Real-time ShadowSSAO

BloomContrast Enhance

Color CorrectionFull Texture Size

Anisotropic Filtering

Terrain LODShader LOD

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

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

NEXON DEVELOPERS CONFERENCE 2012

NEXON DEVELOPERS CONFERENCE 2012

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

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

올 여름에는 오픈 ?

이상 ! 광고 끝 .

NEXON DEVELOPERS CONFERENCE 2012

이제 본격적으로 …

NEXON DEVELOPERS CONFERENCE 2012

MMORPG 설치 용량 비교

4G, 라이트 버전은 1G

13G

13G+@ 설치 시간은 ?

오래 걸립니다 ㅠㅠ

NEXON DEVELOPERS CONFERENCE 2012

1M Under

9M

230M

4G+@

웹 플레이어 설치

게임 구동 최소 데이터

게임 진입

개발된 컨텐츠

플레이어 설치

1 분 미만

게임 진입까지

1 분 미만

i5 CPU100Mbps

NEXON DEVELOPERS CONFERENCE 2012

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

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

NEXON DEVELOPERS CONFERENCE 2012

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

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

Scene

게임 플레이에 필요한

데이터를 담고 있는

레벨 데이터

NEXON DEVELOPERS CONFERENCE 2012

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

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

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

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

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

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

Scene 에 모두 포함

NEXON DEVELOPERS CONFERENCE 2012

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

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

Resources.Load

NEXON DEVELOPERS CONFERENCE 2012

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

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

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

NEXON DEVELOPERS CONFERENCE 2012

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

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

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

Pro 버전에서만 지원

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

mation, Audio, Script etc.

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

부분 유료화 모방 ?

Asset Bundle 로 만들고

프로젝트에서 제외!

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

웹 서버에 올려진 리소스를

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

NEXON DEVELOPERS CONFERENCE 2012

AssetBundle Creation Sample Code

NEXON DEVELOPERS CONFERENCE 2012

AssetBundle Creation Sample Code번외 !

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

NEXON DEVELOPERS CONFERENCE 2012

Loading Sample Code

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

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

NEXON DEVELOPERS CONFERENCE 2012

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

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

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

디버깅과 최적화

NEXON DEVELOPERS CONFERENCE 2012

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

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

TsBundl

e

NEXON DEVELOPERS CONFERENCE 2012

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

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

생산성 향상 이슈

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

NEXON DEVELOPERS CONFERENCE 2012

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

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

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

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

NEXON DEVELOPERS CONFERENCE 2012

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

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

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

런타임 컨텐츠 씬그래프

NEXON DEVELOPERS CONFERENCE 2012

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

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

NEXON DEVELOPERS CONFERENCE 2012

필수 메모리 정리 코드 샘플

1 Frame Skip

NEXON DEVELOPERS CONFERENCE 2012

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

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

클래스의 자동 Serialize 속성

NEXON DEVELOPERS CONFERENCE 2012

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

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

NEXON DEVELOPERS CONFERENCE 2012

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

NEXON DEVELOPERS CONFERENCE 2012

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

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

NEXON DEVELOPERS CONFERENCE 2012

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

NEXON DEVELOPERS CONFERENCE 2012

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

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

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

NEXON DEVELOPERS CONFERENCE 2012

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

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

NEXON DEVELOPERS CONFERENCE 2012

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

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

비꼬는 거 절대 아님 !

NEXON DEVELOPERS CONFERENCE 2012

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

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

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

NEXON DEVELOPERS CONFERENCE 2012

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

NEXON DEVELOPERS CONFERENCE 2012

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

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

Immutable

대표적인 객체가 string

StringBuilder 사용 권장

NEXON DEVELOPERS CONFERENCE 2012

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

비동기 방식이기 때문에

요청한 후 바로 사용하면

바보됩니다 !

NEXON DEVELOPERS CONFERENCE 2012

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

다운로드

NEXON DEVELOPERS CONFERENCE 2012

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

필드

내정전투

NEXON DEVELOPERS CONFERENCE 2012

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

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

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

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

유니티는 아직까지는

대형 프로젝트에 대한

배려가 부족하다 .

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

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

NEXON DEVELOPERS CONFERENCE 2012

감사합니다

Q&A박현우

hwpark@ndoors.net

Recommended