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