저는 며칠 동안 머리 속에이 문제를 타격했습니다. 그래서 나는 만족스런 결론을 내리지 못했고, 그래서 나는 자신의 의견에 대해 SO 직원에게 물어볼 것이라고 생각했습니다. 내가 일하고있는 게임의 경우, here과 here과 같이 Component Object Model을 사용하고 있습니다. 사실 꽤 잘 돌아가고 있지만 현재의 스토리지 솔루션은 제한적으로 변하고 있습니다 (클래스 이름 또는 임의의 "패밀리"이름으로 만 구성 요소를 요청할 수 있음). 내가 원하는 것은 주어진 타입을 요청하고 그 타입의 모든 컴포넌트 나 타입에서 파생 된 타입을 반복하는 것입니다.구조용 계층 구조 구성 요소 스토리지
이 점을 고려하여 먼저 기본 클래스 유형을 파생 형식을 통해이 순서로 저장하는 간단한 RTTI 체계를 구현했습니다. 즉, 스프라이트에 대한 RTTI는 component :: renderable :: sprite가됩니다. 이렇게하면 B의 모든 요소를 단순히 비교하여 유형 A가 B 유형에서 파생되었는지를 쉽게 유형을 비교할 수 있습니다. 즉, component :: renderable :: sprite는 component :: renderable에서 파생되지만 component :: timer에서 파생되지 않습니다. 간단하고 효과적이며 이미 구현되었습니다.
내가 지금 원하는 것은 계층 구조를 나타내는 방식으로 구성 요소를 저장하는 방법입니다.
component
/ \
timer renderable
/ / \
shotTimer sprite particle
내가 그 유형의 모든 구성 요소의 목록을 저장하는 것입니다 각 노드에서 : 마음에 오는 첫번째 것은 그래서 같은 노드로 유형을 사용하는 나무입니다. 그런 식으로 "component :: renderable"노드를 요청하면 파생 된 유형에 상관없이 모든 렌더링 가능 구성 요소에 액세스 할 수있게됩니다.
for_each(renderable.begin(), renderable.end(), renderFunc);
을 아래로 렌더링 할에서 전체 트리를 통해 그 반복 처리가 : 문지 내가 이런 식으로 뭔가를 할 수 있도록 반복자와 그 구성 요소에 액세스 할 수 있도록하려는 것입니다. 이 작업은 정말 못생긴 map/vector/tree 노드 구조와 내가했던 곳의 노드 스택을 추적하는 커스텀 포워드 이터레이터를 사용합니다. 모든 것을 구현하는 동안, 나는 더 좋은, 더 명확한 방법이 있어야한다고 느꼈다 ... 나는 단지 하나를 생각할 수 없다. (
그래서 질문은 : 나는 이것을 불필요하게 복잡하게 만든다? 일부 명백한 단순화 내가 누락, 또는 내가 사용한다 구조를 기존의? 아니면이 단지 inheritly 복잡한 문제이며 아마 당신이 어떤 입력을위한 잘 이미?
감사하고 있어요 있어요!
추가/제거 이상을 트래버스해야하며 상황에 따라 한 번에 수백 ~ 수천 개의 구성 요소를 계획합니다. 나는 당신이 말했던 방법을 고려해 보았지만 여전히 그것을 배제하지는 못했지만 저장 요구 조건에 대한 큰 팬이 아닙니다. 그래도 최선의 선택이 될 수 있습니다. – Toji
당신은 boost :: graph를 보았습니까? – MadCoder
나는 실제로있다. 너무 강하게 생각했지만 일부 빠른 테스트에서 필자가 필요로하는 방식으로 사용했을 때 약간의 성능 저하를 나타냈다. 내가 틀린 것을 사용하고있을 수도 있습니다. 나는 다시 한번 살펴 봐야 할 것이다. – Toji