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

김용진님의 프로필 이미지
김용진

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

C++ IOCP서버와 Unity Client 연동 관련

작성

·

1.8K

0

안녕하세요. 

제가 C++을 이용한 IOCP서버와 Unity C# Client 연동해서 게임을 제작해야하는 상황에 있습니다. 

사실 C++로 구현된 서버인줄 알고 구매했는데 C# 서버에 대한 강의인거 같더라구요..

C++서버와 C#을 사용하는 Unity와의 연동 그리고 Unity 자체에 대한 이해도 부족 이것이 저의 가장 큰 걱정거리인데요.

이 강의를 들어면 Unity 서버에 대한 이해도가 생겨서 C++로 독자 서버를 구축하는데 있어서 괜찮을까요??.. 

그리고 여쭤보고 싶은것이 있습니다 ㅠㅠ 서버도 배운지 얼마 안되고 더더욱 Unity는 잘 몰르는데 프로젝트는 진행해야하고

처음 서버 설계 과정부터 궁금한 점이 너무 많았고 검색을 해도 잘 나오지 않아서 어려움이 많았고 항상 궁금해했는데

도움을 주시면 정말 감사하겠습니다..

1. C++을 이용한 IOCP 서버와 Unity C# Client 연동을 위해서 어떠한 것을 고려하고 작업을 해야하는지가 궁금합니다.

Byte Stream 외에도 고려해야할 부분이 뭐가 있을까요?

2. Visual Studio와 Unity 연동 이라는 것이 Visual Studio에서 서버를 키고 Unity Client를 키면 접속이 되게 하면 끝인건가요?

처음 기본 환결설정에 대해서도 궁금합니다.

3. Unity는 사실상 싱글 스레드만을 사용할 수 있는 것으로 알고 있습니다.

멀티 스레드가 지원된다고는 하나 유니티 객체에 접근하는 순간 에러가 난다고 알고 있습니다 (주워 들은 내용인데 맞는지는 모르겠습니다)

그런데 멀티스레드 사용이 필요하게 될 경우 유니티에서는 단순한 연산 작업외에는 멀티스레드를 사용하면 안되는 것인가요?

코루틴 이라는 기능이 멀티쓰레드와 비슷하다고 알고 있는데 멀티스레드 기능을 코루틴이 대체해서 사용하면 되는건가요?

 

4. IOCP서버를 이용하는데 싱글스레드??

제가 C++ IOCP서버를 구현해야 하는데 이 이유에 대해 타당하게 설명을 해야하는데 저부터가 의문이 듭니다.

IOCP를 사용하긴 할건데 Unity에서 멀티쓰레드를 사용하지 못한다면 IOCP로 하는것이 의미가 있을까에 대한 의문입니다.

3번 질문과 연관이 되는 질문이긴 한데요.. 간략하게 제가 만들어야 하는 게임을 설명드리자면 RPG와 FPS 장르가 합쳐진

RPS 게임으로 다중접속이 필요합니다. FPS게임이기는 하나 반응에 민감한 전통 FPS 방식은 아니라 매 프레임마다 패킷을

전송은 하지 않아도 됩니다(TCP를 사용할 것이라는 뜻이기도 합니다) 

어느정도 많은 인원의 동시접속을 받아야 하기 때문에 IOCP를 사용하긴 할 것인데 이 부분에 대해서 궁금합니다.

5. 1000명이 접속하더라도 로비에 모여서 4명의 플레이어가 파티를 맺고 4명의 플레이어가 오픈월드 및 던전에 들어가게 됩니다.

즉, 유저 입장에서 보기에는 4명의 파티만을 위한 1개의 오픈월드가 펼쳐지는 것이고,

서버 입장에서는 그러한 오픈월드가 250개가(250x4 = 1000명) 펼쳐지게 되는 것입니다. (Ex.배틀 그라운드)

이러한 게임을 만들고자 할 때 게임 서버를 처음에 어떤식으로 설계해야할지 잘 모르겠고 막막합니다..

서버와 DB를 연동하는 방법은 간략하게 배워서 DB를 사용해야한다는 점은 알겠는데 그 외의 부분에 있어서 

어떤식으로 구현을 해야할지 궁금합니다.  

처음부터 너무 많은 질문을 적었는데 죄송합니다.

궁금한게 너무 많았는데 질문이라도 할 수 있는 상황이 생겨서 너무 길게 적게 되었네요.

질문에 대한 도움을 주시면 정말로 감사하겠습니다..!

답변 1

1

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

1. C++을 이용한 IOCP 서버와 Unity C# Client 연동을 위해서 어떠한 것을 고려하고 작업을 해야하는지가 궁금합니다. Byte Stream 외에도 고려해야할 부분이 뭐가 있을까요?

C++ IOCP 서버를 붙일 때 어려운 점은 그냥 멀티쓰레드 환경에서의 C++이 까다롭다는 부분입니다.
세션의 RefCount 관리 등도 해줘야 하고 신경쓸 일이 이만저만이 아닌데
정작 제대로 된 문서나 정보는 어디에도 없습니다.
제가 본 책중 그나마 가장 도움이 많이 된 책은 다음과 같습니다.
http://www.yes24.com/Product/Goods/362774?OzSrank=5
근데 그럼에도 저 코드를 실전에서 쓰기엔 버그가 너무 많습니다.

그런데 네트워크 쪽을 제외한 큰 틀(구조적 관점)에서 보면 C++이나 C#서버나 별반 다를 바가 없습니다.
사실 이 C# 서버 강의도 제가 자체제작한 C++ 서버 코드를 베이스로
조금씩 C#에 맞게 코드만 변경해서 만든겁니다.

2. Visual Studio와 Unity 연동 이라는 것이 Visual Studio에서 서버를 키고 Unity Client를 키면 접속이 되게 하면 끝인건가요? 처음 기본 환결설정에 대해서도 궁금합니다.

질문이 애매하네요. VS와 유니티 연동이라는게 서버 연동을 의미하시는건가요?
일반적인 의미에선 디버깅을 하기 위해 VS를 유니티에 붙인걸 말하는 것이고,
서버 연동을 의미하시는거라면 개발 단계에선 그럴 수 있지만
나중에 가서는 VS가 아니라 Release로 빌드해서 독립적으로 서버를 실행합니다.
유니티에서도 네트워크 라이브러리를 붙여서 서버랑 연동을 시켜야 하는데
본 강좌에서는 Part4에서 다룬 내용을 토대로 Part7에 유니티 쪽에 이식하는 형태로 진행됩니다.

3. Unity는 사실상 싱글 스레드만을 사용할 수 있는 것으로 알고 있습니다. 멀티 스레드가 지원된다고는 하나 유니티 객체에 접근하는 순간 에러가 난다고 알고 있습니다 (주워 들은 내용인데 맞는지는 모르겠습니다) 그런데 멀티스레드 사용이 필요하게 될 경우 유니티에서는 단순한 연산 작업외에는 멀티스레드를 사용하면 안되는 것인가요? 코루틴 이라는 기능이 멀티쓰레드와 비슷하다고 알고 있는데 멀티스레드 기능을 코루틴이 대체해서 사용하면 되는건가요?

게임 로직이 메인 쓰레드에서 돌아가야 합니다만, 백그라운드에서 다른 작업을 하는 것은 무방합니다.
다른 쓰레드에서 작업을 하더라도 메인 쓰레드에 결과물을 넘겨줄 땐 큐 등을 통해서 넘겨줘야 하는데
관련해서는 Part 7에서 자세히 나옵니다. 그리고 코루틴이랑 멀티쓰레드는 완전 다른 개념입니다.
코루틴은 싱글쓰레드이지만 일감을 나눠서 하는 개념이고, 멀티쓰레드는 말 그대로 일꾼이 여러명인 것입니다.

4. IOCP서버를 이용하는데 싱글스레드?? 제가 C++ IOCP서버를 구현해야 하는데 이 이유에 대해 타당하게 설명을 해야하는데 저부터가 의문이 듭니다. IOCP를 사용하긴 할건데 Unity에서 멀티쓰레드를 사용하지 못한다면 IOCP로 하는것이 의미가 있을까에 대한 의문입니다.

 C++이라고 성능이 좋은게 아니고 멀티쓰레드를 잘 활용해야 성능이 좋아지는겁니다.
아직 멀티쓰레드와 서버 제작 경험이 없는데 바로 C++ IOCP 프로젝트를 진행하면
크래시와 버그를 못잡고 프로젝트가 우주로 갈 확률이 99%입니다.
심지어 C++ 서버는 구글링해봐도 정보가 거의 없어서 헤딩과 노가다를 통해 만들어야 합니다.

그와는 별개로 질문의 전제가 잘못 되었습니다.
유니티에서 멀티쓰레드를 활용하지 못하는 것은 서버랑은 아무 관계가 없습니다.
서버는 유니티에서 돌아가는게 아니라 멀리 있는 서버 컴퓨터에서 돌아가기 때문에
클라 환경이 어떻든 전혀 신경을 쓰지 않습니다.
서버는 멀티쓰레드로 잘 돌아가고,
클라는 UI를 그려준다거나 하는 게임 로직을 싱글쓰레드에서 돌리는 개념이지
유니티에서 멀티쓰레드가 안된다고 서버 멀티쓰레드 불가능한 것은 아닙니다.

3번 질문과 연관이 되는 질문이긴 한데요.. 간략하게 제가 만들어야 하는 게임을 설명드리자면 RPG와 FPS 장르가 합쳐진 RPS 게임으로 다중접속이 필요합니다. FPS게임이기는 하나 반응에 민감한 전통 FPS 방식은 아니라 매 프레임마다 패킷을 전송은 하지 않아도 됩니다(TCP를 사용할 것이라는 뜻이기도 합니다) 어느정도 많은 인원의 동시접속을 받아야 하기 때문에 IOCP를 사용하긴 할 것인데 이 부분에 대해서 궁금합니다.

저였으면 C# 서버를 고려할 갈 것 같네요. 마영전 서버도 C#으로 알려져있고, 실제로 NC에서도 신규 프로젝트 MMO 서버를 C#으로 가는 경우도 많습니다. 이미 오랜기간 연구된 C++ 서버가 있는게 아니라면 처음부터 C++로 가는 것은 추천드리지 않고, 특히 유니티 연동을 해야 한다면 언어 통일하는게 많은 장점이 있습니다.

5. 1000명이 접속하더라도 로비에 모여서 4명의 플레이어가 파티를 맺고 4명의 플레이어가 오픈월드 및 던전에 들어가게 됩니다. 즉, 유저 입장에서 보기에는 4명의 파티만을 위한 1개의 오픈월드가 펼쳐지는 것이고, 서버 입장에서는 그러한 오픈월드가 250개가(250x4 = 1000명) 펼쳐지게 되는 것입니다. (Ex.배틀 그라운드) 이러한 게임을 만들고자 할 때 게임 서버를 처음에 어떤식으로 설계해야할지 잘 모르겠고 막막합니다.. 서버와 DB를 연동하는 방법은 간략하게 배워서 DB를 사용해야한다는 점은 알겠는데 그 외의 부분에 있어서 어떤식으로 구현을 해야할지 궁금합니다.  

DB 연동과 관련된 내용은 Part9에서 자세하게 설명합니다.
그리고 말씀주신 설명으로는 1000명이 같은 공간에서 서로 작용을 할 수 있다는건지가 애매한데,
만약 정말 4명끼리만 독립적으로 게임하는 형태 (디아블로2처럼)라면 방 단위로 일감을 배정하고,
그렇지 않고 1000명 단위로 게임하는 형태라면 정통적인 MMO방식으로 제작하면 되는데
역시나 매우 어려운 주제이므로 Part 9에서 다룹니다.

마지막으로 추천드리는 방식은 최대한 서버 쪽 게임 로직을
최대한 간단간단하게 싱글 쓰레드로 가시는 것을 추천드립니다.
MMO 멀티쓰레드를 활용하려면 많은 연습이 필요한데
실전에서 헤딩하면서 공부할 수준이 아닙니다.

김용진님의 프로필 이미지
김용진

작성한 질문수

질문하기