컴포넌트 기반인데, 오브젝트는 그저 정수 하나. 각 컴포넌트 매니져가 있어서, 오브젝트를 컴포넌트 매니져에 등록시키는 방식임. 멀티스레딩을 연습해보고 싶어서 오브젝트가 컴포넌트를 주저리주저리 달고 있는 방식은 사용하지 않기로 했음.
그러다보니 컴포넌트 매니저끼리는 이 오브젝트가 우리 컴포넌트를 가지고 있다는걸만 알지, 다른 컴포넌트를 가지고있는지는 모름. 그래서 메시지 방식을 도입했음.
HP 컴포넌트 매니저의 경우, HP_DECREASE 메시지를 받으면 메시지에 있는 오브젝트ID와 감소량을 읽어서 처리해줌.
그런데 무적 컴포넌트가 있다고 하면, HP 컴포넌트가 HP_DECREASE 메시지를 받으면 이 오브젝트가 무적인지 아닌지를 확인해야함. 심지어 무적 컴포넌트를 들고있지 않을 수도 있음. 아무튼 HP_DECREASE 메시지 처리부분에서는 당장 이 오브젝트가 무적인지 아닌지, 무적 컴포넌트를 들고있는지 아닌지를 알아내야함.
그런데 만약 IS_GOD_MODE 메시지를 무적 컴포넌트한테 보냈다고 쳐보자. 여기서 문제가 발생하는게, 무적 컴포넌트는 IS_GOD_MODE 메시지를 받을거임. 그리고 자신과 통신하는 "여러" 컴포넌트 매니져에게 NOT_GOD_MODE 메시지를 브로드캐스팅 할거임. 중요한건 여러 컴포넌트 매니저임. HP 컴포넌트도 메시지를 받고, 다른 컴포넌트도 메시지를 받으면, 그 다른 컴포넌트 매니져도 자기만의 로직 처리를 할거임.
만약 NOT_GOD_MODE_TO_HP라는 메시지를 억지로 만들어서 HP 컴포넌트만 받을 수 있게 한다고 쳐보자. 그런데 HP 컴포넌트는 저 메시지를 받고 뭘 처리해야함? 메시지에는 이 오브젝트가 무적상태가 아닙니다. 정보밖에 없음. 난 HP 감소 처리를 위해서 메시지를 보냈는데 이젠 HP를 얼마나 감소시켜야하는지에 대한 정보가 없음.
주저리 주저리 길었지만 하고싶은 말은 무적상태 체크는 HP_DECREASE 메시지 처리 부분에서 확인 가능해야하다는 거임. 이 문제때문에 여러 생각을 해봤지만 결론은 컴포넌트 매니져한테 직접(public 함수) 물어봐야 한다는거임. 근데 이럴거면 오브젝트에 컴포넌트 등록하는 방식보다 나은게 뭘까. 이 방법 말고는 다른 방법이 안떠오른다. 물론 서로 다른 컴포넌트 매니저끼리 상대방의 컴포넌트 값을 바꿀 수 없도록 read 혹은 상태체크 함수만 만들어서 제공한다면 큰 문제는 없을 것 같은데, 그냥 함수를 제공하는 것 자체가 내가 사용하고 있는 구조가 잘못됐다는걸 말하는 것 같아서 싫다. 컴포넌트 매니져끼리는 무조건 메시지로 통신한다는게 대전제였는데...
보통 문제 안풀릴때 디씨 글쓰기창에 주저리주저리 적다보면 아이디어 한두개쯤 생각나던데 이번엔 생각조차 안나네.
새벽에 좆같아서 그냥 글 쌌음. 보고 너무 욕하진 말아주셈...
로직도 컴퍼넌트로 들고있으셈 - dc App
게임쪽은 확실히 OOP를 100퍼센트 적용하기 힘든것 같음. 옵저버로 구현해놔도 오히려 나중에 병목의 근원이 되어서 제거하게 되더라
게임이 무슨 1000프레임 뽑을 것도 아니고 메시지 큐가 성능에 큰 영향을 끼치진 않을거라 생각하는데... 그러나 모든 동작을 메시지에 의존하는 것은 좋지 않다고 봄. 메시지를 받으면 송신한 객체를 알 수 있을테니 이건 메서드로 직접 접근하는게 좋을거라고 생각해. 아님 메시지 큐로 짜질 말아야 함.
IS_GOD_MODE 메시지를 무적 컴포넌트에 보내면 왜 NOT_GOD_MODE를 관련없는 수신자에 보내? 받은 메시지에 송신자가 포함되어 있을테니 객체에 직접 접근하거나 얘한테만 메시지 보내면 되지 않을까?
모든 컴포넌트들간의 의존성을 없애버리는게 목표였음. 뭐.. 지금 생각해보면 잘못생각한거였지만. 말한것처럼 처음에는 메시지에 송신자 정보도 넣었었음. 그런데 그때 당시에는 메시지를 브로드캐스팅해도 응답하는 컴포넌트 매니저는 딱 한명일거라고 생각했음. 그래서 빼버림. 그런데 코드를 짜다보니까 아니였던거임 ㅋㅋ... 그래서 이 오브젝트가 죽지 않았다는 NOT_GOD_MODE를 여러 컴포넌트 매니저에게 보냈을 때, 내가 원하는 컴포넌트 매니저만이 응답할 수 있다고 가정하고 더 생각해봤음. 이제 글에 작성했던 문제가 나옴. "주저리 주저리 길었지만 하고싶은 말은 무적상태 체크는 HP_DECREASE 메시지 처리 부분에서 확인 가능해야하다는 거임" 이 부분임.