버그 해결을 위한 모든 질문을 던져
0 votes
116 views
현재 프레임워크 개발중입니다.
ECS 방식으로 돌아가는 구조를 생각하고 만들고 있습니다.
다름이 아니라 게임단에서 ECS 형태를 바닥부터 만들게 하기 싫어서 프레임워크 단에서 엔티티나 컴포넌트 관리를 하게 하려고 하고 있습니다.

struct Base 를 만들어 놓고 관리 클래스에서 std::vector<Base*> mContainer; 가지고 있게하고
생성 함수에 템플릿 가변 매개변수로 컴포넌트들을 받아서 벡터에 넣는걸 생각하고 시작했습니다.
그럼 게임단에서 컴포넌트들을 만들고 Base를 상속 받는 형태로 하고 가변으로 넘겨서 동적 바인딩 되게 벡터에 넣으려고 했습니다.그런데 가변 인자로 넘기는 부분에서 좀 많이 삽질을 했으나 이리저리 찾아보면서 삽질해서 tuple로 받아서 벡터에 넣는거까지는 어찌저찌 했습니다.

그런데 하고 나니까 기본적인 문제가 발생하네요.

.....자식 클래스에 있는 데이터 접근이 안되네요. ㅋㅋ ㅜㅜ

컴포넌트를 엔진단으로 다 올릴 수도 없는 문제고 함수 오버라이딩으로 가져오는 식으로 하기에는 멤버 변수가 고정이 아니고
게임단으로 다 내리려야하는건지;;
그런데 유니티나 다른 엔진보면 게임단의 신규 컴포넌트을 등록해서 쓰는걸 보면 방법이 있을거 같긴한데 해결 방법이나 대안 좀 알려주셨으면 좋겠습니다.
asked (13 point) , 116 views

1 답변

0 votes

엔진단에서 고정된 기본 ECS 라이브러리를 만들어 놓은 상태에서
게임단에서 다양한 형태의 컴포넌트와 시스템을 만들어 사용하고 싶으신 것 같습니다. 

제가 잘 이해한 것인지 모르겠습니다만...

템플릿을 적극적으로 사용하여 `vector`가 아닌 type과 pod가 지정되는 `map`으로 관리 하시는게 어떨까 합니다.

앗.. 이미 이부분은 해결 하신 것 같고... 
동적으로 type 정보가 필요한 상황으로 보이는데, RTTI를 쓰면 되지 않을까요?
(역시 아래 예제에 RTTI / 비RTTI 방식이 구현 되어있습니다.)

GitHub 찾아보니 좋은 예제가 있네요:
redxdev/ECS: C++ single-header entity component system library (github.com)

answered (53 point)
수정됨
동적 캐스팅이나 RTTI는 일단 최대한 배제 하려고요 ECS 사용하는 이유중 큰게 멀티쓰레딩과 메모리 연속성에 따른 미스 최소화로 결국 목적은 성능을 극대화인데 좀 떨구게 만드는 것들을 쓰는것도 안 맞는거 같아서요(뭐 최후의 상황에는 써야겠지만요)
아무튼 여러 소스 참고해보고 있는 중인데 알려주신 것도 참고해 보겠습니다
답변 감사해요

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

497 질문
650 answers
626 댓글
118,032 users