인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

이건형님의 프로필 이미지
이건형

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

SendBuffer

SendBufferRef에 대하여 질문 있습니다.

해결된 질문

작성

·

249

1

안녕하세요 루키스님

이번 SendBuffer 강의를 들으면서 궁금한 것이 생겨 질문 드립니다.

SendBuffer에 자기 자신에 대한 스마트 포인터를 갖도록 해주어 Reference Counting을 해주었는데, 이번 강의의 코드를 복습하면서 분석하다 보니 '왜 SendBuffer에 RefCounting이 필요한가?' 에 대한 의문이 생겼습니다. 일단 제가 이해한 Send의 흐름은 다음과 같습니다.

  1. GameSession에서 SendBuffer를 생성하여 원하는 데이터를 복사하여 Send를 호출하면 SendQueue에 일단 Push하여 데이터를 쌓아 놓습니다.

  2. 그 때 어떠한 쓰레드에서도 그 세션에 대한 RegisterSend를 수행하고 있지 않다면 해당 쓰레드가 RegisterSend를 수행하는데 이때까지 쌓인 데이터를 SendEvent의 버퍼에 담아 WSASend를 수행합니다.

  3. 그런 다음 IocpCore에서 완료 통지를 받으면 Worker 쓰레드가 Dispatch를 수행하여 ProcessSend를 수행하면서 이 때 SendQueue에 데이터가 더 있다면 그 쓰레드가 RegisterSend를 수행합니다.

위의 흐름이 제가 이해한 내용인데 결국 한번에 하나의 RegisterSend가 진행되도록 하는 것이 핵심이며 한 번에 하나만 실행하기 때문에 SendEvent도 재 사용 가능한 것이라고 생각합니다. 그렇다면 이 세션에 대한 SendEvent는 Send되고 있는 동안에는 멀티쓰레드 환경에서 안전하다고 생각 되는데 그렇다면 SendEvent에 담긴 SendBuffer도 안전하여 사라질 걱정을 하지 않아도 되는 것 아닐까 싶습니다.

즉, WSASend를 한 번에 하나의 쓰레드만 수행하기 때문에 SendEvent도 재 사용이 가능하고 그 속에 담긴 SendBuffer도 멀티쓰레드 환경으로부터 안전하기 때문에 SendBuffer의 RefCounting이 왜 필요한 것인지 궁금합니다.

답변 1

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

Broadcasting이 들어가면 얘기가 달라집니다.
[1번 유저가 5번 몬스터를 공격한다] 라는 행동을 패킷으로 만든 다음,
주변에 있는 1000명의 유저들한테 쭉 뿌려야 한다 가정해봅시다.
무식하게 만들면 해당 패킷을 1000번 만들어서 각 유저한테 일일히 Send해줄 수도 있겠지만,
그보다 더 좋은 방법은 패킷을 1번 만들고 모든 사람들한테 '꽂아주는' 것이겠죠.

이건형님의 프로필 이미지
이건형
질문자

아하 BroadCasting할 때 전송하고자 하는 패킷을 1000개의 Session에서 각자의 wsaBuf에 복사하여 Send하는 것 보다 SendBuffer를 하나 만들고 그 SendBuffer의 스마트 포인터를 건네주도록 하여 복사비용을 줄이는 것이 중요한 목적이라는 말씀이시군요.

결국 복사비용 때문에 스마트 포인터를 사용하게 되어 Reference Counting을 하게 된거군요.

Rookiss님의 프로필 이미지
Rookiss
지식공유자

네 맞습니다 ㅎㅎ

이건형님의 프로필 이미지
이건형

작성한 질문수

질문하기