본문 바로가기

프로그래밍/TIL

자체 게임 엔진 개발하기 (HopStep Engine)

 게임 클라이언트 프로그래머로서, 자체 게임 엔진을 개발하는 것은 언제나 상상하던 일이 아닐까 싶다.

 특히 언리얼 엔진을 사용하다보면 코드의 내부까지 모두 확인이 가능하다보니 "나도 해볼 수 있지 않을까?"하는 생각이 들게 된다. 물론 만들다보면 그리 긴 시간이 지나지 않아 그 생각이 틀렸다는 것은 알게 된다.

 

 마침 POE 시즌도 끝냈고, 회사 내부의 세미나도 준비해두어야 할 것 같아서 쉬는 시간에 짬짬이 자체 게임 엔진을 개발중이다. 이름은 작은 규모의 개발을 경쾌하게 하자! 라는 의미로 HopStep 엔진이라고 지었다.

 

https://github.com/highfence/HopStep

 

GitHub - highfence/HopStep

Contribute to highfence/HopStep development by creating an account on GitHub.

github.com

 

 자체 게임 엔진 개발이라는 허울 좋은 이름아래 어영부영 껍데기만 만들어본 경험이 이미 있기 때문에, 이번에는 좀 내가 관심있는 주제에 촛점을 맞춰서 개발해볼 예정이다.

 

 렌더링 구현도 떼고, 딱 콘솔에서 엔진이 돌아갈 정도로만 작게 만들고, 언리얼의 리플렉션과 GC를 목표로 구현해볼 예정이다.

 

 가장 큰 참고 사항은 당연히 언리얼 엔진이겠지만, 사실 언리얼 엔진은 코드가 너무 방대하고 어려운 점도 있어서 보기가 불편할 때가 있다.

 

 그래서 아래 코드들을 참고하면서 구현을 해볼 예정이다. 아래 리포지토리는 언리얼을 베이스로 만든 자체 엔진이기 때문에, 나는 언리얼의 모작의 모작 정도 되는 셈이다.

 

tkdgur4427/LSGDEngine: Light SGD Engine (github.com)

 

GitHub - tkdgur4427/LSGDEngine: Light SGD Engine

Light SGD Engine. Contribute to tkdgur4427/LSGDEngine development by creating an account on GitHub.

github.com

Aumoa/CPP.REF: C++.REF (github.com)

 

GitHub - Aumoa/CPP.REF: C++.REF

C++.REF. Contribute to Aumoa/CPP.REF development by creating an account on GitHub.

github.com

 

 엔진 코드를 보면서 요즘 가장 부족하다고 느끼는 건 template에 관한 지식인 것 같다. 도저히 이게 무슨 말인지 못알아 먹을때가 많아서, 최대한 간략화해서 샌드박스에서 이 코드가 어떻게 돌아가는 건지 계속 테스트 해보고 있다.

 

 그리고 새로 배운 것은 C++20에 추가된 Concept!

 C#의 Generic과도 같은 기능인데 template 코드에 면역력이 없는 나에게는 이해를 편하게 해주는 좋은 도구인 것 같다.

 내가 template 인자의 어떤 구현을 사용하고 싶었다면 기존에는 일단 쓰고 보거나, 메타 프로그래밍을 이용한 어떤 작업들이 필요했을 것인데, Concept를 이용하면 이를 명료하게 표현할 수 있어서 좋았다.

 

template <class TType>
concept StaticClassGetable = requires(TType Type)
{
    TType::StaticClass();
};

template <StaticClassGetable TType>
void DoSomething()
{
    auto TypeStaticClass = TType::StaticClass();
}

 

 어떤 함수에서 타입의 StaticClass()라는 구현이 필요하다면, 그에 해당하는 Concept를 만들고 template의 인자를 제한해주는 식이다. 물론 이 말고도 많은 활용방법이 있는 것 같다. 필요할 때마다 조금씩 배워나갈 생각이다.