2012-05-11 4 views
2

렌더링 시스템, 물리 시뮬레이션 및 UI라는 세 가지 구성 요소가 있습니다. UI 코드는 스크립트로 작성되며 신뢰할 수 없습니다. 이제 물리 시뮬레이션의 결과를 렌더링 시스템에 전달하고 정확한 디자인을 확신 할 필요가 있습니다. 예를 들어, 모든 틱마다 렌더러에 새 sim 데이터를 복사 할 수 있습니다. 그러나 이것은 약간의 낭비처럼 보입니다. 시뮬레이션의 데이터를 직접 처리하도록 렌더러를 설정할 수 있지만 이것이 캡슐화를 위반하는 것처럼 보입니다.캡슐화 된 두 구성 요소 간의 통신

잠재적으로 수천 개의 움직이는 유닛과 작업하기 위해이 시스템을 사용하려고합니다. 따라서 성능을 염두에 두는 것이 좋습니다.

캡슐화를 위반하지 않고 한 구성 요소에서 다른 구성 요소로 데이터를 신속하게 이동할 수 있습니까?

+0

데이터를 const로 표시 할 수 없습니까? 'sim.cdata()'또는 이와 비슷한 것? – 111111

+0

다음 작업을 수행해보십시오 : sim 데이터에 (다소간) 안정적인 인터페이스를 정의하고 렌더러가 인터페이스 만 가져 오도록 만드시겠습니까? 시뮬레이션의 구현 세부 사항은이 방법으로 숨길 것입니다. 맞습니까? – Vlad

+0

@Vlad : 물론. 그건 전체 캡슐화가 아니라 부분 캡슐화 일 뿐이에요. 답으로 게시하는 것을 고려하십시오. – Puppy

답변

0

렌더러가 렌더링에 필요한 데이터를 보유 할 객체를 할당하게했을 수도 있습니다. 이러한 객체는 렌더러가 작업을 수행하기에 충분한 가시적 인터페이스를 정의하지만 그렇지 않으면 불투명합니다. 객체 자체가 렌더러에 의해 할당/소유 되더라도 객체는 대개 불투명 한 유형입니다.

시뮬레이터는 공용 인터페이스에 표시된 것보다 더 많은 지식이 필요한 경우 해당 객체의 내부에 대한 지식을 소유합니다. 렌더러가 기본적으로 데이터를 읽는 곳에서는 시뮬레이터가 상태/데이터를 수정할 수 있습니다.

구현할 수있는 한 가지 방법은 "go-between"개체에 다중 상속을 사용하는 것입니다. 부모 중 하나는 렌더러에서 사용할 수 있도록 제한된 공용 인터페이스를 제공하고 다른 하나는 시뮬레이터에서 사용할 수 있도록보다 포괄적 인 인터페이스를 제공합니다.

물론 본질적으로 C++ 자체가 제공하는 보호 기능이있는 것처럼, 이는 기본적으로 의도적 인 전복이 아닌 사고를 방지하는 것입니다. 렌더러에 대한 신뢰 부족으로 인해 기본적으로 보안을 파괴하려고 시도하는 렌더러가 아니라 가능한 버그에 대해 보호하고 있다고 가정합니다. 후자에 대항해 보호해야 할 필요가 있다면 적어도 시뮬레이터와 렌더러가 별도의 프로세스에 있고 OSC 수준의 메커니즘을 사용하고 IPC를 사용하는 것이 필요합니다. 거의 필연적으로 상당한 오버 헤드가 추가 될 것입니다).