▲前のページへ
次のページへ▼

マッチングアルゴリズム(2) サンプル上のプログラム解説


【目次】
テーブルの作成
マッチングルームの探索
新規にマッチングルームを作成する
マッチングルームへ入室する


テーブルの作成

 では具体的に、サンプルで提供されているマッチングアルゴリズムを解説します。

 まず、マッチングサーバ起動直後、ライブラリ処理から、
 /server/matching/src/sample/matching/ValueMatching.cpp 内の
 ValueMatching::QueryCreateTable 関数がコールされます。

 ここでは以下の要素を持つ、マッチング用データベーステーブルvalue_rooms を生成します。
    ・ room_id - マッチングルームのID
    ・ value - マッチングルーム入室条件
  

 また上記関数は同時に /server/matching/src/sample/matching/MatchingBase.cpp 内の
 MatchingBase::QueryCreateTable 関数をコールされます。

 そこではマッチングルームテーブル rooms と、マッチングプレイヤーテーブル room_players を作成しています。

 マッチングテーブル rooms は以下の要素を持ちます。
    ・ id - マッチングルームのID(上述の room_id に対するキーとなる)
    ・ max_players - そのルームに入ることが出来る最大人数
    ・ curt_players - そのルームに現在入室している人数
    ・ created_time - そのルーム(レコード)が生成された時間
   

 一方、マッチングプレイヤーテーブル room_players は以下の要素を持ちます。
    ・ player_id - プレイヤーの識別ID
    ・ room_id - プレイヤーが所属しているルームのID( 上記 value_rooms の room_id および rooms テーブルの id とのキーとなる)
    ・ created_time - そのプレイヤー(レコード)が生成された時間
   


マッチングルームの探索

 前述のページ触れていますが、マッチングルームに入室する際に
 RPC_BTL_Matching::Recv_EnterMatchingRoom 関数がコールされます。
 その中で上述に触れたデータベーステーブルを使ってルーム入室処理を行ないます。

 はじめに、以下の ValueMatching::SearchRoom 関数内の制御を実行し、
 現在データベース上に登録されているルーム情報のうち、以下に示す条件に一致するルーム情報を抽出します。
   ・ マッチング時に設定した「マッチング値」が一致すること
   ・ マッチングルームIDが一致していること
   ・ 現在入室しているログインプレイヤー数が 1 以上 rooms.max_players 未満であること
   ・ 複数見つかった場合には、 rooms.create_time (早く作成されたルーム)順とする
 該当するルームは、下記赤枠以降の処理内でリスト searchRoomInfoList に入れられます。
   


新規にマッチングルームを作成する

 上記の結果見つかった場合、リストに登録された最初のルームに入室します。
 逆に見つからなかった場合には、RPC_BTL_Matching::Recv_EnterMatchingRoom 関数経由で
 ValueMatching.cpp 内の ValueMatching::QueryCreateRoom 関数がコールされます。

 ここでは、テーブル value_rooms にレコードを1件登録します。
   ・ room_id - ルームID ( RPC_BTL_Matching::GenerateRoomId 関数で生成したID)を登録
   ・ value - マッチング時に設定した「マッチング値」を登録
   

 また上記関数経由にて、MatchingBase.cpp 内の MatchingBase::QueryCreateRoom 関数がコールされます。
 その中身は以下のようになっており、データベーステーブル rooms に対し、以下のレコードを1件追加します。
   ・ id - ルームID ( RPC_BTL_Matching::GenerateRoomId 関数で生成したID)を登録
       createRoomInfo.room_id == 0 の場合には最後に room_id に登録した番号を登録
   ・ max_players - マッチングルームに入室できる最大人数を登録
   ・ curt_players - 生成時は常に 0 (後述の「マッチングルームへ入室」する処理にて加算される)
   ・ created_time - マッチングデータベースに登録された時間
  


マッチングルームへ入室する

 入室すべきマッチングルームの情報をデータベースに登録し終えたら、そのルームへ入室します。
 入室する処理は、RPC_BTL_Matching::Recv_EnterMatchingRoom 関数経由で
 MatchingBase.cpp 内の MatchingBase::QueryEnterRoom 関数がコールされます。

 まず以下の部分で、データベーステーブル rooms にある、roomId が一致するレコードに対し、
 curt_players、つまり現在入室しているユーザーのカウントを+1します。
  

 続けて以下の部分で、データベーステーブル rooms_player に対し、以下のレコードを追加します。
  ・ player_Id - 自身のプレイヤーID。サンプル上で入力する「キャラクタID」と同じ値。
  ・ room_Id - マッチングルームのID。
  ・ created_time - レコード追加時の時間。
  


マッチングルームの削除

 バトルサーバにプレイヤーを送り出した後の、空になったマッチングルームは
 ライブラリ処理にて、その5秒後にマッチングルームを削除しています。
 この際、MatchingBase.cpp 内の MatchingBase::QueryEnterRoom 関数がコールされます。

 まず以下の部分で、データベーステーブル rooms にある、roomId が一致するレコードに対し、
 curt_players、つまり現在入室しているユーザーのカウントを+1します。
  

 続けて以下の部分で、データベーステーブル rooms_player に対し、以下のレコードを追加します。
  ・ player_Id - 自身のプレイヤーID。サンプル上で入力する「キャラクタID」と同じ値。
  ・ room_Id - マッチングルームのID。
  ・ created_time - レコード追加時の時間。
  


▲前のページへ
次のページへ▼