11.송신량 자동 조절 기능 (Throttling)

Edit

ProudNet은 송신량 자동 조절 기능(throttling) 기능을 갖고 있습니다. 이를 활용하면 통신 속도가 느린 환경에서도 장애를 적게 발생시키면서 통신 속도가 빠른 환경에서는 고품질의 네트워킹을 가능하게 합니다.

ProudNet에서는 최종 메시지만 송출하기 와 메시지 송신 우선순위 기능 을 제공하고 있습니다.

한편, 6.11 송신 과다 감지하기도 좋은 대안이 됩니다.

11.1메시지 송신 우선순위 기능

ProudNet에서는 메시지 송신 우선순위 기능을 제공합니다.

메시지 송신 우선순위 정책은 다음과 같습니다.

•아직 네트워크 회선으로 송출되지 못하고 송신 버퍼에 대기중인 메시지들이 있을 경우, 우선순위 1의 메시지들이 완전히 송출된 후에야 우선순위 2의 메시지들이 송출됩니다. 마찬가지로, 우선순위 3의 메시지는 우선순위 2의 메시지들이 완전히 송출된 후에야 송출되기 시작합니다.

메시지 송신 우선순위 기능은 다음과 같은 상황에서 활용될 수 있습니다.

음성 채팅

•음성 채팅은 대량의 메시징을 필요로 합니다. 하지만 음성 채팅을 위한 통신량 때문에 게임 플레이가 방해받는 것은 좋지 않습니다. 이때 게임 플레이와 관련된 메시지는 높은 우선순위로, 음성 채팅은 보다 낮은 우선순위를 두어서 문제를 개선할 수 있습니다.

실시간 컨텐츠 다운로드 게임

•빠른 설치 후 게임 시작을 위해 필요한 미디어 데이터를 게임 플레이 진행 중에 다운로드를 받는 게임을 개발할 수 있습니다. 게임 플레이에 관련된 메시지를 높은 우선순위로, 다운로드 데이터에 관련된 메시지를 낮은 우선순위로 두어서 성능을 개선할 수 있습니다.

그림 11-1실시간 컨텐츠 다운로드를 잘 활용하면 소프트웨어 배포와 설치 비용을 줄일 수 있습니다. 그러한 예로 길드워(Guild Wars)가 있습니다.

대량의 캐릭터 위치 동기화

•게임을 플레이하는 사용자들의 관심은 자기 캐릭터와 전투를 하는 상대입니다. 즉 플레이어 캐릭터와 직접적인 상호작용을 하는 캐릭터와의 위치 동기화는 관심을 받지 않고 있는 다른 캐릭터들에 비해 중요합니다. 따라서 플레이어 캐릭터와 전투를 하거나 카메라에 가까이 있는 캐릭터의 위치는 높은 우선순위로, 그밖의 메시지는 낮은 우선순위로 송신을 하면 보다 좋은 게이밍을 제공할 수 있습니다.

그림 11-2대량의 캐릭터가 등장하는 (싱글플레이) 게임 이쿠사가미

RMI를 호출할 때의 입력 파라메터 Proud.RmiContext에는 멤버 변수 Proud.RmiContext.m_priority가 있습니다. 이 변수에 메시지 송신 우선순위를 입력하면 됩니다. 메시지 송신 우선순위는 Proud.MessagePriority의 값 중 하나입니다.

Proud.RmiContext.ReliableSend, Proud.RmiContext.UnreliableSend는 전역 변수입니다. 이들의 m_priority 를 직접 수정하지 마시고, Proud.RmiContext 객체를 별도로 만들어서 사용하시기 바랍니다.

11.2최종 메시지만 송출하기

ProudNet의 최종 메시지만 송출하기 기능은 송신 queue에 아직 쌓여있지만 통신선으로 송출이 아직 되지 않은 메시지와 같은 메시지를 중복해서 보내되 최종 보내려는 메시지만 보내고 나머지 쌓여있던 메시지들을 취소하는 기능입니다.

예를 들어 온라인 게임에서 캐릭터의 위치를 타 호스트에게 보내려는 경우에 이 기능이 유용하게 쓰입니다.

아래 그림에서는 이미 시간 t가 1이었을 때의 캐릭터 위치(Pos)를 이미 통신선으로 송출한 상황입니다. 그리고 시간이 2,3일 때의 캐릭터 위치는 아직 송출되지 못하고 송신을 하려는 호스트의 메모리에 적재된 상황입니다.

이때 최신 시간(4)일 때의 위치를 보내려고 한다면, 아직 송출되지 못하고 송신되기를 대기중인 시간 2,3 시점의 캐릭터 위치를 보낼 필요는 없습니다. 이럴 때는 시간 2,3 시점의 위치 보내기를 취소하고 시간 4 시점의 위치를 보내는 것이 좋습니다. (아래 그림)

그림 11-3최종 메시지만 송출하는 기능의 예

최종 메시지만 송출하기 기능을 사용하려면 RMI를 호출할 때 입력되는 파라메터 Proud.RmiContext 의 멤버 변수 Proud.RmiContext.m_uniqueID를 0 이외의 값을 지정하면 됩니다. 이때 RMI 호출에 의해 이 메시지가 송신 queue에 쌓이기 전에 같은 Proud.RmiContext.m_uniqueID를 가진 메시지가 있으면 그것이 제거되고 이 메시지가 그 자리를 차지합니다.

흔히 쓰는 사용 예는 Proud.RmiContext.m_uniqueID에 캐릭터의 ID를 넣는 것입니다.

Proud.RmiContext.UnreliableSend는 많은 곳에서 사용되고 있기 때문에 이를 직접 사용하는 것은 비추천합니다. Proud.RmiContext 객체를 별도로 만들어서 Proud.RmiContext.m_uniqueID를 지정하는 것이 좋습니다.

다음은 Proud.RmiContext.m_uniqueID의 사용예입니다.

// 기본 unreliable send용 RmiContext 객체의 사본을 가져온다.
Proud::RmiContext rctx = Proud::RmiContext::UnreliableSend;

// m_uniqueID에 로컬 호스트가 조종하는 캐릭터의 식별자를 넣는다.
rctx.m_uniqueID = MyPlayerPetID;

// RMI를 통해 메시지를 송신한다.
C2CProxy.MyRmiFunction(PeerHostID, rctx, blahblah);