DirectPlay DirectPlay C++ 샘플 Throttle   [목차열람] [주소복사] [슬롯비우기]
Throttle
 
Microsoft DirectX 9.0

Throttle


Throttle 샘플은, 송신 큐를 감시해, 네트워크 통신의 레이트를 계측 하는 방법을 나타낸다.

패스

소스 파일 : (SDK 루트) \Samples\C++\DirectPlay\Throttle

실행 가능 파일 :(SDK 루트) \Samples\C++\DirectPlay\Bin

사용자가이드

Bin 폴더의 ThrottleServer.exe 를 더블 클릭 해, Throttle Server 를 기동한다. 네트워크에 접속할 때까지 조금 기다리는 것. 서버가 접속 접수의 준비를 할 수 있으면 다이얼로그 사용자 인터페이스 (UI)가 표시된다. 서버가 가동하고 있는 동안,[Server Load] 슬라이더를 조정해, 서버의 처리 부하를 시뮬레이트 할 수 있다. 부하 설정이 큰 만큼, 서버가 유입하는 메시지를 처리하는 속도는 늦어진다.

서버를 실행한 후, Bin 폴더의 ThrottleClient.exe 를 더블 클릭 해, Throttle Client 를 기동한다. 클라이언트는, 서버가 가동하고 있는 호스트명 또는 인터넷 프로토콜 (IP) 주소의 입력을 요구한다. 포트 번호는 고정되고 있다. 서버에 클라이언트가 접속 하면, 서버는 추가된 접속을 나타내, 수신한 데이터량을 나타낸다.

  Internetwork Packet Exchange (IPX) 서비스 프로바이더를 선택했을 경우, Microsoft® DirectPlayreg; 에 주소의 검색을 실행시키려면 ,[use DPNSVR] 체크 박스를 온으로 한다.

[Client] 윈도우의 [Send Interval] 슬라이더를 조정해,IDirectPlay8Client::Send 의 호출 간격을 설정할 수 있다. 디폴트 설정에서는, 서버의 수신 버퍼는 곧바로 가득 되어, 송신하는 메시지가 클라이언트의 송신 큐에 보관 유지된다. [Regulate Outgoing Rate] 체크 박스를 온으로 하면 프로그램은 송신하는 메시지의 수를 계측 해, 큐의 사이즈를 슬라이더로 설정된 [Max Queue Size] 보다 작은 값에 유지한다.

  클라이언트 또는 서버의 컨트롤을 조정 하면,[Outgoing Data] 에 보고되는 큐 사이즈와 대기가 거기에 대응해 변경된다. 보통의 멀티 player 세션을 모델로서 복수의 클라이언트를 동시에 접속할 수 있다.

프로그래밍 정보

애플리케이션으로 송신하는 데이터의 감속 (쓰로틀링)이 필요하게 되는 이유를 이해하려면 , DirectPlay 아키텍처와 DirectPlay 서비스 프로바이더를 이해할 필요가 있다.

DPN_SP_CAPS 는 서비스 프로바이더의 능력과 설정의 일람을 보관 유지하고 있다. 이 샘플에서는,dwNumThreads,dwBuffersPerThread, 및 dwSystemBufferSize 를 채택하고 있다. 대부분의 전송 제어 프로토콜/인터넷 프로토콜 (TCP/IP) 세션중, DirectPlay 는 수신측의 시스템 큐에 곧바로 메시지를 전달한다. thread는 시스템 버퍼로부터 메시지를 취해, 메시지 핸들러를 수신할 수 있게 될 때까지 thread 자체의 메시지 버퍼에 저장 한다.

thread 버퍼가 가득 되어, 시스템 버퍼가 가득 되면 DirectPlay 는 그 이상 메시지의 전달을 허가하지 않는다. 이 경우, 리모트 컴퓨터에 충분한 스페이스가 빌 때까지, 그 타겟전용의 메시지는 로컬 송신 큐에 저장 된다.

애플리케이션에 맞추어 이러한 파라미터를 조정할 수 있지만, 보통은 버퍼 사이즈를 늘리면 게임의 지연이 커진다. 따라서, 이러한 값의 결정은 서비스 프로바이더에 맡겨네트워크 사용량의 최적화에 집중하는 것을 추천한다.

보통, 송신 큐는 네트워크 트래픽의 일시적인 피크로 마셔 필요하다. 그러나, player로부터 송신하는 메시지가 타겟의 수신 가능한 속도를 넘는 것이 계속되는 경우, 송신 큐는 계속 증가한다. 사전에 아무것도 대책을 강의(강구)하지 않으면 송신하는 메시지가 모든 큐를 통과하는데 몇 초, 혹은 몇분 걸리는 일이 있다. 이 경우, 실제로는 게임은 종료한다.

간단한 대책으로서 송신하는 메시지에 타임 아웃값을 설정하는 방법이 있다. 중요한 메시지의 경우, 타임 아웃값을 크게 해, 다른 우선 순위를 지정한다. 극단적인 상황에는, 메시지가 타겟으로 도착하기 전에 항상 타임 아웃이 되는 문제가 발생하는 일이 있다. 가능한 한 유연에 대처하려면 , 송신 큐를 감시해, 거기에 따라서 송신하는 데이터의 레이트를 조정할 필요도 있다.

이 샘플은, 현재의 송신 큐 사이즈에 근거해, 송신하는 데이터의 부분을 블록 하면 말하는 간단한 방법을 취하고 있다. 데이터의 블록은 애플리케이션이 담당하기 위해(때문에), 블록 된 데이터의 현행의 합계를 저장 해, 빈 곳이 생겼을 때에 평균 데이터 블록을 송신할 수 있다. 이와 같이 하면, 중요한 데이터는 상실하지 않고, 중요하지 않는 갱신 데이터는 선별하든가 결합해, 출력 레이트를 경감할 수 있다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP