剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術

Preview:

DESCRIPTION

2014/9/2 CEDEC2014にて講演させて頂いた 「剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術」 で使用した資料です。

Citation preview

剣と魔法のログレス いにしえの女神

株式会社 Aiming 神部 公輔 山藤 智之 西村 哲弥

~スマホ時代の MMORPG を支える技術

株式会社 Aiming から来ました神部 公輔クライアントエンジニア。元家庭用ゲーム開発者、2006年からオンラインゲームの開発に従事。

山藤 智之リードエンジニア兼サーバエンジニア。元WEB系R&D、2007年からオンラインゲームの開発に従事。

西村 哲弥クライアントエンジニア。元家庭用ゲーム開発者、2004年からオンラインゲームの開発に従事。

セッションの内容剣と魔法のログレスの紹介

開発環境について

ゲームクライアントについて

リアルタイム通信について

サーバについて

チャットシステムについて

リリースまでに起きた問題と、残された課題について

剣と魔法のログレスって?

「剣と魔法のログレス いにしえの女神」は 株式会社マーベラス様との 共同事業タイトルです。

「剣と魔法のログレス」という Flashで作成されたブラウザ型のMMORPGで

「剣と魔法のログレス いにしえの女神」の前作に あたるタイトルがあります。

スマホで本格MMORPGを実現

ランキング推移

App StoreGoogle Play

ランキング推移

App Store

剣と魔法のログレス いにしえの女神 とは?

600種類を超える 多彩な装備

大勢の仲間と共に 壮大なストーリーを堪能

剣と魔法のログレスとは?

大勢の仲間と 白熱の

リアルタイム通信戦闘

強力な コミュニティ機能を実装

累計300万ダウンロード突破

(2014年8月6日時点)

大迫力のリアルタイム通信バトル

お手軽な !シンボルエンカウント方式

簡単タップ操作ながら 大人数での戦略性の高い リアルタイム通信バトルを実現

仲間(他プレイヤー)達との連携が !勝負を左右する

充実のコミュニケーション機能楽しさ広がるプレイヤー同士のコミュニケーション

エモーション機能

グループチャット

かわいいポーズで自分をアピール

気の合う仲間と自由にグループ作成

ログレスを支える 開発環境

クライアント サーバ 内製ツールなど開発補助に利用

プログラム言語 C++11(VC++, GCC, Clang), Lua

C++11(GCC), Python

Python, C#, Perl, Ruby, Shell script

ライブラリームワーク

Cocos2d-x(2.x), Boost

Boost, Flask, Google Test

Cocos2d-x, Protocol Buffers, Adobe AIR,

ツールスなど

Visual Studio 2013, Eclipse, NDK, Xcode

VMware, MySQL, Apache, mod_wsgi

Jenkins, Gerrit, Cppcheck, Redmine

バージョン管理 Git

外部サービス Google Drive, Trello

開発環境

クライアント サーバ 内製ツールなど開発補助に利用

プログラム言語 C++11(VC++, GCC, Clang), Lua

C++11(GCC), Python

Python, C#, Perl, Ruby, Shell script

ライブラリームワーク

Cocos2d-x(2.x), Boost

Boost, Flask, Google Test

Cocos2d-x, Protocol Buffers, Adobe AIR,

ツールスなど

Visual Studio 2013, Eclipse, NDK, Xcode

VMware, MySQL, Apache, mod_wsgi

Jenkins, Gerrit, Cppcheck, Redmine

バージョン管理 Git

外部サービス Google Drive, Trello

ゲームクライアントは WindowsでVisual Studioを利用して開発

クライアント サーバ 内製ツールなど開発補助に利用

プログラム言語 C++11(VC++, GCC, Clang), Lua

C++11(GCC), Python

Python, C#, Perl, Ruby, Shell script

ライブラリームワーク

Cocos2d-x(2.x), Boost

Boost, Flask, Google Test

Cocos2d-x, Protocol Buffers, Adobe AIR,

ツールスなど

Visual Studio 2013, Eclipse, NDK, Xcode

VMware, MySQL, Apache, mod_wsgi

Jenkins, Gerrit, Cppcheck, Redmine

バージョン管理 Git

外部サービス Google Drive, Trello

サーバはVMwareなど仮想マシンで開発

クライアント サーバ 内製ツールなど開発補助に利用

プログラム言語 C++11(VC++, GCC, Clang), Lua

C++11(GCC), Python

Python, C#, Perl, Ruby, Shell script

ライブラリームワーク

Cocos2d-x(2.x), Boost

Boost, Flask, Google Test

Cocos2d-x, Protocol Buffers, Adobe AIR,

ツールスなど

Visual Studio 2013, Eclipse, NDK, Xcode

VMware, MySQL, Apache, mod_wsgi

Jenkins, Gerrit, Cppcheck, Redmine

バージョン管理 Git

外部サービス Google Drive, Trello

WebサーバにはPythonを利用

クライアント サーバ 内製ツールなど開発補助に利用

プログラム言語 C++11(VC++, GCC, Clang), Lua

C++11(GCC), Python

Python, C#, Perl, Ruby, Shell script

ライブラリームワーク

Cocos2d-x(2.x), Boost

Boost, Flask, Google Test

Cocos2d-x, Protocol Buffers, Adobe AIR,

ツールスなど

Visual Studio 2013, Eclipse, NDK, Xcode

VMware, MySQL, Apache, mod_wsgi

Jenkins, Gerrit, cppcheck, Redmine

バージョン管理 Git

外部サービス Google Drive, Trello

開発のフローなど

クライアント サーバ 内製ツールなど開発補助に利用

プログラム言語 C++11(VC++, GCC, Clang), Lua

C++11(GCC), Python

Python, C#, Perl, Ruby, Shell script

ライブラリームワーク

Cocos2d-x(2.x), Boost,

Protocol Buffers

Boost, Flask, Google Test

Cocos2d-x, Protocol Buffers, Adobe AIR,

ツールスなど

Visual Studio 2013, Eclipse, NDK, Xcode

VMware, MySQL, Apache, mod_wsgi

Jenkins, Gerrit, cppcheck, Redmine

バージョン管理 Git

外部サービス Google Drive, Trello

バージョン管理

ログレスを支える ゲームクライアント

プロジェクト要件スマートフォンで遊べるオンラインゲームをリリースしたい

リリース時期はなるべく早く!

開発開始は2012年冬

ブラウザ版ログレスを移植するのが良さそう

サーバは使いまわせても、クライアントは完全新規

新規開発・・・ とういことで

クライアントに求められた要件

TCP通信が可能である

iOS, Androidをターゲットとしたクロスプラットフォーム開発が容易である

クライアントに求められた要件

ブラウザ版ログレス用に作成された、豊富なFlashのアニメーションデータを再利用したい

大量の2Dオブジェクトが表示可能である

その上で快適なプレイを保証する必要がある

Cocos2d-xのメリット

クロスプラットフォーム開発のサポート

2Dゲームフレームワーク

ソースが公開されている

Cocos2d-xのデメリット

Objective-CベースでC++に移植されているため C++の文化と違う部分でコーディングが面倒

UIのサポートが弱い

Cocos2d-xを使用した MMORPGクライアントについて

Cocos2d-xの参照カウント方式のオブジェクトをC++のスマートポインタで扱えるようにした

std::shared_ptr

deleterをオーバーライドすることで参照カウントを無視してdeleteすることを防ぐことでCCObjectをshared_ptrで扱うことが出来る。

std::shared_ptrthisをshared_ptrとして扱えることで非同期処理の実装が非常に簡略化出来るようになった。

Cocos2d-xを使用した MMORPGクライアントについてパッチシステムの作成

AssetManagerは差分更新をサポートしていない

UIコンポーネントを追加

Flashアニメーションプレーヤの作成

内製のネットワークライブラリの組み込み

リアルタイム通信

ログレスを支える

MMORPGに必要不可欠な リアルタイム通信の要素

TCP通信

コネクション指向のプロトコルであるTCPを使用

RPC

Remote Procedure Call

TCP接続によりRPCを用いて非同期的に送受信を行う

内製ネットワークライブラリについて

TCP通信のサポート

ブラウザ版ログレスでも同じものを使用

RPCのサポート

IDLからRPC定義を生成するツールを内包

RPCスタブコードの自動生成 アイテム情報の通信

IDL(xml)の記述

生成されたRPC受信側のソース

RPCスタブコードの自動生成 アイテム情報の通信生成されたRPC送信側のソースJSONでシリアライズして送信する(実際はバイナリでシリアライズ)

ゲームアセットと ゲームデータとの違いゲームアセット

クライアントが使用

音楽や画像、アニメーションなど

ゲームデータ

サーバが使用(必要に応じてクライアントに送信する)

AIや レベルテーブル、アイテムデータなど

ゲームロジックを処理するのはどちらか?

MMO型のゲームではゲームのルールはすべてサーバーに実装される

クライアントにはほぼゲームロジック実装されていない

処理するのは、クライアントで完結するものかクラアントで分散処理可能なものくらい

ログレスを支える サーバ構成

Account

Database

back-end

Zone

Game

WebAPI

Client

ユーザーアカウントの管理

ゲームデータの保存

フロントエンド間のデータ同期

ゲームサーバ間のデータ転送

ゲームサーバ

ウェブAPIサーバ

ゲームクライアント

サーバー構成の概念図1ワールドの構成と各ノードの説明

Game

Account !

back-end

ZoneWebAPI

Client

Database

Game

Client Cl ient Cl ient

サーバー構成の概念図データの流れ

Game

Account !

back-end

ZoneWebAPI

Client

Database

Game

Client Cl ient Cl ient

サーバー構成

GAME WEB

ACCOUNT

PARTY

CHAT

STORAGE

MAP QUEST

ZONE

MASTER

MASTER

SLAVE

SLAVE

GAME GAME GAME WEB WEB WEB

ZONE

CHAT

STORAGE

MASTER

MASTER

MASTER

SLAVE

SLAVE

SLAVE

GAME WEB

ACCOUNT

PARTY

CHAT

STORAGE

MAP QUEST

ZONE

MASTER

MASTER

SLAVE

SLAVE

GAME GAME GAME WEB WEB WEB

ZONE

CHAT

STORAGE

MASTER

MASTER

MASTER

SLAVE

SLAVE

SLAVE

サーバー構成フロントエンド

GAME WEB

ACCOUNT

PARTY

CHAT

STORAGE

MAP QUEST

ZONE

MASTER

MASTER

SLAVE

SLAVE

GAME GAME GAME WEB WEB WEB

ZONE

CHAT

STORAGE

MASTER

MASTER

MASTER

SLAVE

SLAVE

SLAVE

サーバー構成バックエンド

GAME WEB

ACCOUNT

PARTY

CHAT

STORAGE

MAP QUEST

ZONE

MASTER

MASTER

SLAVE

SLAVE

GAME GAME GAME WEB WEB WEB

ZONE

CHAT

STORAGE

MASTER

MASTER

MASTER

SLAVE

SLAVE

SLAVE

サーバー構成データーベース

GAME WEB

ACCOUNT

PARTY

CHAT

STORAGE

MAP QUEST

ZONE

MASTER

MASTER

SLAVE

SLAVE

GAME GAME GAME WEB WEB WEB

ZONE

CHAT

STORAGE

MASTER

MASTER

MASTER

SLAVE

SLAVE

SLAVE

サーバー構成冗長化している箇所

GAME WEB

ACCOUNT

PARTY

CHAT

STORAGE

MAP QUEST

ZONE

MASTER

MASTER

SLAVE

SLAVE

GAME GAME GAME WEB WEB WEB

ZONE

CHAT

STORAGE

MASTER

MASTER

MASTER

SLAVE

SLAVE

SLAVE

サーバー構成冗長化していない箇所

冗長化が可能な限り行っている

やらない(やれない)ところは諦めている

データベースは垂直分割

機能毎にDBを分離

水平分割(ユーザー単位分割)は行っていない

サーバー構成

ログレスを支える チャットシステム

チャットシステムの 要件

可能な限り過去までさかのぼってログを見れる

自分がオフライン中の間に、他プレイヤーが発言したメッセージもログで見れる

グループチャットができる

チャットシステムの 要件への対応可能な限り過去までさかのぼってログを見れる

→DBに一ヶ月分程度のログを保持

自分がオフライン中の間に、他プレイヤーが発言したメッセージもログで見れる

→DBに保存されたいるのでクライアントからWebAPI経由で取得する

チャットに関するクライアントとサーバの関連図

チャットに関するクライアントとサーバの関連図こんな感じで、発言したキャラクターから吹き出しが出る

チャットに関するクライアントとサーバの関連図こんな感じで、発言したキャラクターから吹き出しが出る この間はSocket通信

チャットに関するクライアントとサーバの関連図こんな感じで、発言したキャラクターから吹き出しが出る

この部分にチャットログが残る

この間はSocket通信

チャットに関するクライアントとサーバの関連図こんな感じで、発言したキャラクターから吹き出しが出る

この部分にチャットログが残る

この間はSocket通信

こっちはHTTP通信

チャットのデータフロー

チャットのデータフロー

発言発言

吹き出し表示

チャットのデータフロー

発言

DBに書く

発言

吹き出し表示

吹き出し表示

吹き出し表示

吹き出し表示

吹き出し表示

チャットのデータフロー

発言

DBに書く

発言

吹き出し表示ログ取得

吹き出し表示

吹き出し表示

吹き出し表示

吹き出し表示

チャットのデータフロー

発言

DBに書く

発言

吹き出し表示ログ取得

ログ読み込み

吹き出し表示

ログ表示

吹き出し表示

吹き出し表示

吹き出し表示

直面した問題と その解決、今後の課題

直面した問題と、その解決3G回線でのゲームプレイ

具体的な対策というのはないが、特に大きな問題なく動いた

回線切断についてはブラウザ版ログレスのページリロード対策のノウハウがほぼそのまま使えた

サーバは資産である過去の実装をそのまま使いまわす必要があったが設計が合わない部分でサーバに高負荷問題が起きた

バックエンドをスケールアウトできるように修正して対応

今後の課題

クライアントのパフォーマンス・チューニング

マップ描画、アバター描画最適化

電池消費量の改善

クライアントの安定化

強制終了の改善

今後の課題

通信量の削減

キャリアの通信制限にかかっても遊べるのを目指したい

サーバの1ワールド毎の同時接続数の許容量を増やしたい

セッションの内容剣と魔法のログレスの紹介

開発環境について

ゲームクライアントについて

リアルタイム通信について

サーバについて

チャットシステムについて

リリースまでに起きた問題と、残された課題について

ご静聴ありがとうございました!!

Recommended