25
探検ドリランドにおける ギルドバトル開発体制と その裏側について CEDEC2013 REPORT

Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

Embed Size (px)

Citation preview

Page 1: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

探検ドリランドにおける

ギルドバトル開発体制と

その裏側について

CEDEC2013 REPORT

Page 2: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

Speaker

グリー株式会社開発本部エンジニア

田沼 修平

Page 3: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

探検ドリランドについて

● GREE Platform 上で遊べるカードゲーム● 多人数参加型のイベントの基盤としてギルドを

導入● 20人 x 20人 で 30分

Page 4: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

ギルドバトルの開発体制

● 4週間で新イベントを作ろう● 全10名のイベント専門ユニット

○ プロデューサー○ ゲームデザイナ x 3○ アートディレクター○ サーバエンジニア x 3○ UIエンジニア○ テクニカルアート

Page 5: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

機能要件

● 最大20人参加● ギルド内のコミュニケーション● ギルド間のマッチング処理● ギルド間のバトル機能● バトル画面(LWF)● ランキング集計● スクラッチから4週間

Page 6: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

スケジュール

● ギルド機能開発:2週間● ギルドバトル開発:2.5週間● バトルLWF開発:3週間

Page 7: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

Dev Tools

● Github Enterprise○ v3 API で通知しまくり

● Jenkins○ CI & LWF の自動ビルド

● Atlassian JIRA○ Issue Tracking○ 結構カスタマイズしている

● Vagrant○ 新しいアーキテクチャ等の実験向け

● LWF & TypeScript○ HTML5ゲームを楽して作る

Page 8: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

相談することから始めよう

● チーム全体でミッションとゴールを理解し合う● 早期にお互いの信頼を築く● 常に意思決定。駄目だったらすぐリカバリ

Page 9: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

計測することから始めよう(負荷見積もり)

● MAU, DAU からイベントへの参加者数を推定● ギルドバトルで扱うデータ量の計算

○ 1ギルド最大20人 x 2ギルド○ 1ユーザカード情報15枚 x 参加者数○ その他諸々

Page 10: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

メンバーが受け入れられる現実的なプロ

ジェクト運用を採用

● 強烈なVelocityを生むために個人裁量を大きく● 自由の代わりに責任を明確に● 誰のための開発なのか?を意識

Page 11: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

ギルドバトルの説明

● お客様がゲームを遊ぶまでのおさらい○ 携帯電話からパケット交換機を通してHTTP通信を行う

■ Infrastructure Layer / Application Layer■ PHPで処理して結果を返す

○ 最大40人参加(1ギルド最大20人)■ デッキ等の総合値により前衛、後衛の役割が決定す

る○ 定刻(12時、18時、21時)に開始

■ 開催時間は30分○ 相手に攻撃して得られるポイントで勝敗が決定

Page 12: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

ギルドバトルの説明

● ゲームのサイクル○ 通常の探検

■ ダンジョン探検 => キングモンスター遭遇 => 協力して倒す

○ ギルドバトル開始■ 通常の探検 + 相手ギルドに攻撃、ギルドモンスター

に攻撃■ APがなくなると相手へ攻撃したりHPの回復ができな

くなってしまう■ キングモンスター討伐でAP回復アイテムが一定確

率でドロップ

Page 13: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

ギルドバトルの説明

● APを消費して相手に攻撃。ダメージ量に応じてDP獲得

● より多くのDPを獲得したギルドの勝ち● 一定の条件を満たすとギルドモンスター出現

○ 倒すとダメージに応じてボーナスアイテム獲得○ ギルドモンスター登場後は相手より多くダメージをたたき

出すことが重要○ ボーナスアイテムはバッチで自動的に登録

● メンバーと戦略を考えて戦うのが勝利のカギ○ コンボやギルド技等も重要なファクター

Page 14: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

LWF

● Lightweight SWF● GREEが提供するOSSのライブラリ● publish swf => convert swf to lwf format =>

rendering● フラッシュでいい感じのアニメーションを作っても

らって publish for lwf● LWFを利用することでゲームを作ることに注力

できる● HTML5でのLWF再生の流れ

○ LWF binary data を DLし、必要リソースを順次取得

Page 15: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

LWF

● ギルドバトルでのLWF○ 外部LWF、Resource の Load○ 初期状態(一定間隔ごとに通信)○ 攻撃APIのRequest, Response から適切なAnimation

を表示

● LWFの便利機能○ ImageMap

■ パラメータで画像の変更が簡単に指定できる■ バトル開催時間に応じて背景を変更する等

● LWFはゲーム制作で楽をするツール○ LWFを使うことで短期間でゲームのUI等を作ることが可

能○ 柔軟なScriptingによる操作も可能で思いのまま

Page 16: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

バックエンドについて

● システムは基本的に PHP + MySQL + Flare(KVS) で構成

● 既存の構成を生かしてGvG機能を作成する必要がある

● データ要素○ BattleInfo x 1:現在のバトル情報○ Guild x 2○ User x (20 * 2)○ Card x (15 * 40)

Page 17: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

MySQLで構築した場合の問題点

● Insert / Update / Select すべてが強烈に走る● Replication は Single Thread● Slaveの遅延が起きることが簡単に予測できる● 最適化したテーブルスキーマが仕様変更で再

設計とか目も当てられない

Page 18: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

Flareを使うことの意義

● 長年自社開発、運用してきたKVSでノウハウがある

● 細部実装まで把握、運用面での信頼性が高い● partition分割機能でスケールさせやすい。マル

チコアを活かせる● データの永続化が行えるのでメインのストレー

ジとしても使える

Page 19: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

SQLで処理するかPHPで処理するか

● メンテナンス性を考えてPHPでの処理にする○ 多数の複雑なSQLを短期間で正しく評価し続けるのは

困難○ 保存時の競合の問題さえ解決できれば大部分はクリア

可能■ 当然相性が悪い操作もあるのでそこはケースによる

○ ただし、データ構造が大きめになってしまうので、1回のリクエストあたりのトラフィックは増大する

○ メリット■ 領域を切り分けて考えられる■ データを取得さえできれば再現が確実にできる

Page 20: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

トラフィック増加により見えてくるSoftware IRQ 問題

● ソフトウェア割り込みが多くなることの要因○ データは1パケットの大きさに収まるように分割される○ 大きなデータであれば分割数が多くパケットの数が増え

● 高負荷なサービスではアプリケーションを作る側でもNetworkの知識が求められる

Page 21: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

対策

● データサイズを減らす、リクエストを束ねる○ 1回のHttp Requestで発生するKVSの操作を最適化

■ Memcached なら mget を使う、等■ たいていの場合、複数回getを呼ぶよりppsは下がる■ mget はライブラリの実装によるのでどのような挙動

をするか把握することは大事

Page 22: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

対策

● どうやってデータサイズを減らすか○ Google Protocol Buffers

■ PBでの数値は可変長整数のエンコードなので小さい値と相性が良い

■ PHPを基準に考えた時にClassのSerializationで一番使いやすい

■ 機能面、速度面で優秀(型の不一致で悩むこともない)● パフォーマンスは実装で決まるので多言語の値はあくまで参考

■ 制限がある構造を使うので複雑になりすぎない■ 遭遇する問題

● PBは各バイトごとに関数を呼ぶような処理なので、Pure PHPだと遅すぎる

● 特にPHPは関数実行がオーバーヘッドになりがち● バッチ処理を扱う上で問題になりPure PHPのPBは使えなかった

Page 23: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

対策

● どうやってデータサイズを減らすか○ Serializeでも圧縮すれば運用し続けられるか

■ 圧縮率が悪化した場合にトラフィックが増加する■ バッチ処理等の実行に時間がかかる■ データサイズさえコントロールできれば行けそう

Page 24: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

最終的にはトータルバランスが重要

● 運用担当がメンテできないものはダメ○ 実装を知らないKVSとか使うべきではない

● PBを使って得られる速度

Page 25: Cedec2013 report 探検ドリランドにおけるギルドバトル開発体制とその裏側について

覚えていってほしいこと

● 大規模環境ではプロダクト開発側においてもNetworkやKernelなどの知識が必要になってきている

● LWFを使うことで本当に必要なゲーム開発に注力できる

● チームにあったプロジェクト運用で幸せな開発を