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

랄프로님의 프로필 이미지

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)

안녕하세요! Thread 관련 질문 드립니다!

해결된 질문

작성

·

271

0

강의를 다 보고, 코드를 분석해보다가 궁금한 점이 생겨서 질문 드립니다.

GameLogic.cs의 Update 함수를 보면 모든 Room들을 Update 해주는 코드를 볼 수 있는데요.

GameLogic의 Update는 하나의 스레드(예제에서는 메인 스레드)에서 동작하기 때문에 결국 모든 Room의 Update 코드도  메인 스레드에서 동작할것으로 예상이 됩니다.  멀티 스레드에서 Push를 수행해도 결국에는 Flush 하는 곳에서 실제 로직이 처리되기 때문에 그 부하가 고스란히 하나의 스레드에 걸릴거라 예상을 하고 있는데요..

1. Room도 JobSerializer를 상속받으므로 Update를 다른 스레드에서 실행하도록 하면 멀티스레드 처리가 가능해 보이는데 그렇게 하면 문제가 있는 걸까요?

2. 이렇게 하나의 스레드에서 처리하게 해도 서버 한대가 몇 천명을 받아서 처리가 가능한것인가요? 그렇다면 멀티 스레드로 처리를 하면 몇 만명을 처리 할 수 있는것인가요?

혹시 언급해주신 부분이 있는데 제가 수업에서 놓친 부분이 있으면 말씀부탁 드리겠습니다!

감사합니다!

답변 2

1

랄프로님의 프로필 이미지
랄프로
질문자

아! 강의를 위해 심플하게 만들어 주신것이었군요!

언제나 좋은 답변 감사드립니다!

1

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

1. Room 마다는 서로 독립적이기에 서로 다른 쓰레드에서 처리가 가능합니다.
JobSerializer 단위 = 쓰레드 독립 처리 가능으로 이해하시면 됩니다.
예제에서는 방 1개만 테스트 했지만 나중에 가면
쓰레드를 늘려서 Room 처리를 분산시키는 것은 당연히 좋습니다. (동접을 늘리려면 무조건 해야겠죠)
심리스 MMO에서는 보통 Room이 아니라 Actor 단위 (플레이어, 몬스터 등)로 배치하는게 일반적입니다.

2. 동접은 정말 정말 케바케로 다릅니다.
스킬이 논타겟인지 아닌지에 따라도 다르고,
몬스터 개체수와 A* 판별 횟수 등과 큰 연관성이 있습니다.
게임 로직을 단일 쓰레드로 판별하는 것은 가장 기초적인 연습 방법인데
실제로 중소기업들의 고전 게임들 중에서는 이렇게 구현하는 경우도 간혹 있습니다.