Akashic Engineの紹介
はじめに
第二サービス開発本部 第一プロダクト開発部の告原と申します。
ドワンゴには5年程前に入社し、最初のニコキャスに携わった後、この記事で触れるAkashic Engineの開発に関わりました。
今はAkashic Engineを利用するサービスとして、ニコキャスや実験放送の開発に携わっていますが、昔から関わってきた思い入れのあるプロダクトなので、今回紹介記事を書かせていただく次第です。
Akashic Engine概要
Akashic Engineとは、2017年01月11日にオープンソースで公開していたプロダクトです。
サービスが形になるまで説明がつかないため、これまでは2Dに特化したゲームエンジンという見せ方をしていましたが、実際はゲームに限らない インタラクティブコンテンツフレームワーク であり、HTML5という訳でもありません。
Akashic Engineを説明するのに、今ならちょうどよい題材があります。「実験放送」です。本記事は実験放送の解説が主題ではないので、実験放送についての詳細は大百科等をご参照ください。
- 実験放送: http://dic.nicovideo.jp/a/実験放送
この実験放送で、新機能の一種としてゲームがお披露目されています。Akashic Engineで動作しています。
実験放送で、お絵かきツールや振るだけサイコロなどのツールがお披露目されています。これもAkashic Engineで動作しています。
オープニング、エンディング、鏡、ニコニコQなども、実はAkashic Engineで動作しています。
Akashic Engineを説明するのに、不可欠なキーワードが二つあります。
- いつでも
- どこでも
本記事では、Akashic EngineがなぜただのHTML5ゲームエンジンではなく、インタラクティブコンテンツフレームワークであるのかを、これらのキーワードを基に解説していきます。
いつでも
「いつでも」というキーワードは、Akashic Engineのリプレイ特性に対してかかっています。
Akashic Engineで制作されたコンテンツは、全てリプレイが可能な形で動作します。
この「リプレイ」という特徴は、一般的に連想されるプレイ後のリプレイだけでなく、遠隔地でプレイされている内容をリアルタイムでリプレイする特徴も内包しています。
この特性の活用によって、以下のような機構を実現します。
- Aさんがスマートフォンでプレイしている内容をBさんの手元で再現して閲覧
- サーバで実行されているゲームに、AさんとBさんとCさんが参加
- 生放送で実行されたお絵かき等のツールを、後日のタイムシフト視聴でも再現
コンテンツ制作者は、Akashic Engineの命令セットだけで動作するように気をつけてコンテンツを作るだけで、これらの特性を獲得したコンテンツを作ることができます。
放送者のプレイを視聴者全員の手元で見る、タイムシフトでも遊んでいる様子が再現される、といった実験放送の機能は、このようなAkashic Engineの「いつでも」特性を活用して実現されています。
どこでも
Akashic Engineのもう一つ重要なキーワードとして「どこでも」があります。
近年のゲームエンジンと比較してみると、Akashic Engineがサポートしている描画機能は貧弱です。
たとえば、Akashic Engineは円を描く事すらできませんし、画像のピクセル情報を取得した当たり判定もサポートしていません。
これらは、全て「どこでも」という特性を維持するためにデザインされた制約です。
この特性の実現方法については長文になってしまうため、本記事では最小限に絞って解説します。
Akashic Engineは、いわゆるHTML5に位置付けられるCanvasやWebGLやWebAudioといった機能に直接的には依存していません。
iOSアプリであればアプリの機能で音を鳴らす、サーバであればOpenGLで描画する、ブラウザであればCanvas(RendaringContext2D)で描画するといった事を選べるよう、特に音と画像については慎重にサポートするものを選んで実装していきました。
ピクセルを扱わないのも、描画処理でアンチエイリアスのかかり方が環境によって違い、環境によってゲームの実行結果が異なるのを避けるためです。
HTML5ゲームエンジン、というと、ブラウザでできる事をフル活用しがちですが、Akashic EngineはあえてHTML5よりも機能を絞る事で、「どこでも」という特性を獲得しています。
この特性によるメリットを箇条書きにするなら、以下のようになります。
- 一部機能のネイティブ化により、特にスマートフォン環境での安定稼働を実現
- サーバ環境等、ブラウザを持たないプラットフォームでのコンテンツ実行をサポート
- プラットフォームによって描画結果に差異が出ても、ゲームの実行結果には差異が出ない事を保証
実験放送での例として、ゲームを実行している様子を以下に示します。iOS、Android、PC等で同時実行されており、サウンド再生ライブラリはそれぞれで異なるものを利用しています。
「ブラウザを持たないプラットフォーム」としてサーバでエンディングというコンテンツを実行し、そのコンテンツがカメラ映像を加工してストリームを出力している様子を以下に示します。
「いつでも」x「どこでも」で実現する世界
Akashic Engineの二つの特性は、いずれも切り離せないものです。
もし「いつでも」という特性が無い場合、どこでも安定して実行できる、スタンドアロンのゲームエンジンにすぎません。
もし、「どこでも」という特性が無い場合、PCでは結果を再現できるがAndroidでは再現ができない、という事が起こりえます。
これでは、PCの結果をリアルタイムにAndroidでリプレイできないことになるので、生放送の視聴者がAndroid端末で見ているとバグのような表示になってしまうでしょう。
いつでも、どこでも実行できるインタラクティブコンテンツフレームワークであるからこそ、広範なプラットフォームで同時実行をするアンケートのようなコンテンツのエンジンとして採用することができます。
それが、Akashic Engineをドワンゴが開発した本当の目的であり、Akashic Engineがインタラクティブコンテンツフレームワークである理由です。
その他のいくつかの仕掛け
全てを一つの記事で解説すると長くなりすぎるため、以下に要素を列挙します。
- 「いつでも」を実現するためのシンプルなデータ構造
- playlog
- 時間、操作、乱数シード
- 内蔵される乱数ジェネレータ
- 「どこでも」を実現するための抽象化
- Renderer, Audio, Asset
- Renderer抽象化の例: https://github.com/akashic-games/akashic-engine/blob/master/src/Renderer.ts
- 手動進行と自動進行
- 自動的に時間が進むゲーム
- イベントが無い限りは時間が進まないアンケート
- Cross Border Bridgeによる領域外の通信サポート
- CBB: https://cross-border-bridge.github.io
- CBBを利用したプラグインのサポート
- 音源のネイティブ再生
- アンケートのタイトルをニコ割エリアに表示
- 管理するアイテム情報を定期送信し、ネイティブで描画
- 映像合成
- ビデオフレームをSurfaceとして受け取り、Spriteとして処理
- 「いつでも」を活用した簡単マルチプレイ
これらのより詳細な解説は、また別の記事で行わせていただきます。
今後について
今回は、「いつでも」「どこでも」という特性を持っているAkashic Engineと、その代表的な利用例についてご紹介することで、インタラクティブコンテンツフレームワークとしてのAkashic Engineの概要について早めぐりで解説させていただきました。
Akashic Engineは今後、実験放送で実行されるコンテンツを裏で支える存在として、皆さんにもご覧いただく機会が増えていきます。
この記事の公開や実験放送の実施に伴い、Akashic Engineの存在を隠す必要もなくなってきました。
今後は、まず関連ソースコードの一層のOSS化を進めます。
また、コンテンツの制作方法について文書が少ないため、文書整備も進めていきます。
準備が整い次第、ユーザの皆さんがAkashic Engineでコンテンツを作れば、それが実験放送等で使えるようになる、という世界を実現していくつもりです。
まだまだ乗り越えなければいけないエンジニアリングの課題は多いのですが、可能な限り早く実現できるよう、努力していきます。
Akashic Engineの今後に、是非ご期待ください。