• Save
임태현, 게임 서버 디자인 가이드, NDC2013
Upcoming SlideShare
Loading in...5
×
 

임태현, 게임 서버 디자인 가이드, NDC2013

on

  • 3,791 views

 

Statistics

Views

Total Views
3,791
Views on SlideShare
3,698
Embed Views
93

Actions

Likes
26
Downloads
0
Comments
0

4 Embeds 93

http://mychang1121.blogspot.kr 84
http://mychang1121.blogspot.com 6
http://devilchen.tistory.com 2
http://127.0.0.1 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

임태현, 게임 서버 디자인 가이드, NDC2013 임태현, 게임 서버 디자인 가이드, NDC2013 Presentation Transcript

  • 게임 서버 디자인 가이드넥슨 W엔지니어링팀 임태현
  • 게임 서버 디자인 가이드너무 심하게 허세 부린 것같아서 패턴에서 가이드로색도 살짝 흐리게 ..ㅋ
  • 자기소개2002년 카이스트 전산과 졸업2002년 넥슨 입사2002년 마비노기2007년 허스키 익스프레스2010년 마비노기2
  • 12년
  • 한화는 언제 이길까..작업 공정 개선동료들과의 소통삼순이가 자꾸 종이 먹어기술 발전할 줄 아는 게 없어매너리즘내 작업 자랑질
  • 우리 서로 얘기해봐요~저는 당신이 어떻게 서버를만들고, 어떻게 이런 생각을하였는지 궁금합니다.그래서 제가 먼저시작해보겠습니다.
  • 목차• 시작하기• 기초 설계하기• 설계 확장하기• 마무리
  • 시작하기
  • 왜, 게임 서버를 직접만들수 밖에 없는가?
  • 소규모 게임에는 일부 적용Flash Media ServerJava 기반 웹 게임 서버Etc …
  • MMO-Game 용으로도 일부 시도실패하였음느리고 쓰기 불편
  • WHY?왜 실패하였을까?
  • MMO 게임의 특징MASSIVELY = 매우 많은MULTIPLAYER = 사람이ONLINE = 함께GAMES = 게임을 한다
  • MMO 게임의 특징MASSIVELY = 매우 많은MULTIPLAYER = 사람이ONLINE = 함께GAMES = 게임을 한다대부분은여기가 문제
  • Massive 문제의 해법들• 멀티스레드• 백엔드 분산• 서버 샤딩• 플레이어 제한• Etc …
  • 플레이어플레이어플레이어
  • 플레이어 플레이어플레이어NPCNPCNPCNPCNPCNPC
  • ….
  • 이 게임들을 같은 방식으로 구현할 수는 있다하지만 성능에 문제가 생기거나, 구현방법이 매우어려워질 것이라는 것은 쉽게 상상 할 수 있다.
  • 정리• 게임 서버의 핵심 구조는 게임 디자인(기획) 에 매우 민감하게 반응한다.• 역으로 서버의 구조로 인해 디자인에 제한이 생긴다.• 서버 프레임워크 전체를 가져와 쓰는 것은게임의 유니크함을 해칠 수 있다.
  • 게임은 유니크함을 가지고 있다그리고, 플레이의 유니크함이코드를 유니크하게 만든다그러니 직접 만들 수 밖에 없다…
  • 기초 설계
  • Logic(로직)Starter KitInput(입력)Execute(실행)Network EventSystem SchedulerEvent CallbackThread ModelServer DistributionBackend QueryLogin/outGame PlayResource Management
  • 스레드 모델 확장• Single Thread• Input Thread• Custom Thread Pool• Object Bound Thread
  • Single Thread• 입력을 폴링으로 처리한다.• 모든 로직이 순차적으로 처리된다.
  • Network MainLoopPacketHandler_LoginPacketHandler_AttackPlayersObjectsSystem SchedulerPacketTranslatorInput Execute LogicListen()Update()Close()Invoke()Update()packets += network.Update();packets += scheduler.Update();translator.Execute(packets);Add()Remove()Get()Add()Remove()Get()
  • 싱글 스레드 모델 특징• 구조가 간단하다.• Lock 문제가 발생하지 않는다.• 멀티코어의 이점을 사용할 수 없다.• 스레드 잠김이 없는 경우 꽤 빠르다.
  • Input Thread• 입력이 비동기 IO 일 때 사용 가능하다.• 로직이 IO 스레드에서 실행된다.• 별도의 스레드를 생성하지 않는다.
  • NetworkExecuterPacketHandler_LoginPacketHandler_AttackObjectsSystem SchedulerPacketTranslatorInput Execute LogicOnConnect()OnReceive()OnExpire()void OnHandle(Packet packet){var handler =transaltor.Translate(packet);Call(handler);}Add()Remove()Get()Translator()Resource Lock
  • 인풋 스레드 모델 특징• Lock 문제가 발생한다.• 스레드를 관리하지 않는다.• 스레드가 잠기는 경우에 성능 손해가 비교적 적다.
  • Custom Thread Pool• 로직이 스레드 풀에서 실행된다.• 실행 모듈에 작업 큐가 있다.
  • Network Executer GameThreadTaskHandlerObjectsSystem SchedulerThreadPoolInput Execute LogicOnConnect()OnReceive()OnExpire()void OnHandle(Packet packet){var task = packet.ToTask();TaskQueue.Enqueue(task);ThreadPool.SetSingal();}Add()Remove()Get()SetSignal() Resource LockTaskQueue Enqueue()Dequeue()void OnSingal(){task = TaskQueue.Dequeue();Run(task);}
  • 커스텀 스레드 풀 모델 특징• 스레드 수를 조절해, 성능을 최적화 할 수 있다.• 입력순서와 처리 순서가 달라 질 수 있다.• Lock 문제가 발생한다.• 스레드가 잠기는 경우에는 성능 손해가 크다.– 데이터베이스나 외부 서비스 동기화 쿼리에 의한 성능 손해가 매우 크다
  • 커스텀 스레드 풀 모델 특징• 스레드 수를 조절해, 성능을 최적화 할 수 있다.• 입력순서와 처리 순서가 달라 질 수 있다.• Lock 문제가 발생한다.• 스레드가 잠기는 경우에는 성능 손해가 크다.– 데이터베이스나 외부 서비스 동기화 쿼리에 의한 성능 손해가 매우 크다게임에서는 치명적인문제가 될 수 있다
  • Object bound Thread• 앞의 모델에서 입력 순서 문제를 해결• 스레드 별로 리소스 관리자가 할당된다
  • ExecuterGameThreadTaskHandlerThreadObjectsExecuteLogicvoid OnHandle(Packet packet){var task = packet.ToTask();var target = task.GetTarget();TaskQueue.Enqueue(target , task);}Add()Remove()Get()void OnSingal(){task = MyQueue.Dequeue();Run(task);}ThreadPoolvoid Enqueue(target, task){thread = FindThreadByObject(target);thread.Enqueue(task);thread.Signal();}Per Thread
  • 오브젝트 기반 스레드 모델 특징• 특정 객체를 타겟으로 하는 입력간의 순서가 보장된다.• Lock 문제가 거의 발생하지 않는다.• 전체 객체 검색이 불가능하다• 객체가 많이 몰리게 되는 곳이 있다면 성능 손해가 매우 크다.
  • [복습] Single ThreadInput Execute Logic
  • [복습] Input ThreadInput Execute Logic
  • [복습] Custom Thread PoolInput Execute Logic
  • [복습] Object Bound ThreadInput Execute Logic
  • 정리• 여러 모델의 장단점이 존재한다.• 베이스 프레임워크를 중간에 변경하는 것은 매우 어렵다.• 초기단계에서 게임의 최소한의 사양을 정하는 것이 좋다.– 불가능하다면 구현이 제일 간단한 싱글 스레드 모델로 만든다.
  • 설계 확장하기
  • Interaction
  • 플레이어월드MMO 의 경우 인터랙션이 지리적인관계로 이루어지는 경우가 많다
  • 플레이어월드MMO 의 경우 인터랙션이 지리적인관계로 이루어지는 경우가 많다인터랙션 레벨이 높음인터랙션 레벨이 낮음
  • Game World게임상의 지리적인 상태를 표현하고객체의 배치와 이동이 가능
  • 지형 데이터객체관측자아웃풋게임로직객체와 관측자가구분되지 않는경우도 있음Starter Kit
  • 플레이어캐릭터지형 데이터플레이어시야몬스터네트워크 시야에 들어오는 정보를 네트워크로 전달
  • 기본적인 동작CreateObject객체가 생성되었다객체가 시야안에 들어왔다DestroyObject객체가 파괴되었다객체가 시야밖으로 나갔다Broadcast객체가 액션/이동을 하였다객체의 상태/외형이 변하였다시야범위
  • 기본적인 동작FindInRange거리안에 있는 객체 검색GetDistanceWith다른 객체와의 거리 참조
  • 시야범위 안에 있는 객체들의 목록 검색시야범위에 따른 객체들의 입장/퇴장 이벤트일반적으로 공간 분할을이용해서 검색속도를 향상
  • 다양한 공간 분할 방법• 동적분할– 쿼드 트리– 서클 트리• 정적 분할– 타일
  • 타일 분할 간단 소개• 구현이 간단하다• 초기화 비용이 거의 없다 (via 동적분할)• 시야 거리를 동적으로 바꾸기 어렵다• 객체의 밀도가 낮아도 속도향상은 적다
  • 7119 1085 61 2 313 14 15 16124보이는영역보이지않는 영역나서로의 행동을 지켜본다8번으로 이동시 시야에서 사라진다10번으로 이동시 시야에 나타난다
  • 서버가 보는 심리스 월드• 클라이언트 기법은 이미 많은 곳에서 소개• 서버상에서 심리스 월드 구현에 대한 이야기
  • 심리스 월드를 바라보는 관점레벨 디자인 : 세계가 단절 없이 이어져 있다.클라이언트 : 리소스 절차적 로딩을 한다.서버 : 같은 공간분할 데이터로 관리된다.
  • 눈에 보이는 객체는 같은서버에 배치하는 것이 좋다서버에서의 인터랙션 : 객체의 값 읽기/변경같은 메모리 공간상에 없으면처리가 매우 복잡하다외형, 이동 및 액션공격/피격, 강제 상태 변경
  • 심리스 월드의 서버 제약눈에 보이는 객체들은 같은 서버에 배치하는 것이 좋다.메모리, 동시 접속자의 제한플레이어 100 vs NPC 1000+
  • 거대한 심리스 월드 해결방법• 조각내기– 걸어서 이동 할 수 없는 곳은 모두 분리하다.– 배타고 대륙이동, 전송게이트로 이동, 등등..• 서버 분산– 프록시 객체를 이용해서 여러 서버에 분산가능– 안정화 시키기 매우 어렵다.• 메모리, CPU 를 늘린다.– 공간분할후 부분적으로 독점을 해서 멀티스레드로 확장– 이게 짱인듯…
  • 정리• 지리적인 기준으로 인터랙션을 할 경우게임 월드의 개념이 필요하다.• 월드의 크기가 커지면 공간 분할을 한다.• 심리스를 할 수 있는 것과 해야만 하는 것을 구분한다.
  • 동기화 vs 비동기
  • 서비스의 속도를 떨어트리는 주된 이유공회전
  • 공회전의 주요 원인• DB 요청• 객체 잠금-Lock• 명시적 대기– Sleep();– Event.Wait();
  • 해결 법비동기 처리
  • 샘플 : 우편 처리String ReadLetter(id){letter = db.QueryLetter(id);return letter.Text;}DB여기까지 잠김상태
  • 샘플 : 우편 처리 - 비동기void ReadLetterBegin(id){db.BeginQueryLetter(id);}string ReadLetterEnd(id){return db.BeginQueryEnd(id);}DB
  • 그럼 비동기로 만들면되는 거 아닌가?
  • 비동기 코드 실제 상황BeginDB #1……EndDB #2DB #3…DB #1
  • 선택의 시간• 동기화 코드– 코드 작성에 유리하다– 성능에 불리하다• 비동기 코드– 성능에 유리하다– 코드 작성에 불리하다
  • 모델을 적당히 조정해서 최적의 경우를 찾아낸다. (너무 뻔한 얘기지만)경험이 필요하지만, 주위에 도움을 얻을 방법은 많다.
  • 동기화 코드 모델 샘플 제안
  • Input Thread• 입력이 비동기 IO 일 때 사용 가능하다.• 로직이 IO 스레드에서 실행된다.• 별도의 스레드를 생성하지 않는다.이것을 기반으로 구성해본다
  • NETWORKOnReceive LOGIC잠금상태Player플레이어게 랙으로 느껴진다
  • OnReceivePlayer난 빠르지~어!!! 반응이좀 느린데TWORK
  • • 잠금을 썼을 때 성능저하가 입력소스로 제한된다• 보통은 플레이어 한 명에게 해당된다• 최대 잠금 시간을 조절해서 (1s 이하) 불쾌감이 적게 할 수 있다.
  • 비동기화 코드 모델 제안 …은 없다• 개인적으로 싫어한다.• 필요하면 (울면서) 만들긴 한다.
  • 정리• 동기화 로직은 코드를 깔끔하게 한다• 비동기 로직은 성능향상을 시킨다• 이 둘 사이에서 균형을 잡아야 한다.– 개인적으로는 코드가 단순해 지는 쪽을 선호한다.
  • 마무리
  • 이야기 하고 싶은 것 복습저는 당신이 어떻게 서버를만들고, 어떻게 이런 생각을하였는지 궁금합니다.그래서 제가 먼저시작해보겠습니다.
  • 서버 개발을 이제 막 시작하는 분에게는 막막한 상황에서 가이드가 되기를 바랍니다.서버 개발에 익숙하신 분들에게는 더 좋은아이디어의 피드백을 함으로써 서로의 발전에 도움이 되기를 기대해 봅니다.
  • 못 다한 이야기들
  • 데이터 베이스 로직변경점 저장과 데이터베이스 성능 문제서버 샤딩과 관리샤드 vs 원 월드 vs 원 월드 채널링로깅과 오류 억제 장치오류 발생 통보와 안정성 향상을 위한 장치들
  • 감사합니다