Microsoft DirectX 8.0 (C++)

プレーヤー コンテキスト データの管理

プレーヤー コンテキスト値はごく簡単に取り扱えるが、注意する点がいくつかある。

プレーヤー コンテキスト値は、メッセージが届くたびにアクセスできると思われる有効なメモリ アドレスを、簡単に取得する手段である。ただし、アプリケーション内の異なった部分から、データのアクセスを同時に行わないように注意する必要がある。Microsoft® DirectPlay® では、特定のプレーヤーに関連するメッセージが逐次化されている。このため、同じプレーヤーからのメッセージを 2 つ同時に取り扱う状況は発生しない。データ構造体は、コールバック メッセージ ハンドラからアクセスする限り、安全にアクセスできる。ただし、多くのアプリケーションでは、メッセージ ハンドラ以外からプレーヤー データにアクセスする必要がある。

コールバック メッセージ ハンドラ以外からデータにアクセスするアプリケーションでは、構造体をロックするある種のグローバルなメカニズムを用意して、同時アクセスを避けなければならない。開発の初期にはそのようなロック メカニズムが必要ないとしても、必要になる場合を想定して初めから組み込んでおいた方がよい。プレーヤー コンテキスト値が配列のインデックスである場合は、その配列を安全に読み取り、更新することにも注意しなければならない。

プレーヤーのデータ構造体の割り当てを誤って早く解除しないこと。プレーヤーがゲームを抜けるときは、通常、プレーヤーのデータ構造体の割り当てを解除し、関連するメモリを解放する必要がある。ただし、DPN_MSGID_DESTROY_PLAYER メッセージを受け取ってすぐ構造体の割り当てを解放する場合には注意が必要である。コールバック メッセージ ハンドラ以外から構造体にアクセスするアプリケーションでは、メッセージが届いたときに、そのデータがまだ使用されている可能性がある。メッセージが届いたからといって、すぐに構造体の割り当てを解除すると、アプリケーションのほかの部分が失敗することがある。

誤って早く構造体の割り当てを解除することを避けるには、アプリケーションレベルのロック メカニズムを用意するだけでなく、ある種の参照カウントを実装するとよい。構造体を作成するとき、および構造体を使用するたびに、参照カウントをインクリメントする。DPN_MSGID_DESTROY_PLAYER メッセージ ハンドラを含め、構造体を使い終わるたびに、参照カウントをデクリメントする。参照カウントが 0 でない限り、構造体はアプリケーションのどこかからアクセスされている。参照カウントが 0 に戻るまで、構造体の割り当てを解除しないこと。