ݺߣ

ݺߣShare a Scribd company logo
Korea Games Conference       박성준
       KGC 2012          (notorz@hotmail.com)
유연한 컨텐츠 개발을 위한
 온라인 게임 아키텍처



      Korea Games Conference       박성준
             KGC 2012          (notorz@hotmail.com)
온라인 게임 액체처럼 만들자
콘솔 게임
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
온라인 게임
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
그렇다면..

컨텐츠는 누가 만들어야 까요?
서버 프로그래머?




            클라이언트 프로그래머?
서버      컨텐츠    클라이언트
프로그래머   프로그래머   프로그래머
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
그래스
                 프로그래머
           툴             물리 엔진
         프로그래머           프로그래머




네트워크                              인공 지능
프로그래머                            프로그래머




 Input                            사운드
프로그래머                            프로그래머




           UI            게임 플레이
         프로그래머           프로그래머
                 스크립터
그래스
                 프로그래머
        게임 플레이
        프로그래머
                   UI
                 프로그래머
네트워크      툴
프로그래머   프로그래머
                  Input
                 프로그래머

  DB    인공 지능
프로그래머   프로그래머
                  사운드
                 프로그래머

        스크립터
                 물리 엔진
                 프로그래머




 서버      ???     클라이언트
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
GameLogicServer




전투 시스템
그래스
                 프로그래머
        게임 플레이
        프로그래머
                   UI
                 프로그래머
네트워크      툴
프로그래머   프로그래머
                  Input
                 프로그래머

  DB    인공 지능
프로그래머   프로그래머
                  사운드
                 프로그래머

        스크립터
                 물리 엔진
                 프로그래머




 서버     컨텐츠      클라이언트
서버     컨텐츠    클라이언트
프로그래머   프로그래머   프로그래머
컨텐츠 개발 컨셉

• 세션 중심 개발
  • 유저와 서버 사이의 1:1 이벤트
  • 존 입장 / 변경 / 퇴장
  • 옵션 정보 저장
  • 게임 외적인 이벤트
• 게임 오브젝트 중심 개발
  • 게임 오브젝트들 사이의 이벤트
  • 이동 / 공격 / 피격
  • 아이템 떨어뜨리기 / 줍기
  • 게임 내적인 이벤트
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Core

           Engine
Shodown
           Contents

            Tools

 Server
Platform
Core

          Engine

         Contents

Logic
Server
          Client    Tools
Core.Native


        Core.Net


       FileModule
Core
       LogModule


       ShodownFile


       ShodownLog
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Core




FileModule          LogModule



Shodown             Shodown
  File                Log
Graphics


  UI                  DB

          Engine

Network              Input

          Sound
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Graphic
                                          Object


         Graphic   IGraphic
         Manager    Factory
                                          IGraphic
                              IRenderer
                                           Source
GraphicModule
GamebryoWrapper
                   Gamebryo
                    Factory
                                          Graphic
                              Renderer
                                          Source
컨텐츠를 개발할 때에는
 컨텐츠’만’ 개발하자
플레이어가
몬스터를
강베기 스킬로
공격한다

          플레이어 모델을 띄운다
          몬스터 모델을 띄운다
          강베기 애니메이션을 재생한다
          피격 애니메이션을 재생한다
          데미지 계산을 한다
          HP를 깎는다
          이펙트를 터뜨린다
          사운드를 재생시킨다
          UI 연출을 한다       모델을 어떻게?
                          애니메이션을 어떻게?
                          이펙트 렌더링을 어떻게?
                          사운드 재생을 어떻게?
                          이미지를 화면에 어떻게?
Client
                          Client
              System

     Server                        Logic
     System                        Server




GameBase                             SinglePlay
                   Contents
 System                                    Test
클라이언트 컨텐츠


 공통 컨텐츠


  서버 컨텐츠

 클라이언트 실행 파일 / 모듈의 조합


 로직 서버 실행 파일 / 모듈의 조합


 싱글 테스트 실행 파일 / 모듈의 조합
GameBase
                   System




  ServerSystem                    ClientSystem




LogicServer      SinglePlayTest          Client
Network                      UI
                          Module                     Module

                                           Graphic            Sound
                                           Module             Module
Database
 Module
                          GameBase
                           System                                 Input
                                                                 Module




           ServerSystem              ClientSystem
Network                UI
                                  Module               Module

                                            Graphic                Sound
                                            Module                 Module
           Database
            Module
                                                       Scaleform
                                                                       Input
                                                        Wrapper
                                                                      Module

                                            Gamebryo
                                             Wrapper
                                                         Shodown
  ADO        DBS         Lua                              Sound
Database   Connector   Database

                                                                     Shodown
                                                                       Input
Lua        Gamebryo
                          Database      Wrapper
                                                  Scaleform
                 ADO                               Wrapper
               Database                                            Shodown
                                                                    Sound
  DBS
Connector                                                                    Shodown
                                                                               Input




            LogicServer          SinglePlayTest               Client
세션 중심 개발

• 유저와 서버 사이의 1:1 이벤트
• 존 입장 / 변경 / 퇴장
• 옵션 정보 저장
• 등 게임 외적인 이벤트
IAccept
                                   Observer




                                 ServerSession
                                     Base
                    ServerBase



                                 ServerObject
                                     Base

Network   Network
Manager   Factory


                                   IConnect
                                   Observer


                    ClientBase

                                 ClientSession
                                      Base




                                 ClientObject
                                     Base
Server

Server    Server     Server    Server    Server
Session   Session    Session   Session   Session




 Client    Client     Client    Client    Client
Session   Session    Session   Session   Session



Client    Client    Client     Client    Client
Accept
Observer




 Server
  Base
Accept
                   Observer




                    Server
                     Base




          Client
          Base



Network
Manager
Accept
                        Observer




                         Server
                          Base




               Client
               Base



     Network
접속   Manager
Accept
                        Observer




                         Server
                          Base




               Client
               Base



     Network
접속   Manager
Accept
                        Observer




                         Server
                          Base




      Client
     Session

생성             Client
               Base



     Network
접속   Manager
Accept
                        Observer




                         Server
                          Base




               연결

      Client
     Session

생성             Client
               Base



     Network
접속   Manager
Accept
                        Observer



                   알림

                         Server
                          Base




               연결

      Client
     Session

생성             Client
               Base



     Network
접속   Manager
User
                                Accept
                               Observer



                          알림

                                Server
                                 Base




                      연결

      Client
     Session

생성                    Client
                      Base



     Network
접속   Manager
User
                                Accept
                               Observer



                          알림
     Server
     Session
                                Server
                                 Base




                      연결

      Client
     Session

생성                    Client
                      Base



     Network
접속   Manager
User
                                Accept
                               Observer



                          알림
     Server
     Session
                                Server
                                 Base


         연결
                      연결

      Client
     Session

생성                    Client
                      Base



     Network
접속   Manager
User                                User
                                Accept
                               Observer



                          알림
     Server                                               Server
     Session                                              Session
                                Server
                                 Base


         연결
                      연결

      Client                                               Client
     Session                                              Session

생성                    Client              Client
                      Base                Base



     Network                                              Network
접속   Manager                                              Manager
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
메시지 하나로 끝나는 일은 없다
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Coroutine




A               B
A


B

C

    시간 흐름
문제는…


• 게임 로직은 C++로 만든다!
• C++에서 코루틴을 쓰고 싶다!
• C++은 코루틴을 지원하지 않는다?!
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Boost 비공식 라이브러리
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처
문제는…


• 윈도우 비스타/2008 이상에서만 동작한다!
• 서버는 윈도우 2008 이상을 사용하면 된다…
• 하지만 클라이언트에서는 못쓴다!!
• 이유는 몇몇 Fiber 관련 API 때문…
!!!!!

민철님(@summerlight00) 사..사…..감사합니다!
Boost 만세!
        올리버 코왈크씨 만세!!!




STL TR 시리즈에 context와 coroutine이 포함되길 기대합니다..
아직 시간이 없어..
  써보진 못했지만…
    곧 변경할 예정…..

       아마도 KGC 2012가 끝난 다음 바로..?!
Call


  Yield
Resume




 Yield
Resume




 Yield
Resume

   End
유저시퀀스
• 유저 별로 발생하는 게임 외적인 이벤트 로직의 객체화
• 시퀀스 하나 = 이벤트의 처음부터 끝까지
• 내부적으로 boost::coroutine을 사용하여 구현
외부 인터페이스




User에 접근 가능


코루틴 인터페이스

실제 실행 함수
코루틴 함수
User
유저시퀀스는 추가복사 없이 데이터를 로직 코드로 바로 가져올 수 있다

유저 시퀀스의
스택 메모리에 할당됨




                           버퍼에서 데이터 Pop 하여
                           받으려는 변수로 바로 가져옴

                           Network - OnRecv()에서 실행




   User – Update()에서 실행


                          Thread가 달라도 문제 없음
메시지ID + 데이터 타입

      메시지에서 사용할 데이터 형식   메시지 타입

                                  선언한 순서로
                                  메시지ID 할당



버퍼에 데이터 넣기


버퍼에서 데이터 꺼내기
죄송합니다.. 시간에 쫓겨 급해서 Boost 전처리기 메타를 썼습니다..
유저시퀀스의 로직은 모두 User 객체의 Update에서 실행되는 것을 보장한다



   시퀀스 생성                                메시지 도착




                                                     Resume
             코루틴 생성 후                  Wait() 만나면
                              Resume                데이터 Pop         Resume
               Yield                      Yield
                                                      Yield
 코 루틴


              User - Update                         User - Update
 메인 루틴


    : Network Thread
    : Main Thread
유저시퀀스에서 프로시저 호출
User
                                         NetworkModule
 DatabaseModule




                  Database          Server
                   Object           Session




User 객체가 요청한 프로시저 결과는               User 객체가 전송한 메시지는
      User 객체가 받는다                       해당 User가 받는다
유저시퀀스에서 유저시퀀스 호출
게임 오브젝트 중심 개발
                             Server
           NPC1               Player1                 NPC2

           Server                                     Server
                               Server
           Object                                     Object
                               Object




Client    Client    Client              Client    Client       Client
Object    Object    Object              Object    Object       Object


NPC1     Player1    NPC2                NPC1     Player1       NPC2

         Client                                  Client
에서 설명합니다!
유연한 컨텐츠 개발을 위해서

         무조건 데이터 드리븐 X
      컨텐츠와 컨텐츠가 아닌 것 분리
            기능별로 모듈화
      최대한 응집성이 떨어지지 않게
수치 데이터 + 로직 모듈 + 모듈 조합 스크립트 = 데이터드리븐
감사합니다




Special Thanks to :
Dragonfly SS팀 일동/ 게임개발포에버 필진 일동 /
민철님 / 퐆삼촌 / 조진현님 / 김정우님 / 오즈형 /
레아형 / 민근형 / 티스형 / Hybrid님 / 창희님 /
대마왕님 / banhae님 / 정균님 / 스티브 / 바레로 박사님 /              박성준
김토마님 / Cagetu님 / 달땡땡님 / 퐁퐁퐁님 / 진짜님 /     mail : notorz@hotmail.com
박PD님 / 비토님 / 어제 같이 술 마신 분들 / 트친분들        twitter : @kgun86

More Related Content

Kgc2012 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처

  • 1. Korea Games Conference 박성준 KGC 2012 (notorz@hotmail.com)
  • 2. 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처 Korea Games Conference 박성준 KGC 2012 (notorz@hotmail.com)
  • 13. 서버 프로그래머? 클라이언트 프로그래머?
  • 14. 서버 컨텐츠 클라이언트 프로그래머 프로그래머 프로그래머
  • 16. 그래스 프로그래머 툴 물리 엔진 프로그래머 프로그래머 네트워크 인공 지능 프로그래머 프로그래머 Input 사운드 프로그래머 프로그래머 UI 게임 플레이 프로그래머 프로그래머 스크립터
  • 17. 그래스 프로그래머 게임 플레이 프로그래머 UI 프로그래머 네트워크 툴 프로그래머 프로그래머 Input 프로그래머 DB 인공 지능 프로그래머 프로그래머 사운드 프로그래머 스크립터 물리 엔진 프로그래머 서버 ??? 클라이언트
  • 20. 그래스 프로그래머 게임 플레이 프로그래머 UI 프로그래머 네트워크 툴 프로그래머 프로그래머 Input 프로그래머 DB 인공 지능 프로그래머 프로그래머 사운드 프로그래머 스크립터 물리 엔진 프로그래머 서버 컨텐츠 클라이언트
  • 21. 서버 컨텐츠 클라이언트 프로그래머 프로그래머 프로그래머
  • 22. 컨텐츠 개발 컨셉 • 세션 중심 개발 • 유저와 서버 사이의 1:1 이벤트 • 존 입장 / 변경 / 퇴장 • 옵션 정보 저장 • 게임 외적인 이벤트 • 게임 오브젝트 중심 개발 • 게임 오브젝트들 사이의 이벤트 • 이동 / 공격 / 피격 • 아이템 떨어뜨리기 / 줍기 • 게임 내적인 이벤트
  • 24. Core Engine Shodown Contents Tools Server Platform
  • 25. Core Engine Contents Logic Server Client Tools
  • 26. Core.Native Core.Net FileModule Core LogModule ShodownFile ShodownLog
  • 29. Core FileModule LogModule Shodown Shodown File Log
  • 30. Graphics UI DB Engine Network Input Sound
  • 32. Graphic Object Graphic IGraphic Manager Factory IGraphic IRenderer Source GraphicModule GamebryoWrapper Gamebryo Factory Graphic Renderer Source
  • 33. 컨텐츠를 개발할 때에는 컨텐츠’만’ 개발하자
  • 34. 플레이어가 몬스터를 강베기 스킬로 공격한다 플레이어 모델을 띄운다 몬스터 모델을 띄운다 강베기 애니메이션을 재생한다 피격 애니메이션을 재생한다 데미지 계산을 한다 HP를 깎는다 이펙트를 터뜨린다 사운드를 재생시킨다 UI 연출을 한다 모델을 어떻게? 애니메이션을 어떻게? 이펙트 렌더링을 어떻게? 사운드 재생을 어떻게? 이미지를 화면에 어떻게?
  • 35. Client Client System Server Logic System Server GameBase SinglePlay Contents System Test
  • 36. 클라이언트 컨텐츠 공통 컨텐츠 서버 컨텐츠 클라이언트 실행 파일 / 모듈의 조합 로직 서버 실행 파일 / 모듈의 조합 싱글 테스트 실행 파일 / 모듈의 조합
  • 37. GameBase System ServerSystem ClientSystem LogicServer SinglePlayTest Client
  • 38. Network UI Module Module Graphic Sound Module Module Database Module GameBase System Input Module ServerSystem ClientSystem
  • 39. Network UI Module Module Graphic Sound Module Module Database Module Scaleform Input Wrapper Module Gamebryo Wrapper Shodown ADO DBS Lua Sound Database Connector Database Shodown Input
  • 40. Lua Gamebryo Database Wrapper Scaleform ADO Wrapper Database Shodown Sound DBS Connector Shodown Input LogicServer SinglePlayTest Client
  • 41. 세션 중심 개발 • 유저와 서버 사이의 1:1 이벤트 • 존 입장 / 변경 / 퇴장 • 옵션 정보 저장 • 등 게임 외적인 이벤트
  • 42. IAccept Observer ServerSession Base ServerBase ServerObject Base Network Network Manager Factory IConnect Observer ClientBase ClientSession Base ClientObject Base
  • 43. Server Server Server Server Server Server Session Session Session Session Session Client Client Client Client Client Session Session Session Session Session Client Client Client Client Client
  • 45. Accept Observer Server Base Client Base Network Manager
  • 46. Accept Observer Server Base Client Base Network 접속 Manager
  • 47. Accept Observer Server Base Client Base Network 접속 Manager
  • 48. Accept Observer Server Base Client Session 생성 Client Base Network 접속 Manager
  • 49. Accept Observer Server Base 연결 Client Session 생성 Client Base Network 접속 Manager
  • 50. Accept Observer 알림 Server Base 연결 Client Session 생성 Client Base Network 접속 Manager
  • 51. User Accept Observer 알림 Server Base 연결 Client Session 생성 Client Base Network 접속 Manager
  • 52. User Accept Observer 알림 Server Session Server Base 연결 Client Session 생성 Client Base Network 접속 Manager
  • 53. User Accept Observer 알림 Server Session Server Base 연결 연결 Client Session 생성 Client Base Network 접속 Manager
  • 54. User User Accept Observer 알림 Server Server Session Session Server Base 연결 연결 Client Client Session Session 생성 Client Client Base Base Network Network 접속 Manager Manager
  • 59. A B C 시간 흐름
  • 60. 문제는… • 게임 로직은 C++로 만든다! • C++에서 코루틴을 쓰고 싶다! • C++은 코루틴을 지원하지 않는다?!
  • 65. 문제는… • 윈도우 비스타/2008 이상에서만 동작한다! • 서버는 윈도우 2008 이상을 사용하면 된다… • 하지만 클라이언트에서는 못쓴다!! • 이유는 몇몇 Fiber 관련 API 때문…
  • 67. Boost 만세! 올리버 코왈크씨 만세!!! STL TR 시리즈에 context와 coroutine이 포함되길 기대합니다..
  • 68. 아직 시간이 없어.. 써보진 못했지만… 곧 변경할 예정….. 아마도 KGC 2012가 끝난 다음 바로..?!
  • 69. Call Yield Resume Yield Resume Yield Resume End
  • 70. 유저시퀀스 • 유저 별로 발생하는 게임 외적인 이벤트 로직의 객체화 • 시퀀스 하나 = 이벤트의 처음부터 끝까지 • 내부적으로 boost::coroutine을 사용하여 구현
  • 71. 외부 인터페이스 User에 접근 가능 코루틴 인터페이스 실제 실행 함수 코루틴 함수
  • 72. User
  • 73. 유저시퀀스는 추가복사 없이 데이터를 로직 코드로 바로 가져올 수 있다 유저 시퀀스의 스택 메모리에 할당됨 버퍼에서 데이터 Pop 하여 받으려는 변수로 바로 가져옴 Network - OnRecv()에서 실행 User – Update()에서 실행 Thread가 달라도 문제 없음
  • 74. 메시지ID + 데이터 타입 메시지에서 사용할 데이터 형식 메시지 타입 선언한 순서로 메시지ID 할당 버퍼에 데이터 넣기 버퍼에서 데이터 꺼내기
  • 75. 죄송합니다.. 시간에 쫓겨 급해서 Boost 전처리기 메타를 썼습니다..
  • 76. 유저시퀀스의 로직은 모두 User 객체의 Update에서 실행되는 것을 보장한다 시퀀스 생성 메시지 도착 Resume 코루틴 생성 후 Wait() 만나면 Resume 데이터 Pop Resume Yield Yield Yield 코 루틴 User - Update User - Update 메인 루틴 : Network Thread : Main Thread
  • 78. User NetworkModule DatabaseModule Database Server Object Session User 객체가 요청한 프로시저 결과는 User 객체가 전송한 메시지는 User 객체가 받는다 해당 User가 받는다
  • 80. 게임 오브젝트 중심 개발 Server NPC1 Player1 NPC2 Server Server Server Object Object Object Client Client Client Client Client Client Object Object Object Object Object Object NPC1 Player1 NPC2 NPC1 Player1 NPC2 Client Client
  • 82. 유연한 컨텐츠 개발을 위해서 무조건 데이터 드리븐 X 컨텐츠와 컨텐츠가 아닌 것 분리 기능별로 모듈화 최대한 응집성이 떨어지지 않게 수치 데이터 + 로직 모듈 + 모듈 조합 스크립트 = 데이터드리븐
  • 83. 감사합니다 Special Thanks to : Dragonfly SS팀 일동/ 게임개발포에버 필진 일동 / 민철님 / 퐆삼촌 / 조진현님 / 김정우님 / 오즈형 / 레아형 / 민근형 / 티스형 / Hybrid님 / 창희님 / 대마왕님 / banhae님 / 정균님 / 스티브 / 바레로 박사님 / 박성준 김토마님 / Cagetu님 / 달땡땡님 / 퐁퐁퐁님 / 진짜님 / mail : notorz@hotmail.com 박PD님 / 비토님 / 어제 같이 술 마신 분들 / 트친분들 twitter : @kgun86