Component Based Programming+레고(LEGO)+Message+OOP+상속

다들 Component Based Game Programming 한 번씩은 해보셨잖아요? 아니, 표정들이 왜그래요? Component Based Game Programming 안 해본 사람처럼? ㅎㅎ;;

프로젝트를 진행하면서 약 3개월간 Component Based Programming를 해보면서 느낀 것들을 간략?하게 정리를 해봅니다.
동심의 세계로 이끌어줄 레고(LEGO)
본격적으로 들어가기에 앞서 레고에 대해서 살짝쿵 살펴볼까 합니다. 덴마크어로 재미있게 놀아라(LEG GODT)라는 말의 첫 음절을 합쳐놓은 말이 레고(LEGO)라고 하네요.

아이들의 창의성이나 사고력을 길러주기 위한 교육적인 요소로 레고 블럭을 선물해주고 하죠. 블록을 하나하나 쌓아가면서 만들었을 때의 유쾌, 상쾌감 같은 성취감과 부수었을 때의 허무함, 통쾌감을 느끼게 해주는 우리의 장난감 레고~
여러가지 우여곡절끝에 탄생한 레고는 시스템을 위한 기본 규칙 10가지가 있다고 합니다. 이것은 한 백화점 관계자가 '시중에 나와있는 아이들 장난감에는 어떤 고차원의 규칙 같은 것이 빠져 있어요.' 라고 말을 해서 이를 들은 레고 사장이 고민 끝에 고안해서 생겨났다고 하네요.
  1. 놀이의 가능성이 무한할 것
  2. 여자아이와 남자아이 모두를 위한 것
  3. 모든 연령의 아이들에게 맞는 것
  4. 일년 내내 가지고 놀 수 있는 것
  5. 아이의 건강과 편안함을 고려할 것
  6. 적당한 놀이 시간을 지킬 수 있을 것
  7. 발전, 환상, 창의력을 증대시킬 것
  8. 더 많은 놀이의 가치를 증폭시킬 것
  9. 쉽게 보충할 수 있을 것
  10. 품질이 완전할 것


같은 부품을 가지고 이렇게 3단변신이 가능하네요!!




레고로 만들어진 아이폰과 아이패드.

지금까지 레고에 대해서 알아봤는데요, 왜 레고에 대해서 다루었을까요? 다름아닌 Component 방식으로 개발하는 것이 바로 레고에 비유할 수 있어서 일단 먼저 소개해 드렸습니다 ^^;

새로운 페러다임? Component Based Programming

보통은 Game Object를 주축으로 OOP의 기법중 하나인 상속과 필요한 기능들을 붙여나가면서 개발하는 것이 일반적인 패러다임이었다면, 위에 소개한 레고블럭을 조립하듯이 재사용 가능한 모듈 기반으로 조립하듯이 프로그래밍을 하는 것을 Component Based Programming라고 합니다.


여기서 잠깐 OOP 상속은?

OOP 상속만으로도 Component Based Programming를 할 수는 있습니다. 각각의 기능을 나눈 객체를 다중으로 상속받은 하위 객체를 만드는 것이지요.
실세계의 다중 상속 예. 출처 : winapi

죽음의 다이아몬드( The Deadly Diamond of Death )
문제는 상속의 과대 사용인데요 바로 다중상속( Multiple Inheritance )와 죽음의 다이아몬드(The Deadly Diamond of Death) 상속이죠. 예로 든 이미지들에 나온 객체들이 몇개 안되서 복잡도가 높지 않아보이지만, 실제로 개발할때는 어떨까요? 생각만 해도 ㅎㄷㄷ;;
하지만 잘못 된 다중상속이 문제이지 OOP의 상속은 실세계를 모델링하는데 좋다는 것은 의심의 여지가 없습니다. 뭐, 자바나 C#에서는 아예 다중상속을 못하게 막아놨다는데, 개인적으로도 다중상속을 하지 말자 주의입니다.
본 포스팅에서는 다중상속에 대한 것이 아니기에 잘못 된 다중상속과 죽음의 다이아몬드 상속 사용에 대한 폐해 등은 검색들 해보시기 바랍니다.


그래서 대안으로 선택한 것이?
바로 Component Based Programming입니다. Game Entity들의 기능들을 마치 레고 블럭들이 여러가지로 있듯이 작은 기능 단위(Component)로 나누고 그것들을 적절히 조합해 Entity를 설계해서 작업을 진행합니다.  그래서 필요한 기능들만을 가지고 있으면 상속 구조로만 개발한 것보다 수정도 용이하고 재사용성도 높아진다는 것입니다.
MMO같이 CBT, OBT, 상용화 이후에도 계속 서비스가 되는 게임들이 만약 OOP로 만들어진다면? 아직도 많은 게임들이 OOP의 상속을 통해 개발을 하고 유지보수 하고 있을 듯 한데요, 기획적인 측면의 수정이든 개발 이슈든 간에 분명 수정, 추가 등이 생길 것입니다. 그럼 기존에 만든 수많은 Game 객체들을 거기가 상속에 상속으로 이루어진 것들을 수정, 추가 보완 해야 한다는 소린데요. 장기적인 마라톤 게임에서 성공하려면 이런 유지보수가 이슈들이 발목을 잡는 기존의 개발 페러다임을 버리고 새로운 안목으로 접근을 할 필요가 있어보입니다.

물론 위에 나열한 이슈들이 단순 Component Based Programming로 설계했다고 해결되는 것은 아닙니다. Data-Driven, Script 활용 등 여러가지 복합적으로 잘 설계해서 구현을 해야겠죠.

따라서, 일반적인 상속을 통한 객체지향적 게임 개발은 규모가 작은 게임, Component 기반 게임개발은 MMO 같은 큰 규모의 게임에 어울릴 듯 합니다. MMO는 나중에 계속 유지보수를 해야하기 때문에 초반 진입이 어려운( 한번도 안 해봤다면? ) Component가 나중에 힘을 발휘할 듯해 보이기 때문입니다. 이에따라 캐쥬얼 게임이나 소셜게임등 그 규모가 작다고 볼 수 있는 것은 기존 방식대로 개발에 임해도 좋을 듯 싶네요.

이미 해외에서는 GDC02년에 Dungeon Siege게임을 통해 처음 발표가 있은 후 엔진이나 게임 개발 프로세스에 많이 적용하는 듯하네요. 이제 우리들도 게임개발에 한번 적용을 해보는 것도 나쁘진 않을 듯 합니다.

구현 고민...
  • 상속은 최대한 피하고, 포함 기법을 사용.
  • 여러 Component들을 포함할 수 있게 System화.
  • Component들 간 Message Communication.
  • Entity는 여러개의 Component를 가질 수 있다.
  • Component는 Id Type을 가진다.
  • Id는 문자열 보다는 문자열을 해쉬로 처리해서 가지고 있는게 좋을 듯.
  • 동시에 2개 이상의 Component가 필요하다면 그 것들을 포함하는 새로운 Component를 개발.
  • 비슷한 Component들은 Category로 분류해서 처리 할 수도 있다.
  • 게임 디자이너들이 원하는데로 컴포넌트를 조합해서 새로운 Entity를 생성할 수도 있도록.


Component간 Communication은?
Message를 이용해서 처리합니다. Message 시스템은 각 Component들이 어떤일을 처리하는지 모를 때 이용하면 유용합니다. 이는 객체 간의 의존성 문제를 해결해 추후 Component가 제거 또는 수정 되었을 때, 영향을 최소화 할 수 있겠죠.
하지만, 실제 개발 상황에서는 어느정도 Component들 간에 의존성이 생길 수 있겠습니다. 성능이 중요시 되는 부분이 있다면 Component가 다른 Component의 포인터를 저장해서 바로 메소드를 호출 하도록 할 수도 있겠네요.


단점은 없을까?

저 같은 경우는 기존 방식대로 했으면 더 빨리 구현이 되었을 것을 Component로 나눠 설계를 하는데 있어서 어디까지 Component로 나누고 조합할지 난감하더군요. Message부분도 마찬가지 였습니다. 게임을 상용화 할 때까지는 경험으로 터득하는 수 뿐이 없을 듯 싶네요.
또한 성능 이슈도 생각 해봐야 겠네요. 기존 방식에서는 객체의 메소드를 바로 호출하 던 것을 Entity와 Component를 찾거나 Message를 보내는데 cpu를 파워를 사용하다보니 약간의 
성능 저하가 있을 수 있다고 하네요.


결론

OOP를 대체하지는 말고 OOP와 Component를 적절히 섞어서 사용하면 좋을 듯 합니다.

현대차가 슬로건을 바꿨죠.( 갑짜기 쌩뚱맞게 차 이야기가? ㅎ )
새로운 생각, 새로운 가능성( New Thinking. New Possibilities. )
개발중 변경도 아닌 신규 프로젝트에 처음부터 사용을 해보는 거니 늦었지만 새로운 생각으로 새로운 가능성을 보고 Component Based Programming를 쭉 이어나가 완성해 보도록 하겠습니다~^^;

참고 자료

댓글

이 블로그의 인기 게시물

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

goorm IDE에서 node.js 프로젝트로 Hello World Simple Server 만들어 띄워보기

애드센스 수익을 웨스턴 유니온으로 수표대신 현금으로 지급 받아보자.