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

1,474 views

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,474
On SlideShare
0
From Embeds
0
Number of Embeds
87
Actions
Shares
0
Downloads
31
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

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

×