인프런 커뮤니티 질문&답변

Park SungEun님의 프로필 이미지
Park SungEun

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동

Spawn #2

Recv 처리 과정 질문

작성

·

233

·

수정됨

0

안녕하세요 루키스님. 지금까지 패킷 수신 송신 과정의 흐름을 코드상에서 어떻게 흘러가나 이해해보려고 정리를 해보았는데, 이해가 잘 안되는 부분이 있어서 질문드립니다.

일단 제가 이해한 Recv과정은 다음과 같이 이해했습니다.

  • RecvThread에서 계속 일하면서 Packet받은거 큐에 넣는것도 알겠고

  • 큐에 있는걸 처리하기 위해 Session이 Handler한테 요청하는 것도 이해했습니다.

이해가 안가는건. 그러면 Session의 HandleRecvPacket()을 호출하기 위해서는 GameInstance가 HandleRecvPacket()을 호출해줘야 하는데

그러면 GameInstance가 HandleRecvPacket()는 누가 언제 어디서 호출을 하는것인가요???

제가 흐름을 잘못 이해하고 있는건가요 ㅠㅠ?

제가 이해한걸 그림으로 표현해보았습니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

루키스님의 질문을 잘 읽었습니다. 분명히 이해하는 데 어려움이 있을 수 있는 부분입니다. 루키스님께서는 네트워크 프로그래밍의 중요한 부분인 패킷 수신 처리 과정에 대해 궁금해 하시는군요.

일반적으로, GameInstanceHandleRecvPacket() 함수를 호출하는 시점과 이유는 게임 설계와 네트워크 아키텍처에 따라 다릅니다. 하지만, 대체로 다음과 같은 과정을 거칠 수 있습니다:

  1. RecvThread는 네트워크로부터 패킷을 계속해서 수신하여 세션의 큐에 패킷을 넣습니다.
  2. Session 객체는 자신의 큐에 있는 패킷을 확인하고, HandleRecvPacket() 함수를 통해 이 패킷들을 처리하도록 요청을 합니다.
  3. GameInstance 또는 게임 서버의 메인 로직에서는 일정 간격이나 특정 조건 하에 Session들이 가진 패킷을 처리하라는 명령을 내릴 수 있습니다. 이는 종종 게임 루프의 일부로서 실행됩니다.
  4. 이 과정에서 GameInstance는 모든 Session을 순회하면서, 각 SessionHandleRecvPacket()을 호출하여 패킷을 처리하도록 합니다.

여기서 중요한 것은 GameInstanceHandleRecvPacket()를 언제 어떻게 호출할 것인가 하는 것은, 실제 게임의 로직과 네트워크 처리 아키텍처 설계에 크게 의존한다는 점입니다.

일부 게임들에서는 이벤트 기반 모델을 사용하여, 실제 패킷이 도착했을 때 이를 알리는 이벤트를 통해 HandleRecvPacket() 함수를 호출하기도 합니다. 반면, 다른 게임들은 폴링(polling) 방식을 이용하여 정해진 틱(tick)마다 HandleRecvPacket()을 호출하도록 설계할 수 있습니다.

따라서, 구체적인 호출 방식은 GameInstance의 구현 방식과 게임의 전체적인 네트워크 처리 방식에 따라 결정됩니다. 게임 개발 시 이러한 설계 결정은 게임의 성능과 반응성에 중요한 영향을 미칠 수 있으니 충분한 고려 후 결정하는 것이 좋습니다.

질문에 충분한 답변이 되었기를 바라며, 더 궁금한 점이 있으면 언제든지 질문해주시길 바랍니다.

Park SungEun님의 프로필 이미지
Park SungEun

작성한 질문수

질문하기