isobe_yakiのブログ

ニコ生ゲーム開発者向けの記事を書きます

ニコ生ゲームの仕組み推察

この1年半くらいでニコ生ゲームの裏の仕組みが何となくつかめてきたので大体こうだろうという考察をまとめる。

 

まずランキング対応ゲーム。ゲーム自体はそれぞれ個人プレイで、制限時間終了時のスコアに応じてランキング画面が表示されるというもの。

  • ニコ生のWebページを生成しているのがWebサーバー
  • 動画を流しているのが配信サーバー
  • ゲームのセッションを管理しているのがセッションサーバー
  • ゲームアセットが置かれているのがCDN

とざっくり推察。生主がゲーム開始するとWebサーバーを介してセッションが立ち上がり、CDNに置かれているゲームデータのダウンロードが開始される。ユーザーはセッションサーバーと通信してスコアを送信、みたいな感じじゃなかろうか。

ちなみにニコ生ゲームはiframeの中で実行されている。このiframe内では通信先がセッションサーバーとCDN(と生ゲー用Webサーバー)に制限されていると思う。

よって全部試したわけではないが、以下のようなことはできないはず

  • ユーザーIDを元にユーザーのアイコン画像を取得
  • 外部サイトとの通信
  • 配信画面のキャプチャ

しかし、逆に言えばCDNはアクセスできるのでこれを利用したテクニックがいくつかある。今後の記事で紹介できたらと思う。

 

次にマルチ対応ゲーム。各ユーザーの操作が参加者全員に共有されゲームの状態も共通となり互いに干渉しながら進めるゲーム。

サーバー構成は大体ランキング対応ゲームと変わらないが、サーバー側でもゲームを動かすためnode.jsのサーバーが存在する(物理的にというわけではなく概念的に)。

nodeサーバーでは画像や音は不要なはずなのでCDNへのアクセス権が無い。そのためスクリプトだけがニコ生ゲーム登録時にnodeサーバーにコピーされていると思われる。

ちなみにニコ生にはタイムシフト視聴というものがある。あとから配信を見返すことができるのだが、この時ニコ生ゲームのプレイ内容も復元される。しかしもし開発者がそのゲームを更新してしまっていたら、新しいバージョンのゲームで以前のリプレイデータを再生されてしまうのだろうか?もちろんそんなことはなくタイムシフトが残っているゲームはその時の古いバージョンも残されていて、ちゃんと復元できるようになっている。では古いゲームはいつ削除されるのかというと恐らくそのバージョンを参照している全てのタイムシフトの期限が切れたタイミングではないかと思っている。まぁつまり開発者は細かいこと気にせずゲームを更新してしまっていいということだ。

 

あと、細かい話だがニコ生ゲームは更新したタイミングでの最新のAkashicEngineが使われるようになるっぽい。

どういうことかというと、以前パネワンを1年ぶりくらいに更新した時に、コードもデータもほぼ変えていないのにニコ生アプリ上で音が鳴らなくなるという現象が起きた。

どうやら、その数か月ほど前にAkashicEngineのサウンド周りに更新が入ったようで以前と同じデータでありながら実行時のAkashicエンジンのバージョンが上がったことによって不具合が起きるようになったのだ。*1

このことから、ゲーム更新時にCDNやnodeサーバーに一緒にAkashicEngine本体もコピーされているっぽいことが分かる。そんな非効率なことしないで常に最新のエンジン使えばいいじゃないかと思われるかもしれないが、そうすると上でも書いたタイムシフト時の復元性問題が出てくるのでそうもいかないことが分かる。

は最新のAkashicエンジンを常に取得する様子。いちいちコピーしなくてよいが放送時とタイムシフト時で異なるバージョンが読まれる可能性がある。

はゲーム更新時にCDNにAkashicをコピーする様子。少なくともこのゲームでは一生同じAkashicエンジンが使われるので動作が変わることはない。

実際にはコピーコストも考えてどのバージョンのエンジンを使うかバージョン情報だけ持たせてるとか工夫はしてそう。

まとめ
  • ユーザー環境からはエクスポートしたアセットに好きにアクセスできる
  • マルチのサーバー環境からはスクリプト以外のアセットは見れない

とりあえず今回はここだけ押さえておきましょう。

*1:※この件に関しては公式に問い合わせてニコ生アプリを修正してもらったのでもう大丈夫だと思う。