게임 프로그래머의 만담, 게임코디 2nd
+1 vote
1.8k views 만담 (287p) , 1.8k views
제가 개인적으로 봐왔던 게임서버들은 패킷을 받으면 메시지큐 같은데 동작에 해당하는 일감(함수 포인터)을 넣고

로직쓰레드(싱글)가 주기적으로 메시지큐에서 일감을 빼가지고 처리하는 방식으로 되어있는데여

 

제가 생각하기에는 네트워크 패킷을 받으면 큐에 넣지말고 자신이 직접 로직까지 처리하면

더 빠르고 멀티쓰레드 이점까지 살릴수 있을거 같은데

 

혹시 많은 서버들이 싱글쓰레드 큐에다 일을 넣는방식으로 처리하는 이유가 어떤걸까요?

락이 위험해서 그런건가요?

만담에 대한 답글을 하려면 로그인 또는 가입해야합니다.

8 answers

+1 vote
순서 바뀌어도 괜찮은거면 그냥 분산해도 되겠지만

선빵 누가 때리는데 따라 최종결과가 달라지는거면 싱글이라야해서 아닐까요 ;ㅅ;
답글 (38.9kp)
수정됨
+1 vote
드물게 만약 걔만 딱  버그가 있다면 다 죽지 않을까요?
답글 (350p)
+1 vote
(경고) 틀릴확률이 높습니다.

제가알기로는 우선순위에따라 먼저 처리해야하는거부터 처리해야되서 아닌가요
답글 (12p)
+1 vote
네트워크 워커쓰레드는 패킷만 처리하고 디스패쳐를 통해 분산 처리됩니다.

이게 젤 효율적이고 안정적이라 달리 방법이 있을까요?
답글 (877p)
+2 투표
게임에서는 대부분의 로직이 다른 로직에 영향을 끼치기 때문입니다. (정확히는 변수값)

예를 들어, A가 B를 공격한다는 패킷이 왔을 때, A가 자신에게 먼저 락을 걸고 B의 변수를 변경하기 위해 B에게도 락을 걸려고 합니다.

그런데, 동시에 B도 A를 공격하려고 했고, B도 자신에게 락을 걸고 A도 락을 걸려고 대기를 합니다.

이러면 서로 락을 걸려고 대기하는 상태가 되어 버려서, 데드락에 걸려 버리죠.

락이 안 걸리게 커맨드 큐를 만들어서 비동기로 처리하게 할 수도 있지만 그렇게 만들면 구조가 너무 복잡해지고, 만약 같은 Tick에서 바로 처리해야 하는 경우엔 답이 안 나옵니다.

애초에 변수 하나 수정할 때마다 락을 걸어야 한다면, 코딩도 복잡해집니다.

게다가 락을 건다는 것 자체도 CPU에 부하를 주기 때문에 그런 코드가 많아지면 전체적인 퍼포먼스도 별로 안 좋아지게 됩니다.

여러 가지 이유로 게임 로직의 경우 그냥 스레드 하나에서 다 처리하는 게 간편하고 안전합니다.

다른 모듈에 전혀 영향을 안 주고 혼자서만 처리가 가능한 로직이라면 딱히 상관없습니다.
답글 (3.6kp)
수정됨
+3 투표
더 빠르고 멀티쓰레드 이점까지 살릴수 있을거 같은데 => 맞습니다.

락이 위험해서 그런건가요? => 맞습니다.

참고로 프라우드넷의 경우, 상기 두 케이스 말고도 다른 케이스들을 위한 조합을 지원합니다.

* 네트워크 패킷을 받거나 보내는 스레드(네트웍 스레드)와 로직을 처리하는 스레드(유저 스레드)를 1~n개 스레드로 합치기

* 네트웍 스레드 1개~n개와 유저 스레드를 1개~m개로 나누기

그리고 이런 설정은 파라메터 몇개로 간단히 끝나게 만들어져 있습니다. -_-v
답글 (412p)
+1 vote
로직 스레드를 나눌 수도 있긴한데,

위 답변들의 이유들로

대부분 상용화된 MMO 게임들은 차라리 멀티 프로세스를 선택하게 됩니다!
답글 (5.4kp)
그래서 텔레포트에 연출을 넣기 시작한거죠!!!
아하 패킷을 받는 프로세스랑 처리하는 프로세스를 분리한다는거죠?
+2 투표
씽글쓰레드인 경우. 락을 사용 할 필요가 없다는게 가장 큰 장점 아닐까 합니다.
더불어 멀티 쓰레드에서 발생하는 문제를 피하는 코딩을 안해도 된다는 뜻도 되지요

마치 집에 혼자 살면 샤워를 하고, 축축한 상태로 옷을 입고 나오지 않아도 된다는 자유를 얻을 수 있는것과 비슷하달 까요 ?
한여름에 개뜨거운물로 샤워하고 거실에서 에어콘 풀로 돌려서 선풍기로 건조 시켜도 아무 문제 없습니다.
답글 (12kp)
씽글 라이프가 편한 이유 ㅎㅎ

게임 프로그래머의 만담 커뮤니티, 게임코디 입니다

온종일 코드와 씨름하는 우리들의 외로움을 삭이고자 합니다