SlideShare a Scribd company logo
Korea Games Conference       박성준
       KGC 2012          (notorz@hotmail.com)
온라인 게임을 위한 게임 오브젝트 설계
      액션으로 통하다




         Korea Games Conference       박성준
                KGC 2012          (notorz@hotmail.com)
게임 + 오브젝트
오브젝트?
게임?
게임 오브젝트!
                                    캐릭터
• 플레이어, 몬스터 등 캐릭터
                               레벨         지형
• 바위, 나무, 건물 등 배경 오브젝트
• 함정, 회복아이템 등 트리거
                                    오브젝
                         발사체                    프랍
• 미사일, 수류탄, 파편 등                     트

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

                                    광원
캐릭터

      레벨         지형            오브젝트

                                             상호작용

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

  카메라            트리거                  오브젝트

           광원




 게임 = 게임 오브젝트 사이의 상호작용
온라인 게임
게임 오브젝트 중심 개발

 • 게임 오브젝트들 사이의 이벤트
 • 이동 / 공격 / 피격
 • 아이템 떨어뜨리기 / 줍기
 • 등 게임 내적인 이벤트
컴포넌트 + 게임 오브젝트
컴포넌트 기반 설계 구조
온라인 게임은
컴포넌트 기반 설계를 해야 한다!
알과 닭 객체를 계층 구조로 만든다고 가정해봅시다..
슈퍼닭을 만듭시다! 슈퍼닭은 날아다닙니다!
그렇다면 컴포넌트 기반 설계 방식이라면?!
온라인 게임 + 컴포넌트 설계
    = 행복한 개발
컴포넌트 설계는 좋지만..


• 의존적인 컴포넌트 구분!
• 메시지 통신을 하지 말자!
• 그렇지만 의존성은 피하자!
• 스크립트 친화적 구현!
의존적인 컴포넌트?
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
KGC 2011 에서…
강연이 끝난 후..
천재 꽃 미남                         당신껀 멀티 쓰레
슈퍼 프로그래머                        딩이 안되자나?!
트위터 :
@BlindRendererKR
프로필 :
지금은 멀티쓰레딩도 가능합니다
어떻게?!



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
감사합니다




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

More Related Content

What's hot

[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬KyeongWon Koo
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
Seungmo Koo
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
Seungmo Koo
 
AAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxAAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptx
TonyCms
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
devCAT Studio, NEXON
 
리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
QooJuice
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
devCAT Studio, NEXON
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
DongMin Choi
 
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
강 민우
 
C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현
Bongseok Cho
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013devCAT Studio, NEXON
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012devCAT Studio, NEXON
 
게임 인공지능 설계
게임 인공지능 설계게임 인공지능 설계
게임 인공지능 설계
ByungChun2
 
[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능
Yongha Kim
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010devCAT Studio, NEXON
 
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
NHN FORWARD
 
Forts and Fights Scaling Performance on Unreal Engine*
Forts and Fights Scaling Performance on Unreal Engine*Forts and Fights Scaling Performance on Unreal Engine*
Forts and Fights Scaling Performance on Unreal Engine*
Intel® Software
 
IndirectDraw with unity
IndirectDraw with unityIndirectDraw with unity
IndirectDraw with unity
Jung Suk Ko
 
GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자
TonyCms
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)
Bongseok Cho
 

What's hot (20)

[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
게임서버프로그래밍 #7 - 패킷핸들링 및 암호화
 
AAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxAAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptx
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
 
리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
 
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
 
C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
 
게임 인공지능 설계
게임 인공지능 설계게임 인공지능 설계
게임 인공지능 설계
 
[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
 
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
 
Forts and Fights Scaling Performance on Unreal Engine*
Forts and Fights Scaling Performance on Unreal Engine*Forts and Fights Scaling Performance on Unreal Engine*
Forts and Fights Scaling Performance on Unreal Engine*
 
IndirectDraw with unity
IndirectDraw with unityIndirectDraw with unity
IndirectDraw with unity
 
GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)
 

Viewers also liked

사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013Esun Kim
 
C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴
명신 김
 
[Pycon 2015] 오늘 당장 딥러닝 실험하기 제출용
[Pycon 2015] 오늘 당장 딥러닝 실험하기 제출용[Pycon 2015] 오늘 당장 딥러닝 실험하기 제출용
[Pycon 2015] 오늘 당장 딥러닝 실험하기 제출용
현호 김
 
2015 py con word2vec이 추천시스템을 만났을때
2015 py con word2vec이 추천시스템을 만났을때 2015 py con word2vec이 추천시스템을 만났을때
2015 py con word2vec이 추천시스템을 만났을때
choi kyumin
 
Q Learning과 CNN을 이용한 Object Localization
Q Learning과 CNN을 이용한 Object LocalizationQ Learning과 CNN을 이용한 Object Localization
Q Learning과 CNN을 이용한 Object Localization
홍배 김
 
Differentiable Neural Computer
Differentiable Neural ComputerDifferentiable Neural Computer
Differentiable Neural Computer
Taehoon Kim
 
1, 빅데이터 시대의 인공지능 문동선 v2
1, 빅데이터 시대의 인공지능 문동선 v21, 빅데이터 시대의 인공지능 문동선 v2
1, 빅데이터 시대의 인공지능 문동선 v2
Dongsun Moon
 

Viewers also liked (7)

사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
 
C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴
 
[Pycon 2015] 오늘 당장 딥러닝 실험하기 제출용
[Pycon 2015] 오늘 당장 딥러닝 실험하기 제출용[Pycon 2015] 오늘 당장 딥러닝 실험하기 제출용
[Pycon 2015] 오늘 당장 딥러닝 실험하기 제출용
 
2015 py con word2vec이 추천시스템을 만났을때
2015 py con word2vec이 추천시스템을 만났을때 2015 py con word2vec이 추천시스템을 만났을때
2015 py con word2vec이 추천시스템을 만났을때
 
Q Learning과 CNN을 이용한 Object Localization
Q Learning과 CNN을 이용한 Object LocalizationQ Learning과 CNN을 이용한 Object Localization
Q Learning과 CNN을 이용한 Object Localization
 
Differentiable Neural Computer
Differentiable Neural ComputerDifferentiable Neural Computer
Differentiable Neural Computer
 
1, 빅데이터 시대의 인공지능 문동선 v2
1, 빅데이터 시대의 인공지능 문동선 v21, 빅데이터 시대의 인공지능 문동선 v2
1, 빅데이터 시대의 인공지능 문동선 v2
 

Kgc2012 온라인 게임을 위한 게임 오브젝트 설계

  • 1. Korea Games Conference 박성준 KGC 2012 (notorz@hotmail.com)
  • 2. 온라인 게임을 위한 게임 오브젝트 설계 액션으로 통하다 Korea Games Conference 박성준 KGC 2012 (notorz@hotmail.com)
  • 6. 게임 오브젝트! 캐릭터 • 플레이어, 몬스터 등 캐릭터 레벨 지형 • 바위, 나무, 건물 등 배경 오브젝트 • 함정, 회복아이템 등 트리거 오브젝 발사체 프랍 • 미사일, 수류탄, 파편 등 트 • 카메라, 광원 등 • 캐릭터가 서있는 지형 카메라 트리거 광원
  • 7. 캐릭터 레벨 지형 오브젝트 상호작용 오브젝 발사체 프랍 트 오브젝트 카메라 트리거 오브젝트 광원 게임 = 게임 오브젝트 사이의 상호작용
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14. 게임 오브젝트 중심 개발 • 게임 오브젝트들 사이의 이벤트 • 이동 / 공격 / 피격 • 아이템 떨어뜨리기 / 줍기 • 등 게임 내적인 이벤트
  • 15. 컴포넌트 + 게임 오브젝트
  • 17. 온라인 게임은 컴포넌트 기반 설계를 해야 한다!
  • 18. 알과 닭 객체를 계층 구조로 만든다고 가정해봅시다..
  • 19.
  • 20.
  • 21.
  • 23.
  • 24.
  • 25. 그렇다면 컴포넌트 기반 설계 방식이라면?!
  • 26.
  • 27.
  • 28.
  • 29.
  • 30. 온라인 게임 + 컴포넌트 설계 = 행복한 개발
  • 31. 컴포넌트 설계는 좋지만.. • 의존적인 컴포넌트 구분! • 메시지 통신을 하지 말자! • 그렇지만 의존성은 피하자! • 스크립트 친화적 구현!
  • 33.
  • 34. Controller • 의존적인 컴포넌트는 컨트롤러의 속성을 가진다 • 다른 컴포넌트에 접근하는걸 고려하여 디자인 • 컴포넌트와는 다르게 활성화/비활성화 존재
  • 35.
  • 36. Owner Entity가 가진 다른 컴포넌트와 컨트롤러에 접근 가능! AAA Entity Component BBB BBB Controller Component AAA Controller
  • 38. 분산되는 로직 처리 = 응집력이 떨어진다 순서대로 로직 처리가 힘듦 = 작업 스트레스 증가
  • 39. 1. 액션 단위로 로직 처리 2. 액션객체가 컴포넌트들에 접근 3. 게임 오브젝트는 액션들을 관리
  • 41.
  • 42. 죄송합니다.. 시간에 쫓겨 급해서 Boost 전처리기 메타를 썼습니다..
  • 44. 액션의 구현 Action의 데이터 위에서 정의한 Action데이터로 virtual void Do( 데이터 ) = 0; 순수 가상 함수가 만들어진다 GetOwner()를 이용하여 Action이 실행된 Entity를 얻어올 수 있다
  • 45. Owner Entity가 가진 다른 컴포넌트와 컨트롤러에 접근 가능! 생성 AAA DoAction Entity Action 호출 AAA BBB AAA Component Component Controller 접근
  • 46. 다른 객체에 접근을 위해.. Entity Handler DoAction 함수를 가진다 Entity 다른 Entity / 또는 외부에서 접근 Controller와 Action의 Owner로 노출
  • 47. 업데이트 순서 Entity:: Entity:: Component Update Update System:: Controller Action Update
  • 48. 게임 오브젝트와 네트워크 통신 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
  • 49. NPC1 Player1 NPC2 Server Server Server Object Object Object Server Base
  • 50. NPC1 Player1 NPC2 Server Server Server Object Object Object Server Base
  • 51. NPC1 Player1 NPC2 ID : 0 ID : 1 ID : 2 Server Server Server Object Object Object Server Base
  • 52. NPC1 Player1 NPC2 ID : 0 ID : 1 ID : 2 Server Server Server Object Object Object Server Base Client Base
  • 53. 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
  • 54. 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
  • 55. 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
  • 56. 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
  • 57. 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
  • 59. Action과 Message를 연결 Message가 ServerObject/ClientObject에 도착하면 연결된 Action 실행 Network Action Manager 생성 Server/ 함수 Client Action Object Network - OnRecv
  • 60. 메시지ID + 데이터 타입 메시지에서 사용할 데이터 형식 메시지 타입 선언한 순서로 메시지ID 할당 버퍼에 데이터 넣기 버퍼에서 데이터 꺼내기
  • 61. 액션 실행을 위한 네트워크로 받은 메시지를 받은 엔터티 함수포인터 메시지 버퍼 ServerObject와 연결 ClientObject와 연결
  • 62.
  • 63.
  • 64. 액션과 네트워크 통신의 연결 메시지와 Action의 연결 선언 메시지와 Action의 데이터가 같아야만 컴파일이 된다 메시지와 Action의 연결 정의
  • 66. lua_state 컨트롤러 컨트롤러 컨트롤러 컨트롤러 컨트롤러 컨트롤러 Component Controller 테이블 테이블 테이블 테이블 테이블 테이블 Table Table 컨트롤러 컨트롤러 컨트롤러 Instance 테이블 테이블 Lua 테이블 Table Thread
  • 68. Entity Script Controller 정보 Controller Manager lua_state에 입력 Entity별로 lua table과 lua thread 생성 Controller Instance lua table 생성하여 Controller userdata와 연결
  • 69. 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
  • 70. 부모 클래스와 자식 클래스 모두 연결할 경우?
  • 71. 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
  • 72. 스크립트와 연결 스크립트 함수 실행 C++ 함수 실행
  • 74. Entity Component Script Component 정보 Manager lua_state에 입력
  • 75. 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
  • 77. 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
  • 78.
  • 80.
  • 81. 강연이 끝난 후.. 천재 꽃 미남 당신껀 멀티 쓰레 슈퍼 프로그래머 딩이 안되자나?! 트위터 : @BlindRendererKR 프로필 :
  • 83. 어떻게?! Game Animation Physics Rendering Audio Loop
  • 84. Set up Thread1 Game Thread2 Thread0 Thread3 Loop Process Result
  • 85. 현재 구조를 보면… • Controller는 Owner가 가지고 있는 것만 접근 -> Owner의 Component / Controller • 다른 Entity에는 DoAction으로 할 일 전달 • Entity별로 Controller들 업데이트 Entity별로 Action Queue 처리 Component별로 업데이트
  • 86. 다시 정리해보면 • Entity는 다른 Entity에 직접 접근 X • Component는 다른 Component에 직접 접근 X • Entity별로 Controller들 업데이트 Entity별로 Action Queue 처리 Component별로 업데이트
  • 87. 업데이트 순서 Entity:: Entity:: Component Update Update System:: Controller Action Update
  • 88. 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
  • 89. 감사합니다 Special Thanks to : Dragonfly SS팀 일동/ 게임개발포에버 필진 일동 / 민철님 / 퐆삼촌 / 조진현님 / 김정우님 / 오즈형 / 레아형 / 민근형 / 티스형 / Hybrid님 / 창희님 / 대마왕님 / banhae님 / 정균님 / 스티브 / 바레로 박사님 / 박성준 김토마님 / Cagetu님 / 달땡땡님 / 퐁퐁퐁님 / 진짜님 / mail : notorz@hotmail.com 박PD님 / 비토님 / 어제 같이 술 마신 분들 / 트친분들 twitter : @kgun86