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

박별님의 프로필 이미지
박별

작성한 질문수

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

언리얼에서 소켓 연결 관련 전역 객체의 생성 질문

해결된 질문

작성

·

414

·

수정됨

0

안녕하세요 강사님

강사님의 강의를 들으며 게임 서버 개발자를 꿈꾸는 학생입니다.

다름이 아니라 이번에 프로젝트를 진행할 기회가 생겨서 언리얼 클라와 IOCP 서버를 연동해 게임을 만드려고 합니다.

이때 클라측에선 네트워크 스레드를 별도로 두어 패킷의 송수신을 담당하도록 하고 수신받은 데이터를 전역에서 존재하는 큐를 여러개 두어(인게임 패킷만 다루는 큐, 로비에서의 패킷만 다루는 큐 등) 여기에 밀어주도록 하고 메인 스레드에서 이를 락을 걸어 뽑아서 쓰는 형식으로 구현할 계획입니다.

여기서 궁금한 점이 이런 소켓 연결 관련 객체와 글로벌 큐를 어느 위치에서 가지고 있어야 하는지입니다. 전역으로 사용하고 연결이 끊기면 안되므로 Game Instance를 생각하고 있습니다만 더욱 좋은 방법이 있는지 강사님께 여쭤보고 싶습니다.

 

읽어주셔서 감사합니다!

답변 1

1

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

네 현재 관련 강의를 주말에 진행하고 있는데
GameInstance에다 큐를 배치할 예정입니다.
다만 패킷 큐는 (인게임 패킷만 다루는 큐, 로비에서의 패킷만 다루는 큐 등)와 같이
구분할 이유는 전혀 없고 1개만 있으면 됩니다.
protobuf 연동하는게 조금 정신이 없는데
언리얼 엔진 모듈에 대해 검색을 해보셔야 할겁니다.

그리고 언리얼에서 제공하는 TQueue 등이 기본적으로 LockFree Based라서
굳이 새로 만들 필요 없습니다.

박별님의 프로필 이미지
박별
질문자

감사합니다 강사님! Protobuf 모듈은 build.cs 부분을 적절히 수정하니 쉽게 연동 되었습니다. 혹시 클라이언트에서 큐 말고도 Session 객체(소켓 연결을 포함한 Send 등의 기능이 있는 객체)도 싱글톤 보다는 GameInstance에 배치하여 호출하는 것이 조금 더 괜찮을까요? 마지막으로 패킷큐에 쌓인 패킷은 PlayerController에서 Dequeue하여 사용하는 것이 아름다운지 여쭤보고 싶습니다!

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

Session은 싱글톤보단 객체로 만들어서 배치하는게 좋습니다.
왜냐하면 간혹 클라에서 다중 서버 접속이 필요한 경우도 생기는데요.
(내가 접속하는 서버 말고, 던전 서버는 서버 통합이라 따로 접속을 해야한다던가...)
그럴 때 Session이 여러개 생길 수 있는데 싱글톤 하나로 관리하면 좀 정신이 없는 경우가 생길 수 있습니다.

그런데 이런건 뭐 나중에 고민해도 되고 일단 수단과 방법을 가리지 않고
어떻게든 구현하는 것에 초점을 맞춰보세요

박별님의 프로필 이미지
박별

작성한 질문수

질문하기