読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

メモリ不足を通知するプラグイン…の解説

先日紹介した「メモリが不足した際に通知してくれるプラグイ">メモリが不足した際に通知してくれるプラグイン」について、沢山のリツィートを貰ったので内容を紹介しようと思う。


(椿=サンはリツィートしてもらうとやる気が出るのです)


■MemoryWarning.mmの使い方について

使い方は簡単、
1.Assets/Plugins/iOSフォルダにMemoryWarning.mmを入れる。
2.シーンにGameControllerオブジェクトを用意する。
3.void MemoryWarning(string msg)メソッドを持つスクリプトを用意
4.3で作ったコンポーネントをGameControllerオブジェクトにアタッチ。

これでメモリ不足時にMemoryWarningメソッドが呼ばれる。

スクリーンショット 2013-08-18 23.34.08

ちなみ、にメモリ解放して助かるかどうかは若干運次第な所がある。(届くまで1Fかかり、その間にメモリワーニングが大量に呼ばれると強制終了してしまうため)。なので、メモリワーニングに頼り切りすぎないように注意。


■MemoryWarning.mmの内容について

今回紹介しているMemoryWarning.mmだが、何をしているのかと言うとUnityAppControllerの機能を継承して機能追加しているだけ。

方法は簡単で、下のような形のソースコードを用意し、「任意のクラス」の部分を適当なクラス名に変更、後は自分の追加したいデリゲートをViewControllデリゲート一覧を参考に追加してやるだけ。

#import "iPhone_target_Prefix.pch"
#import "UnityAppController.h"
@interface 任意のクラス : UnityAppController

  1. (void)load;

@end

@implementation 任意のクラス

  1. (void)load

{
extern const char* AppControllerClassName;
AppControllerClassName = "任意のクラス";
}
@end

後は任意のデリゲートを任意のクラスへ追加してやるだけで、何かあった時に呼び出してくれる。例えば以下のような形のメソッドを追加すれば、メモリ不足時に通知してくれる。
superで継承元のメソッドを呼ぶのを忘れずに。

- (void)applicationDidReceiveMemoryWarning:(UIApplication*)application
{
[super applicationDidReceiveMemoryWarning:application];
UnitySendMessage("GameController", "MemoryWarning", "warning");
}

SendMessageについてはこちらをどうぞ。


■何故こんな面倒なことをしているのか

実は4.1.5以前でも大体同じような事が出来た。方法はUnityAppControllerを直接デリゲートを足してしまえば良い。もしくは機能を追加してやれば良い。

ただし、これは憶測だがUnityAppControllerを直接上書きしてしまうと、UnityユーザーはUnityのバージョンが上がる度に最新版にマージをかけなければならない。変な所を更新してクラッシュするようになっても、そこは最早自己責任なのでサポートしようがない。

なのでUnityAppControllerを外部から継承し上書きする形に変更し、UnityAppControllerが変わってもユーザーがマージする必要のないような形にしたんじゃないかと思う。