BlogKLabは、多くのスマートフォン向けゲームを開発・提供しています。スマートフォン向けゲームの開発と運用は、Webソーシャルゲームと比べて格段に複雑で、またコンシューマゲーム開発とも異なったノウハウが求められる領域もあります。このブログでは、KLabのゲーム開発・運用の中で培われた様々な技術や挑戦とそのノウハウについて、広く紹介していきます。Calendar8日目の記事です。KLabGames事業部エンジニアの@knsh14です。みなさんはUnityで開発をする際にどのようにしてアプリのパフォーマンスを計測していますか?今回はある案件で今までと違うメモリ監視の方法を使ってみたら、デバッグが捗った話を紹介しようと思います。KLabgamesでは幾つかのゲームでUnityを用いて開発を行っています。よい品質でユーザ様に遊んでいただくために、常にパフォーマンス・チューニングを行っています。その中でも各シチュエーションでのメモリ使用量を計測し、改善することは低スペック端末などで動作させるために必須です。Unity標準のProfilerでは適切にメモリ使用量を計測できない問題がありました。今までの方法これまでは以下の様なコードでメモリ使用量を取得して画面に表示していました。");これをOnGUIで表示するなり、NGUIのラベルに出力するなりしていました。ここで使っているメソッドを調べてみましょう。Profiler.GetTotalAllocatedMemory()Profiler.GetTotalReservedMemory()公式のリファレンスにもなにも書いてない...実際に動かした結果とプロファイラを見比べてみると全ての計測値にかなり開きがありますね。これでは計測の目安とするには不十分です。ネイティブプラグインを書いてみるではどうすればいいのでしょうか?僕らが見たいメモリ使用量は各OSから見てUnityAppがどれほどのメモリを使っているかというものです。Unityから利用できるネイティブプラグインを書いてそこから各OSに問い合わせればいいわけです。して書いたネイティブプラグインコードがこちらです。int)basic_info.resident_size;}このコードをAssets/Plugins/iOSに適切に配置して読み込むとiOSからUnityAppが使用している物理メモリ量を取得することができます。ネイティブプラグインを読み込む方法は世の中にたくさんあるのでここでは割愛します。task_info関数は公式リファレンスによると、現在のtaskに関する情報の配列を返すとあります。第2引数のflavorにTASK_BASIC_INFOを指定すると第3引数に与えたtask_infoに以下のような構造体が入ります。*/};この中のresident_sizeがtaskが使っているメモリ量です。アプリなのでこれでiOSから見たUnityアプリがどれ位メモリを食っているかを確認することができました。Androidの場合Androidの方ではtask_infoは使えませんが、代わりにAndroid自体に取得できる機能があったのでそちらを使いました。sumMemories;}Android公式リファレンスを見るとDebug.MemoryInfoがいろいろな情報を持っているのでこちらを利用します。プロセス毎にメモリ使用量が取れるのでそれを合算して表示します。49.2MBこの通りメモリ使用量がプロファイラから見たものと一致していますね!こうしてUnityApp上で各OSからみたメモリ使用量を可視化することができました。これで、実際の端末上で気軽にメモリ使用量を計測することができますね!最後にいかがでしたか。このように簡単なコードを一手間加えるだけでプロファイリングが格段に楽になりましたね。時には標準Profiler以外の方法も試してみると、よりUnityと上手く付き合っていけるのでは無いでしょうか。この記事を見てくださった方のメモリ監視が楽になることをサンタさんにお願いして終わりたいと思います。今回作成したサンプルで使われているGopherのモデルはGitHubにあるこちらのモデルを利用しました。Frenchさんです。次回は@hnwさんの「Autotools三兄弟の末っ子libtoolとは何者なのか」です。