Job Queue
지난 시간에는 GameRoom 스크립트에서 BroadCast 메서드가 foreach문을 통해 Send를 계속했을 때 나타나는 문제점에 대해서 알아보았다. 따라서 오늘은 이를 해결하기 위해서 패킷 모아보내기 라는 개념을 학습하여 코드를 보완하는 시간을 가져본다. 😁
🌼 모아보내기를 하기 위해 패킷을 저장할 위치 선정
그렇다면 패킷 모아보내기를 어디에서 처리해야할까? 이는 크게 엔진 영역과, 컨텐츠 영역으로 나뉘어져 있는데, 여기에서는 컨텐츠 영역에서 이를 진행하도록 한다.
만약 엔진 영엑에서 이를 하고자 한다면, ServerCore 프로젝트 내 Session - Send 메서드에서 할 수 있다. 기존 Send 메서드에서는 Enqueue()를 통해 바로 넣고, RegisterSend를 하는 방식인데 모아 보내기를 한다고하면 이를 어느정도 쌓아두고 일정 조건에 따라 보내는 구조로 변경한다면 그것이 바로 패킷 보내기가 되는 것이다. 그렇지만 우린 컨텐츠 영역에서 이를 진행 할 것이기에 아래에서 이를 더 알아보자.
🦾 GameRoom
List<ArraySegment<byte>> 타입을 가지는 _pendingList 변수를 선언하고, BroadCast 메서드에서 바로 Send를 해주는 것이 아닌 해당 List에 저장하는 방식으로 바꾸어 준다.
🦾 Server - Program
Server 프로젝트 Program 클래스에 위치한 Main 함수는 그 동안 아무 일도 하지 않고있었는데, 여기에서 일정 시간마다 모아둔 일감을 비울 수 있도록 처리한다.
🦾 GameRoom
다시 GameRoom으로 돌아와 Flush 메서드 기능에 대해서 제작해준다. 여기에서는 모아둔 일감들을 foreach 반복문을 통해 전송해준다.
🦾 SeverCore - Session
GameRoom에 Flush에서 전송한 List 형식(<ArraySegment<byte>>)을 받아서 처리하기 위해 Send() 메서드를 오버로딩 해주어 처리한다.
따라서 매개 변수를 List<ArraySegment<byte>>로 변경해주고 foreach 반복문을 통해 List에 있는 패킷들을 ArraySegment 형태로 보내주자. 🙂
실행 결과 😎
패킷이 정상적으로 모아 보내지는지 확인하기 위해 로그를 찍어주고, 테스트를 위해 실행을 해보면 패킷은 정상적으로 전송되는 것을 확인 할 수 있다.
하지만, 자세히보면 패킷이 불규칙적으로 전송되는 모습을 볼 수 있다. 이는 버퍼 사이즈가 문제가 되어서 이러한 문제가 발생한다고 볼 수 있다.
🐌 Buffer 사이즈 변경하기
버퍼 사이즈는 프로젝트 초반에 RecvBuffer를 작업하며 설정한 부분인데, 이를 가장 큰 사이즈인 65535로 변경해주어 크기를 증가시켜준다.
위와 같이 변경 후 다시 실행하면 정상적으로 패킷 모아보내기가 500이 찍히는 것을 볼 수 있다.
'공부 > 인프런 - Rookiss' 카테고리의 다른 글
Part 4-6-1. 유니티 연동 : 유니티 연동 #1 (1) | 2024.01.02 |
---|---|
Part 4-5-7. Job Queue : JobTimer (1) | 2023.12.28 |
Part 4-5-5. Job Queue : Job Queue #2 (0) | 2023.12.28 |
Part 4-5-4. Job Queue : Job Queue #1 (0) | 2023.12.27 |
Part 4-5-3. Job Queue : Command 패턴 (0) | 2023.12.26 |