2012-01-27 1 views
0

저는 게임 엔진을 만들고 있는데, 몇 가지를 재구성하려고합니다. 즉 엔진의 주요 구성 요소 (오디오, 비디오, 키보드/마우스 IO 등)를 관리하는 EngineManager입니다. 차례로 메시지를 보내드립니다 이벤트 처리 (SDL에서) 이러한 다양한 구성 요소를 통해 데이터를 전송하는 클라이언트로 EngineManager을 사용하는 것입니다 당신이 경우여러 서버가 잘못된 디자인을 가리키는 클라이언트를 사용하고 있습니까?

이의 주요 구현 아이디어는을 정리 뒤로. 정신을 피하기 위해, 나는 다음과 같은 구현이 :

구성을

class Config 
    { 
    public: 

     Config(const EngineManager* engine, const Controls* controls); 

     ~Config(void); 

     //More functions 

    private: 

     Controls** mControls; 

     EngineManager** mEngine; 

     //More functions/class members 

    }; 

    Config::Config(const EngineManager* engine, const Controls* controls) 
     : mControls(controls), 
      mEngine(engine), 
      mIsInitialized(false) 
    { 
    } 

    Config::~Config(void) 
    { 
     delete mControls; 
     delete mEngine; 
    } 

EngineManager

class EngineManager 
{ 

public: 

    EngineManager(void); 

    ~EngineManager(void); 

    //More functions/class members 

private: 

    Controls* mControls; 

    Config* mConfig; 

    //More functions/class members 

}; 

EngineManager::EngineManager(void) 
    : mControls(new Controls(this)), 
     mConfig(new Config(this, mControls)), 
     mEvent(new SDL_Event) 
{ 
    Init(); 
} 

EngineManager::~EngineManager(void) 
{ 
    delete mEvent; 
    delete mConfig; 
    delete mControls; 
    delete mScreen; 
} 

내가 컨트롤을 게시 싶지만, 그것은 기본적으로 설정 같은 일을 클래스 - config에 대한 참조없이. 아직

, 뭔가 좋은 구현 ...

모든 아이디어를 일종의 함수 포인터 될 수 있음을 알려줍니다?

+3

좋은 스마트 포인터를 사용하여 RAII .. –

+0

에 무슨 일이 일어 났는지 나는 알 수 있었지만 이런 종류의 의사 소통을 처리하는 함수 포인터는 어떨까요? 다소 간단 해 보입니다. – zeboidlund

+0

'Config' 생성자의'const EngineManager *'에서'EngineManager **'로의 변환 (또는'Controls'을 사용한 유사한 변환)은 어떻게됩니까? – Mankarse

답변

1

가장 큰 디자인 문제는 상호 의존성입니다. 클라이언트/서버를 사용하는 경우 클라이언트는 서버에 의존해야하며 다른 방법은 사용하지 않아야합니다.

클라이언트가 서버의 업데이트에 대해 알아야 할 경우 observer pattern을 사용해야합니다.
메시지에 대한 답장이 필요하고 동기화 된 메시지 (수신자가 메시지를 처리 ​​할 때까지 송신자가 대기)를 사용하지 않으려면 메시지와 함께 콜백을 전달해야하며 여기서 functor가 functor는 클라이언트에 대한 일종의 참조를 포함 할 수 있으므로 functor는 메시지를 다시 보낼 수 있습니다.
자주 변경되지 않는 클라이언트의 수가 제한되어있는 경우이를 서버에 전달할 수 있지만 클라이언트가 구현 한 콜백 인터페이스를 사용해야합니다.

관련 문제