SlideShare a Scribd company logo
1 of 89
Download to read offline
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

[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리MinGeun Park
 
NDC2011 - 카메라 시스템을 통해 살펴보는 인터랙티브 시스템 개발의 문제점
NDC2011 - 카메라 시스템을 통해 살펴보는 인터랙티브 시스템 개발의 문제점NDC2011 - 카메라 시스템을 통해 살펴보는 인터랙티브 시스템 개발의 문제점
NDC2011 - 카메라 시스템을 통해 살펴보는 인터랙티브 시스템 개발의 문제점Jubok Kim
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬KyeongWon Koo
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현YEONG-CHEON YOU
 
위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점Ryan Park
 
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기Yongha Kim
 
NDC 2013 이은석 - 게임 디렉터가 뭐하는 건가요
NDC 2013 이은석 - 게임 디렉터가 뭐하는 건가요NDC 2013 이은석 - 게임 디렉터가 뭐하는 건가요
NDC 2013 이은석 - 게임 디렉터가 뭐하는 건가요Eunseok Yi
 
NHN NEXT 게임 전공 소개
NHN NEXT 게임 전공 소개NHN NEXT 게임 전공 소개
NHN NEXT 게임 전공 소개Seungmo Koo
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴예림 임
 
Halo2 におけるHFSM(階層型有限状態マシン) 【ビヘイビアツリー解説】
Halo2 におけるHFSM(階層型有限状態マシン)  【ビヘイビアツリー解説】Halo2 におけるHFSM(階層型有限状態マシン)  【ビヘイビアツリー解説】
Halo2 におけるHFSM(階層型有限状態マシン) 【ビヘイビアツリー解説】Youichiro Miyake
 
Unity Internals: Memory and Performance
Unity Internals: Memory and PerformanceUnity Internals: Memory and Performance
Unity Internals: Memory and PerformanceDevGAMM Conference
 
고대특강 게임 프로그래머의 소양
고대특강   게임 프로그래머의 소양고대특강   게임 프로그래머의 소양
고대특강 게임 프로그래머의 소양Jubok Kim
 
【Unity道場】新しいPrefabワークフロー入門
【Unity道場】新しいPrefabワークフロー入門【Unity道場】新しいPrefabワークフロー入門
【Unity道場】新しいPrefabワークフロー入門Unity Technologies Japan K.K.
 
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리MinGeun Park
 
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
Ndc2010   김주복, v3. 마비노기2아키텍처리뷰Ndc2010   김주복, v3. 마비노기2아키텍처리뷰
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰Jubok Kim
 
객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)Seung-June Lee
 
언리얼을 활용한 오브젝트 풀링
언리얼을 활용한 오브젝트 풀링언리얼을 활용한 오브젝트 풀링
언리얼을 활용한 오브젝트 풀링TonyCms
 
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard LibraryDongMin Choi
 
Ndc12 이창희 render_pipeline
Ndc12 이창희 render_pipelineNdc12 이창희 render_pipeline
Ndc12 이창희 render_pipelinechangehee lee
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅DongMin Choi
 

What's hot (20)

[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
 
NDC2011 - 카메라 시스템을 통해 살펴보는 인터랙티브 시스템 개발의 문제점
NDC2011 - 카메라 시스템을 통해 살펴보는 인터랙티브 시스템 개발의 문제점NDC2011 - 카메라 시스템을 통해 살펴보는 인터랙티브 시스템 개발의 문제점
NDC2011 - 카메라 시스템을 통해 살펴보는 인터랙티브 시스템 개발의 문제점
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점
 
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
 
NDC 2013 이은석 - 게임 디렉터가 뭐하는 건가요
NDC 2013 이은석 - 게임 디렉터가 뭐하는 건가요NDC 2013 이은석 - 게임 디렉터가 뭐하는 건가요
NDC 2013 이은석 - 게임 디렉터가 뭐하는 건가요
 
NHN NEXT 게임 전공 소개
NHN NEXT 게임 전공 소개NHN NEXT 게임 전공 소개
NHN NEXT 게임 전공 소개
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴
 
Halo2 におけるHFSM(階層型有限状態マシン) 【ビヘイビアツリー解説】
Halo2 におけるHFSM(階層型有限状態マシン)  【ビヘイビアツリー解説】Halo2 におけるHFSM(階層型有限状態マシン)  【ビヘイビアツリー解説】
Halo2 におけるHFSM(階層型有限状態マシン) 【ビヘイビアツリー解説】
 
Unity Internals: Memory and Performance
Unity Internals: Memory and PerformanceUnity Internals: Memory and Performance
Unity Internals: Memory and Performance
 
고대특강 게임 프로그래머의 소양
고대특강   게임 프로그래머의 소양고대특강   게임 프로그래머의 소양
고대특강 게임 프로그래머의 소양
 
【Unity道場】新しいPrefabワークフロー入門
【Unity道場】新しいPrefabワークフロー入門【Unity道場】新しいPrefabワークフロー入門
【Unity道場】新しいPrefabワークフロー入門
 
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
 
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
Ndc2010   김주복, v3. 마비노기2아키텍처리뷰Ndc2010   김주복, v3. 마비노기2아키텍처리뷰
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
 
객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)
 
언리얼을 활용한 오브젝트 풀링
언리얼을 활용한 오브젝트 풀링언리얼을 활용한 오브젝트 풀링
언리얼을 활용한 오브젝트 풀링
 
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
 
Ndc12 이창희 render_pipeline
Ndc12 이창희 render_pipelineNdc12 이창희 render_pipeline
Ndc12 이창희 render_pipeline
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
 

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 ComputerTaehoon Kim
 
1, 빅데이터 시대의 인공지능 문동선 v2
1, 빅데이터 시대의 인공지능 문동선 v21, 빅데이터 시대의 인공지능 문동선 v2
1, 빅데이터 시대의 인공지능 문동선 v2Dongsun 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