개발 노트 Reflection C++ 2018/10/22 05:09 by cagetu

Reflection - (Data-Driven...)에 대해서는 오래전에 한번 작성해봤었는데, 특별히 구현해볼 기회는 없었다. 예전에 엔진이라고 하면 무조건 렌더러만 생각했었는데, 요즘에는 언리얼 엔진을 기반으로 회사 작업을 하면서 개발 팀에서의 엔진이라는 관점은 역시 좋은 툴이고 좋은 툴을 만들기 위해서는 뭐가 필요한가? 라는 관심에 C++에서 Reflection을 어떻게 구현하는가?를 정리하고 있다.

Unity 처럼 mono나 .NET 기반으로 게임 프레임웍을 사용하도록 엔진을 구성하고, C#을 이용한다는 것도 굉장히 영리한 방법이다. 이를 통해서 C# 기반의 툴을 만들고, 게임을 만들면 너무 다양한 가능성이 있을 수 있다. (생각해보니까 장점이 너무 많은 듯 하구나..;;; 유니티는 멀티 플랫폼에서 하지?? C++로 컴파일하나??)

하지만, 순수하게 C++을 기반으로 엔진을 만든다면 결국 시스템을 구현해야 한다. 내가 언리얼 엔진에서 느꼈던 가장 좋은 점은 툴에 노출이 자동으로 되기 때문에 툴로 만들기 좋다는 점과 Serialize 될 것을 구분할 수 있다는 것이다. 내가 만들어보고 싶은 Reflection의 기능은 여기에 추가적으로 게임이 뜬 상태에서 객체의 값을 변경하면서 작업해보고 싶다는 것이다. 특히, 숫자 데이터를 바꿔가면서 게임에서 보고 싶을 때가 많은데, 이것을 매번 코드로 변경하면서 보기는 너무 어려우니 뭔가 외부에서 특정 변수의 값을 변경하면서 테스트할 수 있는 방법이 필요하다고 생각한다. 이게 Relfection이 꼭 필요하냐? 라고는 보기 어려울 수도 있지만, 나는 이 기반 시스템을 확장해서 Nebula3 처럼 웹 브라우져에서 통신할 수 있으면 너무 좋지 않을까? 라는 계획을 가지고 있다.

암튼... 크게 보면 Reflection을 C++에서 구현하는 방법은 세 가지 인 듯 하다. 

- 첫번째, 코드를 파싱하는 방법이다.
언리얼 엔진처럼 클래스에 Definition 정보를 같이 추가하여 작성해 놓으면, Custom Compiler가 먼저 Definition을 이용해서 Reflection 정보를 생성한 후 컴파일 및 코드 링크를 하는 방식이다. 매우 강력하고, 코드 사용이 쉬우나 외부 컴파일 툴이 필요하고, 컴파일 시간이 오래걸릴 수 있으며, 코드 사이즈가 커진다. 

- 두번째, 매크로를 사용하여 Definition을 직접 작성하는 방식이다. 
컴파일 시간이나 코드 사이즈나 불어날 염려는 없지만, 직접 작성해야 하기 때문에 번거럽고 복잡해질 수 있다.

- 세번째, 타입 정의 언어를 사용
별도의 class definition을 정의하는 방식이다. nebula device가 별도의 metadata를 위한 table을 가지도록 하였다.

(계속)

[참고자료]

덧글

댓글 입력 영역



메모장

내가 먼 훗날에 이 글들을 보았을 때, 좋은 추억이 될 수 있기를...

나를 위해... 나에게 쓰는...

msn: cagetu@hotmail.com
mail: cagetu79@gmail.com
twitter: twitter.com/cagetu
facebook: facebook.com/cagetu