• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

Room마다 Thread를 만들기

24.01.18 02:31 작성 24.01.18 11:13 수정 조회수 200

0

안녕하세요 루키스님 덕분에 서버개발자로 취업하였습니다.

루키스님의 강의를 체화하기 위해서 간간히 코드를 보면서 잊어먹을랑 말랑한 것들을 다시 강의로 듣곤 합니다

그러다가 아래 코드를 보면서 문득 의문이 들었는데요.

while(true)
{
  GameLogicTask.Instance.Update()
}

게임 실행 시 위 로직을 타면서 메인쓰레드 하나서 모든 Room의 Update를 담당하고 있는데

Room에 유저수가 많아지게 되면 메인 쓰레드에 점점 부하가 더 많아지는게 아닌가해서 질문을 드립니다.

메인쓰레드 부하가 많아지면 컨텍스트 스위칭이 생겨도 Room마다 Thread를 생성하여

남은 자원을 Update가 바쁘게 돌아가는 Room쪽에 쓰레드를 조금 더 할당해 주어도 될까요?

(밑에 질문에 답변해 주셨네요 ^^; Room마다 쓰레드를 더 만들겠습니다.)

 

심리스 월드에서 Actor마다 JobSerializer를 할당하는 방법을 쓰면,

쓰레드를 너무 많이 만들게 될것 같은데 컨텍스트 스위칭 외에 또 생기는 성능적인 사이드 이펙트를 뭘 또 고려하면 좋을까요?

Actor마다 JobSerializer를 쓴다고 하면 Actor단일로서는 lock을 걸지 않아도 되지만

서로 상호작용이 일어나는 상황에서는 어쩔수 없이 lock을 걸어줄수 밖에 없을 것 같은데, 그러면 결국은 JobSerializer를 쓰지 않아도 되지 않나 부족한 지식으로 어렴풋이 생각이 듭니다.

또한 JobSerializer를 Flush 하기 위해선 Actor마다 while(true) 루프를 돌면서 계속해서 잤다가 깼다가 확인 하는 과정과 컨텍스트 스위칭비용이 점점 더 늘어날 것 같은데 이런 비용을 감안하면서 사용하는 것인지요. 아니면 딱히 신경쓰지 않아도 될만한 부하인지 궁금합니다.

답변 2

·

답변을 작성해보세요.

1

쓰레드를 늘리는 것은 맞지만,
방이 100개라고 쓰레드를 100개를 만들면 곤란합니다.
기본적으로 적정 쓰레드 개수는 CPU 코어 * 1~1.5 정도이고, 그 이상은 손해에 가깝습니다.
배분 관련 내용은 C++ 서버 내용에서 잠시 다뤘습니다.
또한 메인 쓰레드에서 게임로직만 담당하게 해도, 동접 2000 정도의 MMO를 돌릴 수 있습니다.
중소기업에서 만든 MMO는 실제로 그렇게 하는 경우가 꽤 있는데
다만 메인 쓰레드에서 너무 괴랄한 길찾기나 AI를 돌리지 않으면 됩니다.

0

흑연님의 프로필

흑연

질문자

2024.01.19

감사합니다.