게임을 만들 때 종종 모든 개체가 상속하는 다음 게임 개체를 만듭니다.
public class GameObject{
abstract void Update(...);
abstract void Draw(...);
}
따라서 루프를 업데이트하면 모든 게임 오브젝트를 반복하고 상태를 변경할 수있는 기회를 제공 한 다음 다음 드로우 루프에서 모든 게임 오브젝트를 다시 반복하고 스스로 그릴 수있는 기회를 제공합니다.
간단한 포워드 렌더러를 사용하는 간단한 게임에서는 꽤 잘 작동하지만 종종 모델, 여러 텍스처 및 게임 오브젝트 사이에 긴밀한 결합을 만드는 팻 드로우 방법을 저장해야하는 거대한 게임 오브젝트로 이어집니다. 현재의 렌더링 전략 및 렌더링 관련 클래스
렌더링 전략을 앞으로에서 지연으로 변경하려면 많은 게임 오브젝트를 업데이트해야합니다. 그리고 내가 만든 게임 객체는 재사용 할 수 없습니다. 물론 상속 및 / 또는 구성은 코드 복제와 싸우고 구현 변경을 조금 더 쉽게 만들 수 있지만 여전히 부족하다고 느낍니다.
더 좋은 방법은 GameObject 클래스에서 Draw 메서드를 모두 제거하고 Renderer 클래스를 만드는 것입니다. 게임 오브젝트는 여전히 어떤 모델로 표현할 것인지, 어떤 텍스처를 모델에 페인트해야하는지와 같은 비주얼에 관한 데이터를 포함해야하지만, 렌더링 방법은 렌더러에게 맡겨야합니다. 그러나 렌더링에는 종종 테두리가 많이 있기 때문에 GameObject에서 렌더러로의 긴밀한 커플 링이 제거되지만 렌더러는 여전히 모든 게임 오브젝트에 대해 알고 있어야합니다. 단단히 결합. 이것은 몇 가지 좋은 관행을 위반합니다. 아마도 데이터 지향 디자인이 트릭을 수행 할 수 있습니다. 게임 오브젝트는 확실히 데이터 일 것이지만, 렌더러는 어떻게 이것에 의해 구동됩니까? 잘 모르겠습니다.
그래서 나는 길을 잃었고 좋은 해결책을 생각할 수 없습니다. 나는 MVC의 원칙을 사용하려고 시도했지만 과거에는 게임에서 그것을 사용하는 방법에 대한 아이디어가 있었지만 최근에는 생각했던 것처럼 적용되지 않습니다. 여러분 모두이 문제를 해결하는 방법을 알고 싶습니다.
어쨌든 다음과 같은 디자인 목표를 달성하는 방법에 관심이 있습니다.
- 게임 오브젝트에 렌더링 로직이 없습니다
- 게임 오브젝트와 렌더 엔진 간의 느슨한 결합
- 아는 렌더러
- 렌더 엔진 간의 런타임 전환
이상적인 프로젝트 설정은 별도의 '게임 로직'과 서로 참조 할 필요가없는 렌더 로직 프로젝트입니다.
존 카맥 (John Carmack)은 트위터에 그가 유연하게 시스템을 가지고 있다고 말하면서 런타임에 렌더링 엔진을 교체 할 수 있고 시스템에 렌더러 (소프트웨어 렌더러 및 하드웨어 가속 렌더러)를 사용하도록 지시 할 수 있다는 생각에 기차가 시작되었다. 동시에 차이점을 검사 할 수 있습니다. 지금까지 프로그래밍 한 시스템은 그처럼 유연하지 않습니다.