ガンズターン 公式サイト

楽しいことに、まじめです。 ——ガンズターンアプリ研究所公式サイト

CygamesTechFes(Unity 3Dゲーム勉強会)の感想とかのメモ

Pocket

0. 最近の自分の動向

お久しぶりです。
ガンズターンのRyosukeです。

最近、もくもくと新規タイトルの開発、それに並行して2つほどのプロジェクト(といってもいずれも関係者は自分と、身の回りのほんの数人ですが)を進めていて、すっかりブログの更新が滞ってしまいました。

本当は放置ゲームを作るつもりで、ゲームの骨組みとシナリオ(無駄に壮大)は出来上がっていたのですが、絵と効果音をつけていたところで、もっと別の、より面白そうなゲームのアイディアを思いついたので、今はそちらをメインに開発を進めてます。

Swiftを新しく勉強したり、Unityの物理演算の勉強したり、いくつか勉強会に出席したりと、なかなか好き放題(主に勉強という意味で)やらせてもらった一ヶ月でした。

突発的に発生した勉強熱を冷やすため、プログラミングコンテスト(初心者向けという噂のatcoderさんとか)にWeb上から初めて参加して、あまりの難しさにショックを受けたりして。

atcoderさんでは正解した方々の正解例が見れるんですが、自分では思いもつかないようなアルゴリズムで正解されている方々のコードは非常に参考になります。

もし自分のプログラミング能力を客観的に示す尺度が欲しいなあ、なんて思ってらっしゃる方がいらっしゃったら、Web上だけで参加手続きが簡単にできるので、ぜひやってみたらいかがでしょうか?

というか、一緒にがんばりましょう!(笑)

明日の夜もコンテストがあるので、今回は事前に過去問をいくつか解いておきたいと思います。
次こそは、満点とるぞ! (……100%ムリでしょうけど)

というわけで、前置き長くなりましたが、今回の本題は先日参加したCygamesさん主催の勉強会CygamesTechFes(Unity 3Dゲーム勉強会)に参加してきた感想とか、素直に「これは勉強になった!」的なことを簡単にまとめておきたいと思います。

勉強会当日は、登壇された方が6人もいらっしゃり、多岐にわたる分野のTIPSを惜しげも無く公開してくれたので、とてもじゃないのですがここに全部は書ききれません。

しかしいくつか、個人的に「これは!!」と思ったTIPSがあったので、忘れないうちにこうしてメモとして残しておこうと考えたわけです。(手を動かすことで知識がより定着するという話も聞いたことがありますので)

はじめにことわっておきますが、こちらの勉強会の内容は、後日こちら(Cygames Engineer s’ Blog)で正式なものが公開されるらしいので、気になる方はこんなブログ読んでないでそちらをチェックしておくべきだと思います!

んでは、参ります!

1. Unityにおけるメモリ管理について

0. (基本)Unityには大まかに2つの種類のメモリ割当がある

はい。おそらくUnityを究めし諸兄におかれては釈迦に説法かと思いますが、わたし、これまでこのことをあまり気にせずに生きてまいりました。
けれど、とくにハイクオリティなゲームを作るためには気にしておくべきことかと思いますので、忘れないうちにメモしておきます。

1. Mono管理のメモリ割当

Mono管理、ということはつまり、Unityの機能とは独立した部分(いわゆる.Net Frameworkに相当する部分)が機能するために必要な領域ですね。

このMono管理のメモリは、さらに2種類に分けられるようです。

  • Stack
    • int や float 等の基本型(組み込みデータ型?)のデータのためのメモリ
    • メモリの解放についてとくにプログラマが意識する必要はない
  • Heap
    • Class や delegate 等のいわゆる参照型のデータのためのメモリ
    • GCが走ったタイミングでメモリ解放されるが、その時にデータに対する「参照」が残っていると、GCが解放対象とみなしてくれない

このうち、問題になりやすいのは「Heap型」の方で、もう使用しないデータに対しても参照が残ってしまうような設計をしていると、一発で「メモリリーク(メモリの無駄遣い)」に陥ってアプリが落ちる、というような状況を招くことになります。(Unityに限らずMono全般で共通の話)

2. Unity管理のメモリ割当

こちらはUnityの機能に直結したメモリ割当です。
TextureやMeshを読み込むと、その情報はUnity管理のメモリ割当内で管理されるとのことでした。

……んで、自分が「うぉ! 知らなかった……!」となったのは、次のポイントです。

  • Unityで「Resources.Load(asset)」などで読み込んだデータに対して「Destroy」を使っただけでは参照が残る。
  • この参照を外すためには、「Destroy」を適用した後に、さらに「obj = null;」などとしてnullを直接代入してやる必要がある。

いや〜……。まさかそんな必要があったとは、まるで知りませんでした……orz

実はこれまで(というかLumineCubes開発時)、メモリ搭載量の少ない端末で、シーン遷移を繰り返すとアプリが落ちるという現象に悩まされたことがあるのですが、きっとこの情報を知っていれば防げたのだろうと思います。

あのメモリリークを解消するために費やした丸二日が、今となってはとてももったいないですね……。

3. その他メモリ関係の調査用に覚えておくと便利なTIPS

この辺についても、Cygamesさんは太っ腹に色々と教えてくださいました!

  • エディタ上での確認時、Inspectorに表示されているオブジェクトは、ゲーム内で使われてなくても参照が残る。(エディタでの確認時は、実行前にHierarchy上で空欄をクリックしておく)
  • Unityプロファイラ(メニューの「Window」->「Profiler」で表示)からだとメモリリークを見つけやすい。

2. Jenkinsを使って自動ビルド→簡易テスト実行まで

なにかとUnityと絡めて語られることの多いJenkinsさんですが、なんと自動ビルドだけでなく、ビルド後のapkに対する簡易的なテストの実行までを自動化できるそうです。

ビルドを通っただけで安心してリリースしたら、実はゲームが起動しない状態だった、なんていう不幸な事故を防ぐために(めったに起こることじゃないんですけどもw)、とても有用な仕組みだと思ったので、いずれ自分がまたチームで作業することになったら導入してみようと思いました。

……といっても、おそらく普通にJenkinsが導入されている現場であれば大した手間は必要ないと思われます。

0. アプリ側へのHeartBeatの実装

なんら難しいことをするわけではなく、アプリ内で特定の文字列(HeartBeat等)を定期的にログに吐き出す処理をくっつけるだけです。(UnityであればUpdate内のどこかにログを吐く処理を書けばOK)

1. サーバー内でJenkinsさんがビルド

普通にJenkinsさんがgithub等から最新ソースを入手してビルド。

2. 仮想端末への自動インストール

サーバ内に仮想端末がマウントされている状態で、Jenkinsさんがadbを使って仮想端末へビルドしたてのアプリをインストール。

3. JenkinsさんがHeartBeat監視

Jenkinsさんが、これまたadbを用いて、仮想端末内で起動しているアプリからHeartBeatログが吐き出されるかどうかを監視します。一定時間内にログが書かれれば問題なし、ログがいつまでも書き込まれない時は簡易テスト不合格としてアラームを発生→関係者へ自動でメール送信等して「ビルド失敗」の旨を通知する。

というわけで、意外と簡単に自動簡易テスト環境を作れるとのことです。(実際、自分はまだこういう環境作ったことはないわけですが、話を聞いていたら本当に簡単にできるのでは? と思えてきてしまいました)

3. その他3Dゲーム作る時に気をつけるべきあれこれ

たくさんのTIPSが語られたので、以下、思い出せる範囲で箇条書きします。

  • DrawCall数よりもSetPass数を重視すべき(実際、Unity5からstatus画面にDrawCallの表示はない)
  • 描画順を制御する時、描画する面積がより少なくなるような順番を意識すると処理負荷が軽減する(例えば縁取りをする時、先に縁→真ん中の順番よりも、真ん中→縁のほうが処理負荷は少ない)
  • 描画負荷の確認をする時は、対象端末に搭載されたGPUと対になったGPU Profilerを使う(iOS向けなら、iOS OpenGL ES Frame Debugger)
  • 処理負荷軽減のためには、まず計測することが大事
  • etc、etc……

いや、本当に書ききれない(そもそもメモが追いつかず、覚えてもないけど重要なTIPSがたくさんあった気がします……orz)。

このCygamesTechFes、今回が初めての開催とのことですが、モバイル向けのハイクオリティアプリを作る人向け、というなかなかこれまでありそうでなかった分野に向けての勉強会で、出席してみて非常に勉強になることばかりでした!

ぜひ今後も継続して実施していっていただきたいと思います!

以上。
長々と最後までおつきあいくださってありがとうございます!
ガンズターンのRyosukeでした! m(_ _)m

……早くエンジニアブログ更新されないかなぁ……\(*´▽`*)/(楽しみ!)

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

トラックバックURL: http://www.gunsturn.com/2015/11/20/unity3dtechfes/trackback/