IT系勤務とはいうものの
IT系の職業に就いていたり休日は携帯用ゲームを作っていたりしますが、だからいってPC(=ハード)に興味があるわけではなくって、例えばTVショッピングとかで「お手ごろです!!」と宣伝されているノートPCを見ると素直に「これはお得かも」とか思っちゃうぐらいの情弱な人間なのです。
つまりは、床屋とかで職業を問われてIT系だと答えると十中八九「お勧めのPCはなんですか?」とか聞かれて困る、ということなんです。そんなことはヨドバシの店員にでも聞いてください。
まぁ、気が弱い人間なのでそんな質問でも拒絶できずに「う~ん、、、今はメーカものよりも自作の方がいいかもですね~」とか適当に答えるんですが、稀に「そうですよね~、私も自作で組んでて~」とか言われてマザーボードの型番とかを持ち出されたり、ごめんなさい、ごめんなさい、全然わかりません。
そんなこともあります。
意外とあっさりと
そんな感じで冴えない日々が続いているのですが、ゲーム制作の方は以外と進捗があって、前回の記事でCutieCircutのiOS版について『アプリが音もなく落ちる』と伝えていた問題は意外にあっさりと解決しました。
元々メモリ管理には厳しめのiOSで、そんなのお構いなしにプログラムを組んでいた私が悪いのですが、なにせ前述のようにPCハードとかアーキテクチャとかあまり興味がないので、メモリリーク?なにそれ美味しいの?状態。何をどうしたらよいか思案に明け暮れていたのですが、Google先生を駆使して色々調べたらあれよいう間に解決したので今回はそのお話
解決方法
前回の記事でも書いたように今回のメモリリークは初期処理でキャラクタの走るステージを作る際に、一旦プレハブを読み込んでInstantiateでオブジェクト化して、要が済んだらそのオブジェクトをDestroyする、といった処理を繰り返しているところで発生しているみたい。
「Destroyする」とは勝手に「メモリ上から破棄する」と考えていたのですが、調べてみると「生成されたオブジェクトのRendererが持っているMaterial(Clone)が、Rendererが破棄されたあとも残り続けている」ことがあるみたい。要はゴミが残っていることがあるってことです。
なのでそれらのゴミを一掃すべく以下の方法を使いました。
1.Destroy時にMaterialを解放する。
オブジェクトをDestroyするとそのGameObjectにOnDestroyというイベントが発生するので、そのイベント内でGameObjectが使用しているMaterialを明示的に破棄するようにしました。
これは以下のサイトに詳しく書かれていて、自動解放用のスクリプトも掲載されています。
2.アセットのアンロードを実施する。
Resource.UnloadUnusedAssetsを使用すると「強制的に」不使用なアセットを解放してくるようです。併せてSystem.GC.Collectをコールすればガベージコレクションを実施してくれるのでメモリの最適化も行ってくれます。
ただ、この処理自体が結構重たいのでDestroyの度に行うとその度にゲームが止まってしまうので、ある程度のところで一気に行います。
3.使用するテクスチャの最大サイズを下げる。
メモリリークには関係ないのですが、テクスチャの最大サイズを下げることでメモリ使用量自体を少なくしました。
やり方はAndroid版と同様にテクスチャをクリックしてInspectorに表示される
「Override for iOS」
のチェックをONにして、MaxSizeを小さいサイズに下げます。
それらの結果
前回大騒ぎした割にはあっさり解決してちょっと拍子抜けですが、無事にiOS上でも動作確認が取れて一安心です。
現在はAppStoreへ申請中なので申請が通れば無事にCutieCircuitがAppStoreに並ぶことになります。申請が通れば。
プロモーション動画
iOS版リリースを先取りしてプロモーション動画を作成しました。
Android版リリースの時に作っとけよ、って話ですが、色々課題が山積みだったのでそこまで時間が取れなかったんですよね。
今回はゲームの流れがわかるようなゲーム実況風の紹介動画となっています。
つたない編集ですが見てやってください。
次回は新作の話ができたらいいなぁ・・・