モノビットリアルタイム通信エンジン
とCocos2d-xの組み合わせ事例
安田 京人
株式会社
■モノビット社&講演者紹介
・株式会社モノビット
2005年よりネットワークゲームの開発と運営を行っている
ゲーム制作会社です。
2013年よりミドルウェア事業を開始。『モノビットエンジン』の
ブランドでリアルタイム通信エンジンやMOエンジンの販売を
行っています。
・講演者紹介
<安田 京人(Kyoto Yasuda)>
株式会社モノビットミドルウェア事業部部長
・IT系企業でSE兼PGとして2年勤務。
・6年間大手デベロッパーでコンシューマーゲームプログラマーとしてアク
ションゲームを中心に様々なジャンルのゲーム開発に携わる。
・オンラインゲームの知識を身に付けるため株式会社モノビットに入社。
現在はモノビットエンジンの開発指揮とエヴァンジェリストとしても活動。
1
モノビットリアルタイム通信エンジンと
Cocos2d-xの組み合わせ事例
1.1. モノビットリアルタイム通信エンジン概要
1.2. Cocos2d-xでのリアルタイム通信処理実装方法
2
■本日のアジェンダ
■モノビットエンジンとは?
モノビット社が提供するネットワークミドルウェア製品です。
・リアルタイム通信エンジン
⇒ 本格的オンラインゲームを作成できる
通信ミドルウェア。
Cocos2d-x版、
Unity版を無料公開中。
本日は
モノビットリアルタイム通信エンジンのCocos2d-xにおける
実例と、リアルタイム通信処理を自作する場合の注意点等をお話し
いたします。
3
■リアルタイム通信エンジンについて
モノビットリアルタイム通信エンジンとは、
本格的なオンラインゲーム制作を前提に設計・開発された
高機能なリアルタイム通信ミドルウェアです。
シンプルなターン制のゲームから、
高速レスポンスが求められるマルチプレイのアクションゲーム
大規模なサーバシステムが必要なMMORPGまで
あらゆるジャンルのオンラインゲームを
スムーズに開発することができます。
4
■リアルタイム通信エンジンの採用実績
そのほか、
MMORPGやRTS、MOBAなどが現在開発中です!
5
※Cocos2d-X版での採用実績
■リアルタイム通信エンジンの採用実績
そのほか、
MMORPGやRTS、MOBAなどが現在開発中です
!
6
■リアルタイム通信エンジンについて
7
■リアルタイム通信エンジン
ツールにより自動生成された通信制御プログラム
クライアントプログラム お客様が
開発する部分
リアルタイム通信エンジン
が提供する部分
クライアントSDK
Webサーバ連携モジュール
Virtual Network機能 通信コード
自動生成ツール
KVS連携モジュール
独自プロトコル
 各プラットフォームごと
のSDKにより、RPC通信
コードを自動生成
 高速PRC自動生成ツール
により通信処理を
自動生成
 暗号化、および圧縮も
自動的に実施
 C++、C#言語による
ゲームサーバコードの
記述が可能
 マッチングサーバを
完全に独自カスタマイズ
可能
 安価な
Linuxサーバで動作
 ほぼ全てのクラウドや
オンプレミス環境に
インストール可能
 コンソールゲーム機から
ゲームエンジンまで、
豊富なプラットフォーム
に対応
 プロトコルは、TCP、
UDP、Reliable UDPに
対応
 マッチングやバトルなど
さまざまな
サンプルプログラムを
ソースコードごと提供
 PHPやRubyなどWeb系
サーバとの
データ連係機能搭載
 過去のWeb系ゲーム
サーバ資産が利用可能
リアルタイム通信エンジン
コアモジュール
エリアサーバ バトルサーバ データサーバ
チャットサーバ マッチングサーバ
サーバロジック実装インターフェース
CentOS系Linux系サーバで動作
ゲームサーバ構成例
8
9
1,リアルタイム通信処理を自分で作成する場合
→まずはこちら。
2,モノビットリアルタイム通信エンジンを使用する場合
■Cocos2d-xでのリアルタイム通信処理実装
方法
10
<リアルタイム通信処理を自分で作成する場合>
・Socketプログラミング
慣れていれば問題ないが、
TCP/IPやUDPについての知識がある程度必要になるのに加え、
イベント制御周りの実装が大変。
→libuvやlibev等のイベント制御ライブラリを有効活用する。
※node.jsの基盤となっているライブラリです。
・マルチプラットフォーム対応
Cocos2d-xの場合、iOS、Androidそれぞれネイティブで、
Socket通信を実装する必要がある。
iOS、Android(NDKでC++)共にベースはUNIX系ではあるが、
微妙にSocket関連のAPIの仕様が違う。
Cocos2d-xで開発する際のメリットでもある、
作業効率の観点からWindowsで開発する事も多いが、
それをするためにはWinsock2対応が必要になる。
→工数をかけてそれぞれのプラットフォームに対応する。
■Cocos2d-xでのリアルタイム通信処理実装
方法
11
<リアルタイム通信処理を自分で作成する場合>
・パケット関連の定義
どのようにパケットを取り扱うかを選定する。
構造体等のデータ型をやりとりするだけなら簡単ではあるが、
定義を変更するたびにソースファイルを書き換える手間が発生。
→一つの手法として、ソケット通信で送り合うデータは全て文字列型とし、
文字列の中身はJSON形式等にすれば管理も比較的容易。
・サーバサイド
今回はクライアントサイドに焦点を当てた話なので、
詳細は割愛するが、
多くの場合、Linuxサーバで運用するケースが殆ど。
Linux側のコーディング、C++で作成する場合はBSDソケットに準拠した
プログラミングが必要になる。
プロセス間通信の考え方やディスクリプタの扱い等Linuxでは気を付けない
といけない事が一杯。
その他リアルタイム通信サーバの冗長化も意識し、
運用を考慮したサーバ設計が必要になる。
→ここばかりは学習コストがかかってしまうのは仕方がない…。
■Cocos2d-xでのリアルタイム通信処理実装
方法
12
1,リアルタイム通信処理を自分で作成する場合
2,モノビットリアルタイム通信エンジンを使用する場合
→次はこちら。モノビットリアルタイム通信エンジンでは?
■Cocos2d-xでのリアルタイム通信処理実装
方法
13
<モノビットリアルタイム通信エンジンを使用する場合>
・Socketプログラミング
ソケット通信周りはライブラリ内部に隠ぺいされているので、
特に意識する必要がない。
・マルチプラットフォーム対応
iOS、Androidについてはネイティブのライブラリを用意してあるので、
指定の場所に配置するだけでOK。
Windows向けのライブラリも同様。
Windows環境で開発をすすめる事が可能。
・パケット関連の定義
Rubyで記述する形式のRPC自動生成ツールが付属。
クライアント/サーバ間でやり取りするパケット定義を決めて、
コンバータで出力したソースをプロジェクトに組み込むだけで良い。
■Cocos2d-xでのリアルタイム通信処理実装
方法
14
<モノビットリアルタイム通信エンジンを使用する場合>
・サーバサイド
多少はLinuxの知識が必要なものの、
サーバ側SDKとサーバプログラムのスケルトンを用意しているの
で、C++を理解していればクライアントプログラマーでも、
サーバ側プログラミングが可能。
負荷分散や冗長化の仕組みはモノビットエンジンのサーバ群が
担保する。
次はモノビットエンジンをCocos2d-xで使用する場合の具体的なコー
ドと実際のサーバ構成例をご紹介します。
■Cocos2d-xでのリアルタイム通信処理実装
方法
15
■Cocos2d-xでのリアルタイム通信
→モノビットリアルタイム通信エンジンSDKを組み込むだけ。
・初期化処理
ここで接続先の設定を行っているが、
ハードコーディングするのではなく、
上述のWebサーバに接続先リストを保持するようにし、
そこから取得したIPアドレスやポートを設定するようにする。
→WEBサーバ側に接続先リストを持つ事で、
サーバ構成を変更した場合もソースファイルをデプロイするだけ。
クライアントは常にWebサーバから取得した情報を正とする。
■Cocos2d-xでのリアルタイム通信処理実装
方法
16
・更新処理
■Cocos2d-xでのリアルタイム通信処理実装
方法
17
・通信のやり取りはRPC(Remote Procedure Call)
1. どういった情報をサーバーとやり取りするか考える。
2. やり取りする情報を構造体として定義する。
3. やり取りするための関数(メソッド)を定義する。
4. 受信側の関数(メソッド)の内部処理を実装する。
5. 送信側の関数(メソッド)の呼び出しを実装する。
・定義ファイルの記述
■Cocos2d-xでのリアルタイム通信処理実装
方法
18
・自動生成されたクライアント側(C++)のソース
Cocos2d-x側に出力されたコードを、
GameSceneを継承したクラスのUpdate処理等に入れる。
開発のサイクルとしては、RPCを定義して自動生成されたコードを、
Cocos2d-xのプロジェクトフォルダに入れて、
呼び出したいタイミングでコールする。
送信処理
受信処理
受信したデータ
をどう扱うのか
記述する
■Cocos2d-xでのリアルタイム通信処理実装
方法
19
<モノビットリアルタイム通信エンジンを使用する場合>
モノビットエンジンを利用すると、
HTTP通信とリアルタイム通信を組み合わせたようなサーバ構成が
実現できます。
また、リアルタイム通信エンジンを用いて作成したサーバから、
ウェブサーバを介して情報を取得したり等も可能です。
実際にクライアントをCocos2d-xで作成したタイトルのサーバ側の
構成の実例をご紹介します。
■Cocos2d-xでのリアルタイム通信処理実装
方法
20
クライアントアプリは
Webサーバを介して
バトルサーバの接続先を
取得する
インスタンスバトルへの参加
のたびに、
いずれかのBattleサーバに
直接接続。
バトルが終了すると切断。
WEB SERVE
RS
(EC2)
Cas
he
Datab
ase
Backend Game(Lobby
)Servers
Backend Game(Other
s)Servers
Frontend Servers
Frontend (Battle)S
ervers
Private
Section
Global S
ection
Bat
tle
Bat
tle
Ranki
ng
Cha
t
Cha
t
Ranki
ng
Bat
tle
Bat
tle
Matching
Lob
by
Lob
by
Lob
by
Lob
by
Sync
Matching Matching Matching
■Cocos2d-xでのリアルタイム通信処理実装
方法
21
<モノビットリアルタイム通信エンジンを利用する場合のメリット>
・RelayServer
クライアントからの通信の入り口を
一つにまとめるサーバプロセスを利用する事が出来ます。
グローバルIPアドレスを節約したい場合に非常に有効です。
クライアントはこのサーバにコネクションを張る事で、
そこを介してバックエンドに設置したエリアサーバや、
ロビーサーバといったリアルタイム通信サーバに通信を行います。
エリア間の移動は全てサーバ間通信で賄えるので、
対象エリアサーバに対してコネクションを張り直すといった事もしなくても
良いのが利点です。
■Cocos2d-xでのリアルタイム通信処理実装
方法
22
<モノビットリアルタイム通信エンジンを利用する場合のメリット>
・VirtualNetwork
1タスクに対し、一意の仮想アドレスを発行し、クライアント/サーバ間や、
サーバ間の通信の際にそこを宛先として、通信する事が可能です。
動的なサーバ構成の変更に対応します。
こういった大規模通信の基盤となるシステムをお使いいただけます。
■Cocos2d-xでのリアルタイム通信処理実装
方法
23
Cocos2d-xと組み合わせるのは意外に簡単。
モノビットリアルタイム通信エンジンは、
Cocos2d-xのスプライト同期のサンプルをご提供しています。
リアルタイム通信処理を自分で作成するにしても、イメージは
掴めると思いますので是非体験してみてください。
モノビットリアルタイム通信エンジンはCocos2d-xに
限らずUnityにも対応しています。
また、Unreal Engine4への対応も現在進んでいます。
■まとめ
24
ご静聴ありがとうございました!
・お気軽にお問合せください
contact@monobit.co.jp
モノビットリアルタイム通信のダウンロードはこちらから
http://www.monobitengine.com/dl_rtc.html
Facebook モノビットエンジン助け合い所
https://www.facebook.com/groups/monobitengineusers/
Twitter
https://twitter.com/monobit_engine
来年も定期的にセミナーを開催していきます!

DeNA様「通信エンジン」勉強会資料 20151217