글쎄, 나는이 게시물이 꽤 오래되었다는 것을 알고 있지만 저항 할 수는 없었다.
최근에 게임 엔진을 만들었습니다. 3d 파티 라이브러리를 사용하여 렌더링 및 물리학을 사용하지만 엔티티와 게임 논리를 정의하고 처리하는 핵심 부분을 작성했습니다.
엔진은 반드시 전통적인 접근 방식을 따릅니다. 모든 엔티티에 대한 업데이트 기능을 호출하는 기본 업데이트 루프가 있습니다. 충돌은 엔티티에 대한 콜백으로 직접보고됩니다. 엔터티 간 통신은 엔터티간에 교환되는 스마트 포인터를 사용하여 이루어집니다.
엔진 메시지에 대한 작은 엔티티 그룹 만 처리하는 기본 메시지 시스템이 있습니다. 이러한 메시지는 업데이트 목록을 망칠 수 있으므로 게임 상호 작용이 끝날 때 처리하는 것이 좋습니다 (예 : 엔티티 작성 또는 파기). 따라서 각 게임 루프가 끝나면 작은 메시지 목록이 사용됩니다.
원시 메시지 시스템에도 불구하고, 나는 시스템이 대부분 "업데이트 루프 기반"이라고 말하고 싶습니다.
잘. 이 시스템을 사용한 후에는 매우 간단하고 빠르며 체계적으로 구성되어 있다고 생각합니다. 게임 로직은 메시지 큐와 같이 동적이 아닌 엔티티 내부에서 볼 수 있고 자체적으로 포함됩니다. 필자의 의견으로는 이벤트 시스템이 게임 로직에 불필요한 복잡성을 유발하고 게임 코드를 이해하고 디버깅하기가 매우 어렵 기 때문에 실제로 이벤트 중심으로 만들지 않을 것입니다.
그러나 나는 또한 내 것과 같은 순수한 "업데이트 루프 기반"시스템에도 문제가 있다고 생각한다.
예를 들어, 어떤 순간에, 하나의 엔티티는 "무 상태"에있을 수 있고, 플레이어가 다가오는 것을 기다리거나 다른 것을 기다리고있을 수 있습니다. 이러한 경우 대부분의 경우 엔터티는 프로세서 시간을 전혀 소모하지 않으며 엔터티를 끄고 특정 이벤트가 발생하면 켜는 것이 좋습니다.
다음 게임 엔진에서는 다른 접근 방식을 채택하겠습니다. 엔터티는 업데이트, 그리기, 충돌 감지 등과 같은 엔진 작업에 등록됩니다. 이러한 각 이벤트에는 실제 엔터티에 대한 별도의 엔터티 인터페이스 목록이 있습니다.