DirectPlayを使おう。
ここでは、DirectPlayに関して調べた結果や使い方について書いていきます。
他にも解説ページはいろいろとありますが、自分でまとめる事でより理解が深まるという意味もこめて、自分なりの言葉で伝えていこうと思います。
第1回 DirectPlayってなんなんでしょう。
DirectPlay。それはDirectXの中に含まれる機能の1つ。通信に関する機能をまとめたAPIの集まりです。一般的にはwinsockを使って書くのですが、せっかくゲーム用に作成されたものを使わない手はありません。と、いう事で私も使ってみる事にしました。
私が使い始めたのはDirectPlay8です。ここではそれ以降の話となりますのでご注意ください。
詳しい話しはわかりませんが、DirectPlay8はそれ以前と違い、新たに書き直された新しいものだそうです。大規模ネットワークゲーム用に設計しなおしたとか。マイクロソフトの市販ゲームでいくつか使われているそうですが、他のメーカーさんはどのくらい使っているのでしょうね。それほど便利なものであれば、今後増えていくかと思います。
他のDirectXの機能と比べてマイナーというか、使っている人があまりいないようなイメージが強く、取り扱っている個人ページもほとんど見かけません。と、いう事で、ここではサーバー・クライアントモデルの通信に関していろいろと書いていきます。調査の結果に関しては、トップページからネットワークRPGについてのページへリンクがありますので、そちらを見てください。けっこういい感じで動いております。
ここで、いろいろわかったDirectPlayについて気づいた点を書いてきます。
●UDPで通信する。
人から言われるまで気づかずに使っていました。TCP/IPの設定で使っていても実際に使うのはUDPのみなんです。TCPを使わないメリットはなんでしょう?考えてみました。
・セッションを張らない
・TCPより高速
・信頼性が無い(パケットを取りこぼす)
ぱっと気づくのはこんな感じでした。1つ目の「セッションを張らない」ですが、TCPの場合は10人繋がればそれだけセッションを張ります。しかしUDPにはその概念が無いので何人相手でも接続はしません。けれど内部的にはちゃんと繋がっていると認識しています。不思議ですがよくできているものですね。2つ目の「TCPより高速」はそのままですね。3つ目の「信頼性が無い」という性質から伝送速度が速いです。ただし、再送を行うので相手によってはTCPより遅いなんていう事があるのかもしれません。
●コールバック関数を用意すれば全ての通知がそこにやってくる。
これはウィンドウのプロシージャと同じ考え方ですね。汎用的なものを考えると一番しっくりくる作りかもしれませんね。このおかげで簡単に利用する事ができます。
●リークする?
まだ断言できませんが、ハンドル&メモリリークしているような気がしています。使い方の問題という可能性もあるので、今後も調べていく必要があります。単に送信キューをためすぎているのかもしれませんが、タイムアウトしても残っているような・・・
ひとまず、こんな感じです。今後実際の使い方などを書いていきますので、たまに見てもらえると幸いです。あとは本を買うなり、SDKのマニュアルを穴が開くほど何度も読み返す事が身に付ける第一歩かもしれませんね。私も知らない事はまだまだたくさんあります。では、また次回。