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

Kosh PaE님의 프로필 이미지
Kosh PaE

작성한 질문수

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

패킷 모아 보내기

JobQueue의 Push함수 관련 질문 있습니다.

작성

·

59

0

안녕하세요. 강의 정말 잘 보고 있습니다.

 

JobQueue의 Push 함수를 호출하는 스레드가 Action까지 처리하게 되는데, 이는 Push를 호출하는 시점부터 해당 Queue에 모든 Job이 비워질 때까지 Caller가 Blocked 됩니다.

 

이를 JobQueue의 Pop과 Action.Invoke를 담당하는 스레드를 하나 만들고, 백그라운드에서 폴링하는 방식으로 만들려 합니다.

 

즉, Push를 호출한 스레드를 사용할 지, 미리 스레드를 만들어두고 폴링하는 방식으로 사용할 지의 차이인 것 같습니다.

 

두 방식 중 어느 방식이 나을지 알고 싶습니다.

 

감사합니다.

답변 1

0

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

예리한 질문이고 그걸 생각하신다면 벌써 상당히 이해도가 높은 것으로 볼 수 있습니다.
결과부터 말씀드리자면 두 방법 모두 사용됩니다.
실제로 제가 일한 대기업 프로젝트 중 하나는 전자를, 하나는 후자를 사용했었습니다.

일감을 만드는 쪽이 처리까지 담당하면
직원이 만능맨이 되니 여러모로 편리하지만,
일감이 몰릴 경우 사실상 다른 일을 못하는 문제가 생깁니다.

일감을 만드는 쪽과 처리하는 쪽을 분리하면
그런 문제는 해결되지만, 반대로 일감을 처리하는 쪽을 어떻게
적당히 배치할지가 애매해집니다.

폴링 방식을 채택한다 하셨는데 만약 Actor 모델로 가서
JobQueue를 10만개 관리해야 한다면, 쓰레드를 10만개 생성해서 배치할 수는 없고
현실적으로 쓰레드 수 20~40 사이로 유지하면서 이를 바쁘게 배분해야 합니다.
일감을 처음 밀어넣는 쪽에서 실행까지 하면 이런 '분배' 관점에서의 문제가 완화되지만,
각기 처리를 배치한다면, 이 또한 고민거리가 됩니다.
물론 폴링 방식은 단점이 많으므로 ConditionVariable이나 이벤트처럼
부분적으로 대기를 타다가 일감이 들어오면 깨어나서 처리하게 만드는게 현실적입니다.

Kosh PaE님의 프로필 이미지
Kosh PaE
질문자

자세한 답변 정말 감사합니다.

 

이 부분은 아무래도 어떤 게임을 만들게 되는지에 따라 갈리겠네요. 심리스 방식의 게임을 목표로 하고 있는데, 확실히 오브젝트마다 JobQueue를 배치하면 폴링방식은 문제가 많아질 것 같습니다.

 

참고해서 좋은 게임 만들겠습니다. 강의 잘 보고 있습니다. 감사합니다.

Kosh PaE님의 프로필 이미지
Kosh PaE

작성한 질문수

질문하기