SlideShare a Scribd company logo
1 of 130
Download to read offline
유연한 컨텐츠 개발을 위한
 온라인 게임 아키텍처


   Kasa Study (2012/11/01)
            박성준
온라인 게임 액체처럼 만들자
콘솔 게임
온라인 게임
그렇다면..

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




            클라이언트 프로그래머?
서버      컨텐츠    클라이언트
프로그래머   프로그래머   프로그래머
그래픽스
                 프로그래머
           툴             물리 엔진
         프로그래머           프로그래머




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




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




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

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

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




 서버     컨텐츠      클라이언트
컨텐츠 개발 컨셉

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

           Engine
Shodown
           Contents

            Tools

 Server
Platform
Core

          Engine

         Contents

Logic
Server
          Client    Tools
Core.Native


        Core.Net


       FileModule
Core
       LogModule


       ShodownFile


       ShodownLog
전반적으로 사용되는 것들..




인터페이스의 구현 프로젝트




  인터페이스 프로젝트
Core




FileModule          LogModule



Shodown             Shodown
  File                Log
Graphics


  UI                  DB

          Engine

Network              Input

          Sound
수정중인 오픈 라이브러리…


인터페이스 프로젝트


인터페이스의 구현 프로젝트


테스트 프로젝트


그 외 기타 등등(xml, lua, fx 등)
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
메시지 하나로 끝나는 일은 없다
Coroutine




A               B
A


B

C

    시간 흐름
문제는…


• 게임 로직은 C++로 만든다!
• C++에서 코루틴을 쓰고 싶다!
• C++은 코루틴을 지원하지 않는다?!
Boost 비공식 라이브러리
문제는…


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




STL TR 시리즈에 context와 coroutine이 포함되길 기대합니다..
Coroutine도 Boost 포함 예정
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가 받는다
유저시퀀스에서 유저시퀀스 호출
게임 오브젝트 중심 개발

 • 게임 오브젝트들 사이의 이벤트
 • 이동 / 공격 / 피격
 • 아이템 떨어뜨리기 / 줍기
 • 등 게임 내적인 이벤트
게임 오브젝트!
                                    캐릭터
• 플레이어, 몬스터 등 캐릭터
                               레벨         지형
• 바위, 나무, 건물 등 배경 오브젝트
• 함정, 회복아이템 등 트리거
                                    오브젝
                         발사체                    프랍
• 미사일, 수류탄, 파편 등                     트

• 카메라, 광원 등
• 캐릭터가 서있는 지형              카메라            트리거

                                    광원
캐릭터

      레벨         지형            오브젝트

                                             상호작용

           오브젝
발사체                    프랍
            트
                            오브젝트

  카메라            트리거                  오브젝트

           광원




 게임 = 게임 오브젝트 사이의 상호작용
컴포넌트 + 게임 오브젝트
컴포넌트 설계는 좋지만..


• 의존적인 컴포넌트 구분!
• 메시지 통신X 메시지 객체 통신!
• 그렇지만 의존성은 피하자!
• 스크립트 친화적 구현!
의존적인 컴포넌트?
Controller
• 의존적인 컴포넌트는 컨트롤러의 속성을 가진다
• 다른 컴포넌트에 접근하는걸 고려하여 디자인
• 컴포넌트와는 다르게 활성화/비활성화 존재
Owner Entity가 가진 다른 컴포넌트와 컨트롤러에 접근 가능!




      AAA                Entity
   Component



                                      BBB
              BBB                   Controller
           Component


                         AAA
                       Controller
메시지 통신?
분산되는 로직 처리
     = 응집력이 떨어진다

순서대로 로직 처리가 힘듦
    = 작업 스트레스 증가
1. 액션 단위로 로직 처리

2. 액션객체가 컴포넌트들에 접근

3. 게임 오브젝트는 액션들을 관리
죄송합니다.. 시간에 쫓겨 급해서 Boost 전처리기 메타를 썼습니다..
전처리기 메타 코드가
만들어내는 코드
액션의 구현
     Action의 데이터


     위에서 정의한 Action데이터로
     virtual void Do( 데이터 ) = 0;
     순수 가상 함수가 만들어진다


    GetOwner()를 이용하여
    Action이 실행된 Entity를
    얻어올 수 있다
Owner Entity가 가진 다른 컴포넌트와 컨트롤러에 접근 가능!


                                     생성
                                      AAA     DoAction
             Entity
                                     Action     호출




   AAA         BBB        AAA
Component   Component   Controller




                                         접근
다른 객체에 접근을 위해..


                Entity
               Handler          DoAction 함수를 가진다



                Entity



                                다른 Entity / 또는 외부에서 접근


Controller와 Action의 Owner로 노출
업데이트 순서




 Entity::    Entity::   Component
 Update      Update      System::
Controller   Action       Update
게임 오브젝트와 네트워크 통신
                             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
NPC1     Player1   NPC2

Server             Server
         Server
Object             Object
         Object




          Server
           Base
NPC1     Player1   NPC2

Server             Server
         Server
Object             Object
         Object




          Server
           Base
NPC1              Player1            NPC2

ID : 0            ID : 1             ID : 2
         Server                               Server
                           Server
         Object                               Object
                           Object




                            Server
                             Base
NPC1              Player1            NPC2

ID : 0            ID : 1             ID : 2
         Server                               Server
                           Server
         Object                               Object
                           Object




                            Server
                             Base




                  Client
                  Base
NPC1                           Player1            NPC2

                  ID : 0                           ID : 1             ID : 2
                             Server                                            Server
                                                            Server
                             Object                                            Object
                                                            Object




                                                             Server
                                                              Base




                                                   Client
                                                   Base




         Client                Client            Client
         Object                Object            Object
ID : 0              ID : 1              ID : 2
         NPC1                Player1             NPC2
NPC1                           Player1            NPC2

                  ID : 0                           ID : 1             ID : 2
                             Server                                            Server
                                                            Server
                             Object                                            Object
                                                            Object




                                                             Server
                                                              Base




                                                   Client
                                                   Base




         Client                Client            Client
         Object                Object            Object
ID : 0              ID : 1              ID : 2
         NPC1                Player1             NPC2
NPC1                           Player1            NPC2

                  ID : 0                           ID : 1             ID : 2
                             Server                                            Server
                                                            Server
                             Object                                            Object
                                                            Object




                                                             Server
                                                              Base




                                                   Client
                                                   Base




         Client                Client            Client
         Object                Object            Object
ID : 0              ID : 1              ID : 2
         NPC1                Player1             NPC2
NPC1                           Player1                                NPC2

                  ID : 0                           ID : 1                               ID : 2
                             Server                                                                Server
                                                            Server
                             Object                                                                Object
                                                            Object




                                                             Server
                                                              Base




                                                   Client             Client
                                                   Base               Base




         Client                Client            Client                        Client               Client            Client
         Object                Object            Object                        Object               Object            Object
ID : 0              ID : 1              ID : 2                    ID : 0                  ID : 1             ID : 2
         NPC1                Player1             NPC2                          NPC1                Player1            NPC2
NPC1                           Player1                                NPC2

                  ID : 0                           ID : 1                               ID : 2
                             Server                                                                Server
                                                            Server
                             Object                                                                Object
                                                            Object




                                                             Server
                                                              Base




                                                   Client             Client
                                                   Base               Base




         Client                Client            Client                        Client               Client            Client
         Object                Object            Object                        Object               Object            Object
ID : 0              ID : 1              ID : 2                    ID : 0                  ID : 1             ID : 2
         NPC1                Player1             NPC2                          NPC1                Player1            NPC2
Entity가 받은 메시지는 어떻게?
Action과 Message를 연결
Message가 ServerObject/ClientObject에 도착하면 연결된 Action 실행


                      Network
                       Action
                      Manager


                                                  생성
          Server/                                 함수
           Client                        Action
          Object




                      Network - OnRecv
메시지ID + 데이터 타입

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

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



버퍼에 데이터 넣기


버퍼에서 데이터 꺼내기
액션 실행을 위한                               네트워크로 받은
                  메시지를 받은 엔터티
  함수포인터                                  메시지 버퍼




       ServerObject와 연결   ClientObject와 연결
액션과 네트워크 통신의 연결

        메시지와 Action의 연결 선언


               메시지와 Action의
               데이터가 같아야만
               컴파일이 된다




           메시지와 Action의 연결 정의
게임 오브젝트와 스크립트
lua_state




            컨트롤러           컨트롤러
                           컨트롤러
            컨트롤러
             컨트롤러           컨트롤러
                           Component
             Controller
            테이블             테이블
                            테이블
             테이블
              테이블            테이블
                              Table
               Table



                            컨트롤러
                            컨트롤러
                             컨트롤러
                              Instance
                             테이블
                             테이블
                   Lua        테이블
                                Table
                  Thread
컨트롤러와 스크립트의 연결
Entity




                     Script            Controller 정보
Controller
                    Manager            lua_state에 입력



                                       Entity별로
                                       lua table과
                                       lua thread 생성
             Controller Instance
             lua table 생성하여
             Controller userdata와 연결
C++


                                   AAA
                                 Controller                              Class



         AAA               AAA                   AAA          AAA
      Controller        Controller            Controller   Controller   Instance
      Instance1         Instance2             Instance3    Instance4




Lua

                                   AAA
                                 Controller
                                                                         table


         AAA               AAA                   AAA          AAA
      Controller        Controller            Controller   Controller   userdata
      Instance1         Instance1             Instance1    Instance1

           meta table
         AAA               AAA                   AAA          AAA
      Controller        Controller            Controller   Controller    table
      Instance1         Instance2             Instance3    Instance4
부모 클래스와 자식 클래스
  모두 연결할 경우?
C++

                       AAA
                     Controller

     AAA
  Controller
                          상속
   Instance
                       BBB
                     Controller

                                          BBB
                                       Controller
                                        Instance


Lua

                       AAA
                     Controller

     AAA                  meta table
  Controller
   Instance
                       BBB
                     Controller
        meta table                        BBB
                                       Controller
     AAA                                Instance
  Controller
   Instance
                                          BBB
                                       Controller
                                        Instance
스크립트와 연결




            스크립트 함수 실행



C++ 함수 실행
스크립트에서 컴포넌트 접근
Entity




Component
             Script   Component 정보
            Manager   lua_state에 입력
C++


                               AAA
                            Component                              Class



          AAA          AAA                  AAA          AAA
      Component    Component            Component    Component    Instance
       Instance1    Instance2            Instance3    Instance4




Lua

                               AAA                                 table
                            Component




          AAA          AAA                  AAA          AAA
      Component    Component            Component    Component    userdata
       Instance1    Instance2            Instance3    Instance4
Entity
Wrapper




 Entity
Entity




                                      Script            Controller 정보
                 Controller
                                     Manager            lua_state에 입력



                                                        Entity별로
                                                        lua table과
                                                        lua thread 생성
Controller의 owner로            Controller Instance
EntityWrapper 생성 후            lua table 생성하여
Controller Instance           Controller userdata와 연결
lua table에 “owner” Set
컴포넌트 설계의 장점 멀티쓰레딩!
어떻게?!



Game   Animation   Physics   Rendering   Audio
Loop
Set up




                 Thread1
Game                        Thread2
       Thread0                        Thread3
Loop




                       Process
                        Result
현재 구조를 보면…

• Controller는 Owner가 가지고 있는 것만 접근
 -> Owner의 Component / Controller
• 다른 Entity에는 DoAction으로 할 일 전달
• Entity별로 Controller들 업데이트
 Entity별로 Action Queue 처리
 Component별로 업데이트
다시 정리해보면

• Entity는 다른 Entity에 직접 접근 X
• Component는 다른 Component에 직접 접근 X
• Entity별로 Controller들 업데이트
 Entity별로 Action Queue 처리
 Component별로 업데이트
업데이트 순서




 Entity::    Entity::   Component
 Update      Update      System::
Controller   Action       Update
Set up


                 Thread1    Thread2
       Thread0                        Thread3   Controller


                       Set up



       Thread0              Thread2
Game             Thread1              Thread3     Action
Loop

                       Set up


                 Thread1
       Thread0              Thread2   Thread3   Component


                       Process
                        Result
유연한 컨텐츠 개발을 위해서

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

More Related Content

Viewers also liked

성북마을미디어 특강 - 콘텐츠유통 (주일)
성북마을미디어 특강 - 콘텐츠유통 (주일)성북마을미디어 특강 - 콘텐츠유통 (주일)
성북마을미디어 특강 - 콘텐츠유통 (주일)Juile Jang
 
2장 마케팅 발표
2장 마케팅 발표2장 마케팅 발표
2장 마케팅 발표Minsuk Chang
 
[무한도전 전라북도] 유기농브랜드 아이디어
[무한도전 전라북도] 유기농브랜드 아이디어[무한도전 전라북도] 유기농브랜드 아이디어
[무한도전 전라북도] 유기농브랜드 아이디어jeonbuk star
 
배달통이 바라보는 로컬 비지니스의 미래
배달통이 바라보는 로컬 비지니스의 미래배달통이 바라보는 로컬 비지니스의 미래
배달통이 바라보는 로컬 비지니스의 미래(주)배달통
 
Web Template
Web TemplateWeb Template
Web Templatekwj103
 
스마트폰 기반의 모바일 음악 서비스 시장 전망 및 업계의 대응전략
스마트폰 기반의 모바일 음악 서비스 시장 전망 및 업계의 대응전략스마트폰 기반의 모바일 음악 서비스 시장 전망 및 업계의 대응전략
스마트폰 기반의 모바일 음악 서비스 시장 전망 및 업계의 대응전략HwanJin 'David' Choi
 
2011년도 티켓몬스터 사업전략 로드맵
2011년도 티켓몬스터 사업전략 로드맵2011년도 티켓몬스터 사업전략 로드맵
2011년도 티켓몬스터 사업전략 로드맵mosaicnet
 
업종리포트 화장품 크로스미디어_201409
업종리포트 화장품 크로스미디어_201409업종리포트 화장품 크로스미디어_201409
업종리포트 화장품 크로스미디어_201409훈미 김
 
[표준]온라인브랜딩유통제안서
[표준]온라인브랜딩유통제안서[표준]온라인브랜딩유통제안서
[표준]온라인브랜딩유통제안서widecomms
 
iFunEngine: 30분 만에 게임 서버 만들기
iFunEngine: 30분 만에 게임 서버 만들기iFunEngine: 30분 만에 게임 서버 만들기
iFunEngine: 30분 만에 게임 서버 만들기iFunFactory Inc.
 
O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장
O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장
O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장Wooseok Seo
 
사업계획서 샘플 - 판매, 유통(Sales business, distribution ppt templates sample)
사업계획서 샘플 - 판매, 유통(Sales business, distribution ppt templates sample)사업계획서 샘플 - 판매, 유통(Sales business, distribution ppt templates sample)
사업계획서 샘플 - 판매, 유통(Sales business, distribution ppt templates sample)Bizforms
 
Digital Marketing Trends for 2016 by YDM's Innovation Center (Korean)
Digital Marketing Trends for 2016 by YDM's Innovation Center (Korean)Digital Marketing Trends for 2016 by YDM's Innovation Center (Korean)
Digital Marketing Trends for 2016 by YDM's Innovation Center (Korean)Yello Digital Marketing
 
[메조미디어] 2015 상반기 업종분석 자료 - 화장품
[메조미디어] 2015 상반기 업종분석 자료 - 화장품[메조미디어] 2015 상반기 업종분석 자료 - 화장품
[메조미디어] 2015 상반기 업종분석 자료 - 화장품MezzoMedia
 
2003 Spring Newsletter
2003 Spring Newsletter2003 Spring Newsletter
2003 Spring NewsletterDirect Relief
 
Arh2050 1730 syllabus
Arh2050 1730 syllabusArh2050 1730 syllabus
Arh2050 1730 syllabusProfWillAdams
 
Arh2050 sarcophagus lid homework
Arh2050 sarcophagus lid homeworkArh2050 sarcophagus lid homework
Arh2050 sarcophagus lid homeworkProfWillAdams
 

Viewers also liked (20)

성북마을미디어 특강 - 콘텐츠유통 (주일)
성북마을미디어 특강 - 콘텐츠유통 (주일)성북마을미디어 특강 - 콘텐츠유통 (주일)
성북마을미디어 특강 - 콘텐츠유통 (주일)
 
2장 마케팅 발표
2장 마케팅 발표2장 마케팅 발표
2장 마케팅 발표
 
[무한도전 전라북도] 유기농브랜드 아이디어
[무한도전 전라북도] 유기농브랜드 아이디어[무한도전 전라북도] 유기농브랜드 아이디어
[무한도전 전라북도] 유기농브랜드 아이디어
 
배달통이 바라보는 로컬 비지니스의 미래
배달통이 바라보는 로컬 비지니스의 미래배달통이 바라보는 로컬 비지니스의 미래
배달통이 바라보는 로컬 비지니스의 미래
 
카드3분기 국문pt
카드3분기 국문pt카드3분기 국문pt
카드3분기 국문pt
 
Web Template
Web TemplateWeb Template
Web Template
 
스마트폰 기반의 모바일 음악 서비스 시장 전망 및 업계의 대응전략
스마트폰 기반의 모바일 음악 서비스 시장 전망 및 업계의 대응전략스마트폰 기반의 모바일 음악 서비스 시장 전망 및 업계의 대응전략
스마트폰 기반의 모바일 음악 서비스 시장 전망 및 업계의 대응전략
 
2011년도 티켓몬스터 사업전략 로드맵
2011년도 티켓몬스터 사업전략 로드맵2011년도 티켓몬스터 사업전략 로드맵
2011년도 티켓몬스터 사업전략 로드맵
 
업종리포트 화장품 크로스미디어_201409
업종리포트 화장품 크로스미디어_201409업종리포트 화장품 크로스미디어_201409
업종리포트 화장품 크로스미디어_201409
 
[표준]온라인브랜딩유통제안서
[표준]온라인브랜딩유통제안서[표준]온라인브랜딩유통제안서
[표준]온라인브랜딩유통제안서
 
iFunEngine: 30분 만에 게임 서버 만들기
iFunEngine: 30분 만에 게임 서버 만들기iFunEngine: 30분 만에 게임 서버 만들기
iFunEngine: 30분 만에 게임 서버 만들기
 
O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장
O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장
O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장
 
서비스디자인컨설팅 활용가이드북 - 한국디자인진흥원
서비스디자인컨설팅 활용가이드북 - 한국디자인진흥원서비스디자인컨설팅 활용가이드북 - 한국디자인진흥원
서비스디자인컨설팅 활용가이드북 - 한국디자인진흥원
 
사업계획서 샘플 - 판매, 유통(Sales business, distribution ppt templates sample)
사업계획서 샘플 - 판매, 유통(Sales business, distribution ppt templates sample)사업계획서 샘플 - 판매, 유통(Sales business, distribution ppt templates sample)
사업계획서 샘플 - 판매, 유통(Sales business, distribution ppt templates sample)
 
Digital Marketing Trends for 2016 by YDM's Innovation Center (Korean)
Digital Marketing Trends for 2016 by YDM's Innovation Center (Korean)Digital Marketing Trends for 2016 by YDM's Innovation Center (Korean)
Digital Marketing Trends for 2016 by YDM's Innovation Center (Korean)
 
[메조미디어] 2015 상반기 업종분석 자료 - 화장품
[메조미디어] 2015 상반기 업종분석 자료 - 화장품[메조미디어] 2015 상반기 업종분석 자료 - 화장품
[메조미디어] 2015 상반기 업종분석 자료 - 화장품
 
2003 Spring Newsletter
2003 Spring Newsletter2003 Spring Newsletter
2003 Spring Newsletter
 
Arh2050 1730 syllabus
Arh2050 1730 syllabusArh2050 1730 syllabus
Arh2050 1730 syllabus
 
Arh2050 sarcophagus lid homework
Arh2050 sarcophagus lid homeworkArh2050 sarcophagus lid homework
Arh2050 sarcophagus lid homework
 
2008 annual report
2008 annual report2008 annual report
2008 annual report
 

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

[GAMENEXT] 윈도우 8 스토어 게임, 더 큰 가능성으로의 초대
[GAMENEXT] 윈도우 8 스토어 게임, 더 큰 가능성으로의 초대[GAMENEXT] 윈도우 8 스토어 게임, 더 큰 가능성으로의 초대
[GAMENEXT] 윈도우 8 스토어 게임, 더 큰 가능성으로의 초대GAMENEXT Works
 
[GEG1] 2.the game asset pipeline
[GEG1] 2.the game asset pipeline[GEG1] 2.the game asset pipeline
[GEG1] 2.the game asset pipeline종빈 오
 
[IGC 2016] 아마존 구승모 - 게임 제작을 위한 Amazon의 편리한 도구들 (게임리프트와 럼버야드)
[IGC 2016] 아마존 구승모 - 게임 제작을 위한 Amazon의 편리한 도구들 (게임리프트와 럼버야드)[IGC 2016] 아마존 구승모 - 게임 제작을 위한 Amazon의 편리한 도구들 (게임리프트와 럼버야드)
[IGC 2016] 아마존 구승모 - 게임 제작을 위한 Amazon의 편리한 도구들 (게임리프트와 럼버야드)강 민우
 
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...JinKwon Lee
 
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다Dae Kim
 
게임 서버 기술 현황 및 전망
게임 서버 기술 현황 및 전망게임 서버 기술 현황 및 전망
게임 서버 기술 현황 및 전망Vong Sik Kong
 
게임 서버 기술 현황 및 전망
게임 서버 기술 현황 및 전망게임 서버 기술 현황 및 전망
게임 서버 기술 현황 및 전망gueste9d250
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기YEONG-CHEON YOU
 
회사소개서 브로셔V1.0
회사소개서 브로셔V1.0회사소개서 브로셔V1.0
회사소개서 브로셔V1.0원택 황
 
온라인 게임과 소셜 게임 서버는 어떻게 다른가?
온라인 게임과 소셜 게임 서버는 어떻게 다른가?온라인 게임과 소셜 게임 서버는 어떻게 다른가?
온라인 게임과 소셜 게임 서버는 어떻게 다른가?Seok-ju Yun
 
AD의 TAD와 협업.pptx
AD의 TAD와 협업.pptxAD의 TAD와 협업.pptx
AD의 TAD와 협업.pptxVisual Tech Dev
 
Gamebryo LightSpeed (Korean)
Gamebryo LightSpeed (Korean)Gamebryo LightSpeed (Korean)
Gamebryo LightSpeed (Korean)Gamebryo
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012devCAT Studio, NEXON
 
[KGC2014] 울프나이츠 엔진 프로그래밍 기록
[KGC2014] 울프나이츠 엔진 프로그래밍 기록 [KGC2014] 울프나이츠 엔진 프로그래밍 기록
[KGC2014] 울프나이츠 엔진 프로그래밍 기록 JiUng Choi
 
Gametech 2014: 모바일 게임용 PaaS/BaaS 구현 사례와 디자인 트레이드오프
Gametech 2014: 모바일 게임용 PaaS/BaaS 구현 사례와 디자인 트레이드오프Gametech 2014: 모바일 게임용 PaaS/BaaS 구현 사례와 디자인 트레이드오프
Gametech 2014: 모바일 게임용 PaaS/BaaS 구현 사례와 디자인 트레이드오프Jinuk Kim
 
[데브루키] 이벤트 드리븐 아키텍쳐
[데브루키] 이벤트 드리븐 아키텍쳐[데브루키] 이벤트 드리븐 아키텍쳐
[데브루키] 이벤트 드리븐 아키텍쳐MinGeun Park
 
Engine project
Engine projectEngine project
Engine projecttalron
 
Rinker 전시회 발표용 (1)
Rinker 전시회 발표용 (1)Rinker 전시회 발표용 (1)
Rinker 전시회 발표용 (1)Seungho Han
 

Similar to Kasa 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처 (20)

[GAMENEXT] 윈도우 8 스토어 게임, 더 큰 가능성으로의 초대
[GAMENEXT] 윈도우 8 스토어 게임, 더 큰 가능성으로의 초대[GAMENEXT] 윈도우 8 스토어 게임, 더 큰 가능성으로의 초대
[GAMENEXT] 윈도우 8 스토어 게임, 더 큰 가능성으로의 초대
 
[GEG1] 2.the game asset pipeline
[GEG1] 2.the game asset pipeline[GEG1] 2.the game asset pipeline
[GEG1] 2.the game asset pipeline
 
[IGC 2016] 아마존 구승모 - 게임 제작을 위한 Amazon의 편리한 도구들 (게임리프트와 럼버야드)
[IGC 2016] 아마존 구승모 - 게임 제작을 위한 Amazon의 편리한 도구들 (게임리프트와 럼버야드)[IGC 2016] 아마존 구승모 - 게임 제작을 위한 Amazon의 편리한 도구들 (게임리프트와 럼버야드)
[IGC 2016] 아마존 구승모 - 게임 제작을 위한 Amazon의 편리한 도구들 (게임리프트와 럼버야드)
 
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
 
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
 
게임 서버 기술 현황 및 전망
게임 서버 기술 현황 및 전망게임 서버 기술 현황 및 전망
게임 서버 기술 현황 및 전망
 
게임 서버 기술 현황 및 전망
게임 서버 기술 현황 및 전망게임 서버 기술 현황 및 전망
게임 서버 기술 현황 및 전망
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
회사소개서 브로셔V1.0
회사소개서 브로셔V1.0회사소개서 브로셔V1.0
회사소개서 브로셔V1.0
 
온라인 게임과 소셜 게임 서버는 어떻게 다른가?
온라인 게임과 소셜 게임 서버는 어떻게 다른가?온라인 게임과 소셜 게임 서버는 어떻게 다른가?
온라인 게임과 소셜 게임 서버는 어떻게 다른가?
 
AD의 TAD와 협업.pptx
AD의 TAD와 협업.pptxAD의 TAD와 협업.pptx
AD의 TAD와 협업.pptx
 
Gamebryo LightSpeed (Korean)
Gamebryo LightSpeed (Korean)Gamebryo LightSpeed (Korean)
Gamebryo LightSpeed (Korean)
 
iOS7 Sprite Kit을 이용한 게임 개발
iOS7 Sprite Kit을 이용한 게임 개발iOS7 Sprite Kit을 이용한 게임 개발
iOS7 Sprite Kit을 이용한 게임 개발
 
pkcserver
pkcserverpkcserver
pkcserver
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
 
[KGC2014] 울프나이츠 엔진 프로그래밍 기록
[KGC2014] 울프나이츠 엔진 프로그래밍 기록 [KGC2014] 울프나이츠 엔진 프로그래밍 기록
[KGC2014] 울프나이츠 엔진 프로그래밍 기록
 
Gametech 2014: 모바일 게임용 PaaS/BaaS 구현 사례와 디자인 트레이드오프
Gametech 2014: 모바일 게임용 PaaS/BaaS 구현 사례와 디자인 트레이드오프Gametech 2014: 모바일 게임용 PaaS/BaaS 구현 사례와 디자인 트레이드오프
Gametech 2014: 모바일 게임용 PaaS/BaaS 구현 사례와 디자인 트레이드오프
 
[데브루키] 이벤트 드리븐 아키텍쳐
[데브루키] 이벤트 드리븐 아키텍쳐[데브루키] 이벤트 드리븐 아키텍쳐
[데브루키] 이벤트 드리븐 아키텍쳐
 
Engine project
Engine projectEngine project
Engine project
 
Rinker 전시회 발표용 (1)
Rinker 전시회 발표용 (1)Rinker 전시회 발표용 (1)
Rinker 전시회 발표용 (1)
 

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

  • 1. 유연한 컨텐츠 개발을 위한 온라인 게임 아키텍처 Kasa Study (2012/11/01) 박성준
  • 4.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 12. 서버 프로그래머? 클라이언트 프로그래머?
  • 13. 서버 컨텐츠 클라이언트 프로그래머 프로그래머 프로그래머
  • 14. 그래픽스 프로그래머 툴 물리 엔진 프로그래머 프로그래머 네트워크 인공 지능 프로그래머 프로그래머 Input 사운드 프로그래머 프로그래머 UI 게임 플레이 프로그래머 프로그래머 스크립터
  • 15. 그래픽스 프로그래머 게임 플레이 프로그래머 UI 프로그래머 네트워크 툴 프로그래머 프로그래머 Input 프로그래머 DB 인공 지능 프로그래머 프로그래머 사운드 프로그래머 스크립터 물리 엔진 프로그래머 서버 컨텐츠 클라이언트
  • 16. 컨텐츠 개발 컨셉 • 세션 중심 개발 • 유저와 서버 사이의 1:1 이벤트 • 존 입장 / 변경 / 퇴장 • 옵션 정보 저장 • 게임 외적인 이벤트 • 게임 오브젝트 중심 개발 • 게임 오브젝트들 사이의 이벤트 • 이동 / 공격 / 피격 • 아이템 떨어뜨리기 / 줍기 • 게임 내적인 이벤트
  • 17. Core Engine Shodown Contents Tools Server Platform
  • 18. Core Engine Contents Logic Server Client Tools
  • 19. Core.Native Core.Net FileModule Core LogModule ShodownFile ShodownLog
  • 20. 전반적으로 사용되는 것들.. 인터페이스의 구현 프로젝트 인터페이스 프로젝트
  • 21. Core FileModule LogModule Shodown Shodown File Log
  • 22. Graphics UI DB Engine Network Input Sound
  • 23. 수정중인 오픈 라이브러리… 인터페이스 프로젝트 인터페이스의 구현 프로젝트 테스트 프로젝트 그 외 기타 등등(xml, lua, fx 등)
  • 24. Graphic Object Graphic IGraphic Manager Factory IGraphic IRenderer Source GraphicModule GamebryoWrapper Gamebryo Factory Graphic Renderer Source
  • 25. 컨텐츠를 개발할 때에는 컨텐츠’만’ 개발하자
  • 26. 플레이어가 몬스터를 강베기 스킬로 공격한다 플레이어 모델을 띄운다 몬스터 모델을 띄운다 강베기 애니메이션을 재생한다 피격 애니메이션을 재생한다 데미지 계산을 한다 HP를 깎는다 이펙트를 터뜨린다 사운드를 재생시킨다 UI 연출을 한다 모델을 어떻게? 애니메이션을 어떻게? 이펙트 렌더링을 어떻게? 사운드 재생을 어떻게? 이미지를 화면에 어떻게?
  • 27. Client Client System Server Logic System Server GameBase SinglePlay Contents System Test
  • 28. 클라이언트 컨텐츠 공통 컨텐츠 서버 컨텐츠 클라이언트 실행 파일 / 모듈의 조합 로직 서버 실행 파일 / 모듈의 조합 싱글 테스트 실행 파일 / 모듈의 조합
  • 29. GameBase System ServerSystem ClientSystem LogicServer SinglePlayTest Client
  • 30. Network UI Module Module Graphic Sound Module Module Database Module GameBase System Input Module ServerSystem ClientSystem
  • 31. 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
  • 32. Lua Gamebryo Database Wrapper Scaleform ADO Wrapper Database Shodown Sound DBS Connector Shodown Input LogicServer SinglePlayTest Client
  • 33. 세션 중심 개발 • 유저와 서버 사이의 1:1 이벤트 • 존 입장 / 변경 / 퇴장 • 옵션 정보 저장 • 등 게임 외적인 이벤트
  • 34. IAccept Observer ServerSession Base ServerBase ServerObject Base Network Network Manager Factory IConnect Observer ClientBase ClientSession Base ClientObject Base
  • 35. 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
  • 37. Accept Observer Server Base Client Base Network Manager
  • 38. Accept Observer Server Base Client Base Network 접속 Manager
  • 39. Accept Observer Server Base Client Base Network 접속 Manager
  • 40. Accept Observer Server Base Client Session 생성 Client Base Network 접속 Manager
  • 41. Accept Observer Server Base 연결 Client Session 생성 Client Base Network 접속 Manager
  • 42. Accept Observer 알림 Server Base 연결 Client Session 생성 Client Base Network 접속 Manager
  • 43. User Accept Observer 알림 Server Base 연결 Client Session 생성 Client Base Network 접속 Manager
  • 44. User Accept Observer 알림 Server Session Server Base 연결 Client Session 생성 Client Base Network 접속 Manager
  • 45. User Accept Observer 알림 Server Session Server Base 연결 연결 Client Session 생성 Client Base Network 접속 Manager
  • 46. User User Accept Observer 알림 Server Server Session Session Server Base 연결 연결 Client Client Session Session 생성 Client Client Base Base Network Network 접속 Manager Manager
  • 47.
  • 49.
  • 51. A B C 시간 흐름
  • 52. 문제는… • 게임 로직은 C++로 만든다! • C++에서 코루틴을 쓰고 싶다! • C++은 코루틴을 지원하지 않는다?!
  • 53.
  • 55.
  • 56.
  • 57. 문제는… • 윈도우 비스타/2008 이상에서만 동작한다! • 서버는 윈도우 2008 이상을 사용하면 된다… • 하지만 클라이언트에서는 못쓴다!! • 이유는 몇몇 Fiber 관련 API 때문…
  • 58. Boost 공식 라이브러리 포함 STL TR 시리즈에 context와 coroutine이 포함되길 기대합니다..
  • 60. Call Yield Resume Yield Resume Yield Resume End
  • 61. 유저시퀀스 • 유저 별로 발생하는 게임 외적인 이벤트 로직의 객체화 • 시퀀스 하나 = 이벤트의 처음부터 끝까지 • 내부적으로 boost::coroutine을 사용하여 구현
  • 62. 외부 인터페이스 User에 접근 가능 코루틴 인터페이스 실제 실행 함수 코루틴 함수
  • 63. User
  • 64. 유저시퀀스는 추가복사 없이 데이터를 로직 코드로 바로 가져올 수 있다 유저 시퀀스의 스택 메모리에 할당됨 버퍼에서 데이터 Pop 하여 받으려는 변수로 바로 가져옴 Network - OnRecv()에서 실행 User – Update()에서 실행 Thread가 달라도 문제 없음
  • 65. 메시지ID + 데이터 타입 메시지에서 사용할 데이터 형식 메시지 타입 선언한 순서로 메시지ID 할당 버퍼에 데이터 넣기 버퍼에서 데이터 꺼내기
  • 66. 죄송합니다.. 시간에 쫓겨 급해서 Boost 전처리기 메타를 썼습니다..
  • 67. 유저시퀀스의 로직은 모두 User 객체의 Update에서 실행되는 것을 보장한다 시퀀스 생성 메시지 도착 Resume 코루틴 생성 후 Wait() 만나면 Resume 데이터 Pop Resume Yield Yield Yield 코 루틴 User - Update User - Update 메인 루틴 : Network Thread : Main Thread
  • 69. User NetworkModule DatabaseModule Database Server Object Session User 객체가 요청한 프로시저 결과는 User 객체가 전송한 메시지는 User 객체가 받는다 해당 User가 받는다
  • 71. 게임 오브젝트 중심 개발 • 게임 오브젝트들 사이의 이벤트 • 이동 / 공격 / 피격 • 아이템 떨어뜨리기 / 줍기 • 등 게임 내적인 이벤트
  • 72. 게임 오브젝트! 캐릭터 • 플레이어, 몬스터 등 캐릭터 레벨 지형 • 바위, 나무, 건물 등 배경 오브젝트 • 함정, 회복아이템 등 트리거 오브젝 발사체 프랍 • 미사일, 수류탄, 파편 등 트 • 카메라, 광원 등 • 캐릭터가 서있는 지형 카메라 트리거 광원
  • 73. 캐릭터 레벨 지형 오브젝트 상호작용 오브젝 발사체 프랍 트 오브젝트 카메라 트리거 오브젝트 광원 게임 = 게임 오브젝트 사이의 상호작용
  • 74. 컴포넌트 + 게임 오브젝트
  • 75. 컴포넌트 설계는 좋지만.. • 의존적인 컴포넌트 구분! • 메시지 통신X 메시지 객체 통신! • 그렇지만 의존성은 피하자! • 스크립트 친화적 구현!
  • 77.
  • 78. Controller • 의존적인 컴포넌트는 컨트롤러의 속성을 가진다 • 다른 컴포넌트에 접근하는걸 고려하여 디자인 • 컴포넌트와는 다르게 활성화/비활성화 존재
  • 79.
  • 80. Owner Entity가 가진 다른 컴포넌트와 컨트롤러에 접근 가능! AAA Entity Component BBB BBB Controller Component AAA Controller
  • 82. 분산되는 로직 처리 = 응집력이 떨어진다 순서대로 로직 처리가 힘듦 = 작업 스트레스 증가
  • 83. 1. 액션 단위로 로직 처리 2. 액션객체가 컴포넌트들에 접근 3. 게임 오브젝트는 액션들을 관리
  • 84.
  • 85. 죄송합니다.. 시간에 쫓겨 급해서 Boost 전처리기 메타를 썼습니다..
  • 87. 액션의 구현 Action의 데이터 위에서 정의한 Action데이터로 virtual void Do( 데이터 ) = 0; 순수 가상 함수가 만들어진다 GetOwner()를 이용하여 Action이 실행된 Entity를 얻어올 수 있다
  • 88. Owner Entity가 가진 다른 컴포넌트와 컨트롤러에 접근 가능! 생성 AAA DoAction Entity Action 호출 AAA BBB AAA Component Component Controller 접근
  • 89. 다른 객체에 접근을 위해.. Entity Handler DoAction 함수를 가진다 Entity 다른 Entity / 또는 외부에서 접근 Controller와 Action의 Owner로 노출
  • 90. 업데이트 순서 Entity:: Entity:: Component Update Update System:: Controller Action Update
  • 91. 게임 오브젝트와 네트워크 통신 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
  • 92. NPC1 Player1 NPC2 Server Server Server Object Object Object Server Base
  • 93. NPC1 Player1 NPC2 Server Server Server Object Object Object Server Base
  • 94. NPC1 Player1 NPC2 ID : 0 ID : 1 ID : 2 Server Server Server Object Object Object Server Base
  • 95. NPC1 Player1 NPC2 ID : 0 ID : 1 ID : 2 Server Server Server Object Object Object Server Base Client Base
  • 96. NPC1 Player1 NPC2 ID : 0 ID : 1 ID : 2 Server Server Server Object Object Object Server Base Client Base Client Client Client Object Object Object ID : 0 ID : 1 ID : 2 NPC1 Player1 NPC2
  • 97. NPC1 Player1 NPC2 ID : 0 ID : 1 ID : 2 Server Server Server Object Object Object Server Base Client Base Client Client Client Object Object Object ID : 0 ID : 1 ID : 2 NPC1 Player1 NPC2
  • 98. NPC1 Player1 NPC2 ID : 0 ID : 1 ID : 2 Server Server Server Object Object Object Server Base Client Base Client Client Client Object Object Object ID : 0 ID : 1 ID : 2 NPC1 Player1 NPC2
  • 99. NPC1 Player1 NPC2 ID : 0 ID : 1 ID : 2 Server Server Server Object Object Object Server Base Client Client Base Base Client Client Client Client Client Client Object Object Object Object Object Object ID : 0 ID : 1 ID : 2 ID : 0 ID : 1 ID : 2 NPC1 Player1 NPC2 NPC1 Player1 NPC2
  • 100. NPC1 Player1 NPC2 ID : 0 ID : 1 ID : 2 Server Server Server Object Object Object Server Base Client Client Base Base Client Client Client Client Client Client Object Object Object Object Object Object ID : 0 ID : 1 ID : 2 ID : 0 ID : 1 ID : 2 NPC1 Player1 NPC2 NPC1 Player1 NPC2
  • 102. Action과 Message를 연결 Message가 ServerObject/ClientObject에 도착하면 연결된 Action 실행 Network Action Manager 생성 Server/ 함수 Client Action Object Network - OnRecv
  • 103. 메시지ID + 데이터 타입 메시지에서 사용할 데이터 형식 메시지 타입 선언한 순서로 메시지ID 할당 버퍼에 데이터 넣기 버퍼에서 데이터 꺼내기
  • 104. 액션 실행을 위한 네트워크로 받은 메시지를 받은 엔터티 함수포인터 메시지 버퍼 ServerObject와 연결 ClientObject와 연결
  • 105.
  • 106.
  • 107. 액션과 네트워크 통신의 연결 메시지와 Action의 연결 선언 메시지와 Action의 데이터가 같아야만 컴파일이 된다 메시지와 Action의 연결 정의
  • 109. lua_state 컨트롤러 컨트롤러 컨트롤러 컨트롤러 컨트롤러 컨트롤러 Component Controller 테이블 테이블 테이블 테이블 테이블 테이블 Table Table 컨트롤러 컨트롤러 컨트롤러 Instance 테이블 테이블 Lua 테이블 Table Thread
  • 111. Entity Script Controller 정보 Controller Manager lua_state에 입력 Entity별로 lua table과 lua thread 생성 Controller Instance lua table 생성하여 Controller userdata와 연결
  • 112. C++ AAA Controller Class AAA AAA AAA AAA Controller Controller Controller Controller Instance Instance1 Instance2 Instance3 Instance4 Lua AAA Controller table AAA AAA AAA AAA Controller Controller Controller Controller userdata Instance1 Instance1 Instance1 Instance1 meta table AAA AAA AAA AAA Controller Controller Controller Controller table Instance1 Instance2 Instance3 Instance4
  • 113. 부모 클래스와 자식 클래스 모두 연결할 경우?
  • 114. C++ AAA Controller AAA Controller 상속 Instance BBB Controller BBB Controller Instance Lua AAA Controller AAA meta table Controller Instance BBB Controller meta table BBB Controller AAA Instance Controller Instance BBB Controller Instance
  • 115. 스크립트와 연결 스크립트 함수 실행 C++ 함수 실행
  • 117. Entity Component Script Component 정보 Manager lua_state에 입력
  • 118. C++ AAA Component Class AAA AAA AAA AAA Component Component Component Component Instance Instance1 Instance2 Instance3 Instance4 Lua AAA table Component AAA AAA AAA AAA Component Component Component Component userdata Instance1 Instance2 Instance3 Instance4
  • 120. Entity Script Controller 정보 Controller Manager lua_state에 입력 Entity별로 lua table과 lua thread 생성 Controller의 owner로 Controller Instance EntityWrapper 생성 후 lua table 생성하여 Controller Instance Controller userdata와 연결 lua table에 “owner” Set
  • 121.
  • 122. 컴포넌트 설계의 장점 멀티쓰레딩!
  • 123. 어떻게?! Game Animation Physics Rendering Audio Loop
  • 124. Set up Thread1 Game Thread2 Thread0 Thread3 Loop Process Result
  • 125. 현재 구조를 보면… • Controller는 Owner가 가지고 있는 것만 접근 -> Owner의 Component / Controller • 다른 Entity에는 DoAction으로 할 일 전달 • Entity별로 Controller들 업데이트 Entity별로 Action Queue 처리 Component별로 업데이트
  • 126. 다시 정리해보면 • Entity는 다른 Entity에 직접 접근 X • Component는 다른 Component에 직접 접근 X • Entity별로 Controller들 업데이트 Entity별로 Action Queue 처리 Component별로 업데이트
  • 127. 업데이트 순서 Entity:: Entity:: Component Update Update System:: Controller Action Update
  • 128. Set up Thread1 Thread2 Thread0 Thread3 Controller Set up Thread0 Thread2 Game Thread1 Thread3 Action Loop Set up Thread1 Thread0 Thread2 Thread3 Component Process Result
  • 129. 유연한 컨텐츠 개발을 위해서 무조건 데이터 드리븐 X 컨텐츠와 컨텐츠가 아닌 것 분리 기능별로 모듈화 최대한 응집성이 떨어지지 않게 수치 데이터 + 로직 모듈 + 모듈 조합 스크립트 = 데이터드리븐