魔法科ロストゼロ、2周年!

先日、2016年9月4日でスマフォアプリ、魔法科高校の劣等生 LOST ZEROが運営開始から2周年を迎えることができました!本当にありがとうございました。ここまでこられたのはいつも遊んでくれたみなさんのおかげです。ちょうど今日、その2周年記念のニコ生も配信されたことですし、開発現場的なネタなどをちょっと話しておこうかと思います。

ロストゼロの本体アプリは、この2年間の間にはいろんな新機能を追加し続けてきました。そのため徐々にアプリが使用する消費メモリが増え続けており、今から約半年くらい前には抜本的な省メモリ対策を迫られていました。このままでは、メモリ不足でアプリが起動しなくなるような恐れもあったからです。

そこで、その解決のための第一歩として Unite Tokyo で紹介されていた新しい Memory Profiler でメモリの使用状況を調査することにしました。その結果、これまでのプロファイラでは気付きにくかった意外な結果が発覚してきました。メモリを圧迫していたのは、派手な演出に使われるモデルやアニメデータではなくて、カードや必殺技を増やすたびに増え続けてきたマスターデータ(カードやキャラの特徴などが数値化されているデータ)だったのです。確かに、今日のニコ生でもこれまでに実装された全カード枚数が1560枚と発表されましたが、これはゲーム開始時は250枚程度だったので、6倍以上に膨れ上がった計算になります。これは確かにヤバい…

ちょっと技術的な話になりますがロストゼロではマスターデータの形式にJSONというフォーマットを利用しており、それをサーバから取得して動作するようになっています。そしてJSONを処理するために、Boomlagoom JSON というライブラリを使用していました。これは開発当初に幾つかのライブラリを比較して選定されたものだったのですが、当時はともかく、現状のとても大きいサイズになってしまったJSONを扱うにはメモリ効率的にも、処理速度的にもあまり(かなり?)良くないことがわかったのです。そして、それはライブラリをもっと高効率のものへと置き換える事が最もメモリ使用量の削減効果が大きいということを示していました。

ここで白羽の矢が立ったのが、Unity 5.3 から Unity本体に実装された JsonUtility です。これはこれまでずっとJSONに対応してこなかったUnity がついに出してきた本命とも言えるJSONライブラリで、扱える JSON にちょっとばかり(すごく?)制限があるのですが、その制限さえクリアできれば非常に高効率に動作する事が予想されるので、消費メモリの要求にはしっかり答えてくれそうなライブラリでした。しかし、いきなりアプリ本体を改造するのは怖いですし、まずは使用しているJSONを読み込むだけのシンプルなアプリを作り、Boomlagoon JSON と JsonUtility でその使用状況を比較してみました。

<注>最初、同じJSONと書いていましたがJsonUtility側はJsonUtilityで読める形式に変換したものでした。データ的に内容は同じです。

上記の画像が新型Profiler の結果を調整したものなのですが、期待どうりというか、期待以上に JsonUtility の方が面積(=メモリ使用量)が少ないことがわかりました。ちなみにJSONのサイズだけを比較していないのは、JSONの構造上その読み込みの段階で細かいメモリ確保が発生し大きいまとまりになりにくいので個別での比較が難しいためです。ここまで分かれば、あとはアプリ本体の改良を進めるだけです…だけだったのですが、これが実にいばらの道でした… JsonUtility は確かに高効率で素晴らしいのですが、それを利用するための制約ゆえに、簡単にこれまのプログラムを置き換えただけでは使うことができず、サーバ側のJSON自体の形式の修正とアプリ側のJSONを解釈している部分の修正の両方を同時に進めていく必要があったのです。これには、それなりの時間と労力が必要となり、結果的に開発期間が2つのバージョン(3.2.0 と 3.2.5)をまたぐ期間を必要とし、現在公開されている 3.3.0 でようやく公開できるところまでたどり着けました。おかげさまで、3.3.0 ではそれなりにメモリ使用量の削減が進んだので、この空いたメモリをうまく次回のバージョンアップにも生かしていきたいと思っています。

と、いうわけで、Unityの JsonUtility は普通のJSONライブラリから見ると、ちょっととっつきにくいのですが、その効果は絶大なのでスマフォアプリなどには採用をお勧めできるかと思います。もっとも、これからの新規実装ならFlatBuffers などの新しいフォーマットが良いかもしれませんね。

ちょっと長くなりましたが、これから3周年目指してがんばりますので、魔法科ロストゼロをこれからもよろしくお願いします!

Like what you read? Give NANJI Kazunori a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.