-  엔진 요소의 기본 구성

Normal Engine의 기초 구성은 크게 4가지로 구성합니다.

  • (Entry Point) 엔진 코어 시스템 (DLL)
  • 애플리케이션 레이어 (exe)
  • 2D/3D 렌더러
  • 창 시스템


엔진 시스템

엔진 코어 시스템의 기본 목적은 사용자가 애플리케이션에서 로직을 구성할 때 필요로 하는 적절한 프레임워크나 도구를 제공하고, 게임 로직과 명확하게 계층을 구분해 시스템 관리를 용이하게 하기 위함입니다.

일반적으로 동적 링크(DLL) 형태로 애플리케이션과 상호작용하며, 기존 프레임워크나 도구들이 DLL 형태로 애플리케이션에 제공되도록 솔루션을 구분해서 작성합니다.

엔진 기능을 정의하는 Entry Point

위 사진처럼 EntryPoint.h 코드의 구성 요소를 보면 엔트리 포인트로 애플리케이션 레이어와 엔진 코어가 상호작용 하도록 분리되어 구현되어있습니다. extern으로 객체 생성에 대한 권한은 애플리케이션에게 넘기고, 이후 수명을 관리하는 것은 엔진의 코드 내부에서 int main으로 직접 수행하고 있습니다. 

저 구성의 장점은 애플리케이션의 레이어에서 게임 로직을 작성하면서 엔진의 수명까지 신경쓰지 않아도 된다는 점에 있습니다. 응용 프로그램은 단지 애플리케이션 클래스에 대해 상속받은 자식 클래스를 생성해서 return해주기만 하면 됩니다.


위에 NR_PLATFORM_WINDOWS 매크로는 현재 사용중인 운영체제의 정보를 확인한 후 관련 OS에 맞는 엔트리 포인트를 구동하기 위한 매크로입니다. 이후 NR_BUILD_DLL 매크로를 통해서 응용 프로그램에 DLL 함수를 export해주고 있습니다. 응용 프로그램에서는 NR_BUILD_DLL매크로를 포함하지 않기 때문에, 클래스에서 import로 DLL 데이터를 받게 됩니다. 

 

(좌측) Application layer Propertices (우측) Engine Core System


전처리기를 처리하는 속성 기능에서 애플리케이션의 경우 NR_BUILD_DLL 매크로가 비활성화 되어 있는 것을 확인할 수 있습니다.

 

애플리케이션 레이어

게임을 구성하는 이벤트나 프레임 속도 등 전반적인 로직을 구성하는 계층입니다. 아직까지 구체적인 기능을 구현해보진 않아서 정확히 어떤 역할을 하는지는 현시점에서 작성하긴 어려울 것 같습니다. 일단은 게임 로직과 같은 부분을 담당하는 계층입니다.


위 사진은 애플리케이션을 상속한 클래스를 작성하고, 관련 객체를 생성한 후 엔트리 포인트에 넘겨주고 있습니다.

 

2D / 3D 렌더러

물체를 표현하기 위해서는 정점 데이터가 필요합니다. 해당 정점 데이터를 가공해서 모니터에 출력해주는 프로그램을 렌더러라고 합니다. 이후 다양한 렌더링 API에 대응할 수 있도록, 렌더러를 사용하는 계층도 추상화를 거칠 예정입니다.

 

창 시스템

실제 사용자와 응용 프로그램이 상호작용하는 계층입니다. 우리가 마우스와 키보드를 사용해 이벤트를 발생시키거나 혹은 다양한 인풋 장비, 조이스틱같은 것들을 이용해 프로그램과 상호작용할 수 있도록 돕는 계층입니다.