Packet을 처리하는 NetworkManager의 동작과 GameWorld를 업데이트하는 동작을 서로 다른 스레드로 분리하는 게 효율이 좋을 것 같다. 그래서 패킷을 처리하는 queue를 만들어 이를 두 class 간 공유하는 것으로 설계하고자 한다.

Packet Queue를 만들면 될 것 같은데, 내가 주저하는 이유. Packet Queue의 코드가 운용되고 있는 모양을 직접 본 적이 없다. 그래서 이게 정말 좋은 게 맞을지 믿음이 없고 주저하게 된다. 흠 그래봤자 고민은 배송을 늦출 뿐. 코드를 본적이 없을 뿐 내가 생각한 방향으로도 이렇게 풀어가는 게 맞다. 구현해보자. 대학전쟁2의 수식 퍼즐처럼 적당한 공부와 적당한 도전이 코드를 짜는 것처럼 적당히 균형을 이뤄야 한다.

리팩터링하며 발견한 것.

Send가 고장났다. ???? 1시간이 넘는 디버깅 끝에 발견..! 커밋을 자주 해두니 변경점 위주로 찾을 수 있어 그래도 빠른 편이었던 것 같다.

https://github.com/qhcjfdudn/ChatProject/commit/a511929c08a5ee96e695c8be8fe9923f26946e66

참조자가 참조하는 대상이 사라질 수 있나? 아주 매우 있다.

양쪽 각각을 client1, client2라 하자. client1에서 여러 번 보낸 데이터를 client2에서 recv 하지 않고 있다가, 나중에 한번에 받게 되었다. 이거 TCP라서 이렇게 되는 것 같다. UDP였으면 지정된 데이터그램 개수 만큼 받아오지 않았을까? 나중에 UDP 구축할 때 검증해보자.

image.png

ReceiveQueue와 SendQueue를 전역적으로 싱글턴으로 사용하려고 따로 나눠서 만들어보았는데, 사실 class 디자인은 같은 코드이다. 하나로 합치면 싱글턴을 사용할 수 없다. 아? 있다.

  1. GetReceiveStaticInstance(), GetSendStaticInstance() 2개 함수로 각각 제공하면 된다.

  2. 상위의 PacketQueue class를 만들어 상속으로 중복 코드를 제거하는 모양으로 디자인 가능하다.

    → 이 경우… PacketQueue interface or class를 사용하는 디자인 패턴 같은 것들을 적용할 수 있을 것 같지만 아직은 굳이 사용하는 것 같고, 상속 관계가 N개로 늘어날 일이 없다면 필요 없을 것 같다.

  3. 그대로 둔다. SRP를 생각하면… receive와 send는 서로 다른 호출자의 요청이기에 후에 기능이 분기될 수 있을 것으로 보고 그대로 둔다.