CEDEC2017

[CEDEC2017]アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現

More than 1 year has passed since last update.

アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現

講演者

鈴木 清人 さん(グリー株式会社)
西田 綾佑 さん(グリー株式会社)

講演内容

開発のきっかけとなったことは、スマホ向けゲームとコンシューマゲームとの差を解消してみたい

よりコンシューマっぽい作り方をしてみようという流れ。

開発のグランドデザイン

  • クライアント > サーバーとなるようにした。
  • バックグランド通信によるオートセーブ
  • データスキーマの共有
  • クライアント単体で動作できるように(ある程度)
  • サーバー側でデータを作らない

メリット

  • ユーザー視点だと通信しているように見えないので通信待ちがあたかも無いように見せる
  • 通信をバックグランドで行うため、早いDBを使わずに別の特性をもったDBを選択できる

対応

ステートマシンを用いて下記の様なときにオートセーブを行うように対応
- 画面全体を覆うようなUIクローズ時
- エリア移動時
- Luaスクリプト実行時
- ストーリー進行時
- バトル終了時
- 1分に1回
このタイミングでオートセーブを行い、ローカルへのセーブとサーバーへの同期を行っている。
ただし、スマホということでいつでも通信が出来るとは限らないので、
最大100件までのオートセーブデータの差分ファイルが出来るか、
一定時間の無通信状態になった際にタイトルに戻すように対応
→タイトル画面からゲーム画面に遷移する際にすべての差分データのサーバーとの同期を行っている。

バックグランド通信だけでは対応できないものも存在している。
有償なものを使用した際にはブロッキング通信を行っている。
そのために、ブロッキング通信が発生する際には、バックグランド通信のキューが溜まっていないことを確認してから行っている。

クライアントの最新状態=サーバーのミラー状態+その差分データ

これを維持するために、サーバーで直接DBを書き換えてしまうとデータの不整合につながってしまうため、
直接書き換えたいような状態が発生した際には下記のようなことを行っている。
サーバーで書き換えたいデータをクライアントに送信命令

クライアントのローカルデータを更新

オートセーブ時に差分データと一緒に完了署名付きで送信

サーバー側はその命令を削除

使用しているもの

  • LevelDB
  • DynamoDB
  • FlatBuffers

まとめ

スマホ向けゲームとしてはかなり挑戦的な取り組みを行っていたということに驚きを覚えました。
端末にデータを持ってしまうことによるチート対策を念入りに行っていないといけないものと感じました。