DirectPlay DirectPlay 의 고도의 주제 player 문맥값의 사용법   [목차열람] [주소복사] [슬롯비우기]
player 문맥값의 사용법
 
Microsoft DirectX 9.0

player 문맥값의 사용법


많은 애플리케이션에서는, 각각의 player에 어떠한 데이터를 관련짓고 싶은 것이 있다. 한편, player에 관련하는 메시지를 수신했을 때에는, 그 데이터에 재빠르게 액세스 하기 위해서 어떤 종류의 수단이 필요하게 된다. player 문맥값의 목적은, player 데이터에의 효율적인 액세스 수단을 제공하는 것에 있다.

  player 문맥값을 사용하는 것은,IDirectPlay8Peer 인터페이스 및 IDirectPlay8Server 인터페이스 뿐이다. IDirectPlay8Client 인터페이스에 player 문맥값은 필요없다. 이것은, 클라이언트가 이 인터페이스를 서버와의 통신에만 사용해, 다른 클라이언트와의 통신에는 사용하지 않기 때문이다.

player 문맥값의 정의

player 문맥값을 사용하려면 , 사용중의 시스템에, 각각의 player에 대응하는 데이터 블록을, 보통은 구조체의 형태로 보관 유지할 필요가 있다. player 문맥값은, 보통, 각종 player의 데이터 블록을 가리키는 포인터 배열의 인덱스이다. player로부터 메시지를 받아들였을 때에, 테이블내의 player 식별자 (ID)를 검색하는 등, 시간이 걸리는 처리를 하지 않고 끝난다. player 문맥값에 저장 된 인덱스를 사용하면 필요한 포인터를 재빠르게 취득할 수 있다.

player 문맥값은, 게임에 player가 추가된 것을 통지하는 DPN_MSGID_CREATE_PLAYER 메시지를 처리할 경우에 정의한다. 호스트도,DPN_MSGID_INDICATE_CONNECT 메시지를 처리할 경우에, player 문맥값을 정의할 수 있다. 그 이후의 DPN_MSGID_CREATE_PLAYER 메시지에는, 그 player 문맥값이 설정된다. 호스트는, 그 메시지를 처리할 경우에, player 문맥값을 변경할 수 있다. player 문맥값을 생성 하려면 :

Microsoft® DirectPlay® 에서는, 데이터를 취득해 구조체에 대입할 방법이 지정되지 않다. 그 문제는, 각각의 게임에서 독자적인 방법에 의해 처리하는 것.

  player 문맥값을 정의할 수 있는 장소는,DPN_MSGID_CREATE_PLAYER 또는 DPN_MSGID_INDICATE_CONNECT 메시지 핸들러내뿐이다. DPN_MSGID_CREATE_PLAYER 메시지 핸들러가 돌아오면 player 문맥값이 설정된다. 그 player에 관련하는 이후의 메시지의 player 문맥값은,DPN_MSGID_CREATE_PLAYER 메시지 핸들러가 설정한 값과 동일해진다. 관련하는 데이터 구조체의 내용은 수정할 수 있지만, player 문맥값자체는 변경할 수 없다.

player 문맥 데이터의 관리

player 문맥값은 매우 간단하게 취급할 수 있지만, 주의하는 점이 몇개인가 있다.

player 문맥값은, 메시지가 도착할 때마다 액세스 할 수 있다고 생각되는 유효한 메모리 주소를, 간단하게 얻어온다 수단이다. 다만, 애플리케이션내가 다른 부분으로부터, 데이터의 액세스를 동시에 실시하지 않게 주의할 필요가 있다. DirectPlay 는, 특정의 player에 관련하는 메시지를 계속해 처리한다. 이것에 의해, 같은 player로부터의 2 개의 메시지를 동시에 처리하는 것은 없어진다. 데이터 구조체는, 콜백 메시지 핸들러로부터 액세스 하는 한, 안전하게 액세스 할 수 있다. 다만, 많은 애플리케이션에서는, 메시지 핸들러 이외로부터 player 데이터에 액세스 할 필요가 있다.

콜백 메시지 핸들러 이외로부터 데이터에 액세스 하는 애플리케이션에서는, 구조체를 잠그는 어떤 종류의 글로벌인 메카니즘을 준비해, 동시 액세스를 피해야 한다. 개발의 초기에는 그러한 잠금 메카니즘이 필요없다고 해도, 필요하게 되는 경우를 상정해 처음부터 짜넣어 두는 것이 좋다. player 문맥값이 배열의 인덱스인 경우는, 그 배열을 안전하게 읽기, 갱신하게도 주의해야 한다.

player의 데이터 구조체의 할당을 잘못해 빨리 해제하지 않는 것. player가 게임을 빠질 때는, 보통, player의 데이터 구조체의 할당을 해제해, 관련하는 메모리를 릴리즈 할 필요가 있다. 그러나,DPN_MSGID_DESTROY_PLAYER 메시지를 받아들이자 마자 구조체의 할당을 해제하는 것에는, 주의가 필요하다. 콜백 메시지 핸들러 이외로부터 구조체에 액세스 하는 애플리케이션에서는, 메시지가 도착했을 때에, 그 데이터가 아직 사용되고 있을 가능성이 있다. 메시지를 받아들이자 마자 구조체의 할당을 해제 하면, 애플리케이션의 다른 부분이 실패하는 일이 있다.

잘못해 빨리 구조체의 할당을 해제하는 것을 피하려면 , 애플리케이션 레벨의 잠금 메카니즘을 준비할 뿐만 아니라, 어떤 종류의 참조 카운트를 처리 해야 한다. 구조체를 생성 할 때 및 구조체를 사용할 때마다, 참조 카운트를 인크리먼트(increment) 한다. DPN_MSGID_DESTROY_PLAYER 메시지 핸들러를 포함해 구조체의 사용을 종료할 때마다, 참조 카운트를 감소 한다. 참조 카운트가 0 이 아닌 한, 구조체는 애플리케이션의 어딘가로부터 액세스 되고 있다. 참조 카운트가 0 에 돌아올 때까지, 구조체의 할당을 해제하지 않는 것.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP