iOSのマルチタスク対応は意外と・・

iOSはマルチタスクに対応してますが、これが意外とくせ者。

TaiatariもTaiatariHeroもマルチタスク対応しているのですが、ちょっと浅はかだった部分がありました。

リリースしてTaiatariは安定していて落ちることもないのですが、TaiatariHeroの方はテスト時は安定していたにもかかわらず、リリース後はたまに落ちる。

その落ち方も気づきにくいので、最近気づいたのですが、バックグラウンドから復帰時に以前の状態に復帰しないで初期の状態で起動してしまうことがある。

つまり、ゲーム途中だったのに最初からということになってしまいます。

最初は、あれっ途中じゃなかったっけ?と思いつつ勘違いかとスルーしていたのですが、どうも違ってました。

 

iOSのマルチタスク対応って結構簡単で、Application does not run in backgroundって設定でマルチタスク対応アプリかどうかを設定できます。

あとは、AppDelegateのapplicationDidEnterBackgroundにバックグラウンドに入る前の処理を書いて、applicationWillEnterForegroundにバックグラウンドから復帰するときの処理を書けばおしまいです。

Taiatariでは、ここに復帰時にゲームをPAUSE状態にする処理を書いたりしてます。

 

で、本題ですがiOSではメモリが足りなくなると、バッググランドに回っているアプリを終了してしまうことがあるそうです。

どうもそのせいで、バッググランドに回ったTaiatariHeroが勝手に終了されてしまっていたようです。

カメラとかSafariがメモリを多く使うのか、この辺のアプリを使うと結構な確率でバックグラウンドに回っていたTaiatariHeroが終了されてしまっていたようです。

一生懸命、TaiatariHeroのプログラムを調べても原因が分からない訳です。。

で、なぜTaiatariが大丈夫でTaiatariHeroだけ終了されてしまうのか?

多分、TaiatariHeroがRetina対応とiPad対応したときに、画像ファイルがメモリを多く使うからと思われます。

Taiatariも最近Retina対応してますが、TaiatariHeroほど大きな画像ファイルを使ってないので終了されなかったのではと思われます。

メモリを多く使っていたTaiatariHeroがバックグラウンドに回るといち早く終了されていたという訳。多分。。

 

対策ですが、バックグラウンドに回るときに、メモリに読み込んだ画像系のリソースを解放するようにして、復帰時に再読み込みするようにしました。

おかげで復帰に少し時間がかかるようになってしまいましたが、仕方ないですね。

 

ちなみに、AppDelegateにかける処理なら前述のapplicationDidEnterBackgroundなどに書けば良いのですが、ViewControllerで処理したい場合があります。

その場合は、ViewControllerのviewDidLoadに、下記のように細工しておいて、イベントを受け取れるようにしておきます。

//バックグラウンド時の対応

if (&UIApplicationDidEnterBackgroundNotification) {

[[NSNotificationCenter defaultCenter]

addObserver:self

selector:@selector(appDidEnterBackground:)

name:UIApplicationDidEnterBackgroundNotification

object:[UIApplication sharedApplication]];

}

//フォアグラウンド時の対応

if (&UIApplicationWillEnterForegroundNotification) {

[[NSNotificationCenter defaultCenter]

addObserver:self

selector:@selector(appWillEnterForeground:)

name:UIApplicationWillEnterForegroundNotification

object:[UIApplication sharedApplication]];

}

で、selecterに指定したメソッドにこんな風に、処理を実装しておきます。

//バッググランド時のリソース解放

– (void)appDidEnterBackground:(NSNotification *)notification

{

//ここにリソース解放などの処理を書いておく

}

バックグラウンド時に不要なリソースを解放してメモリを空けておくのは、行儀の良いアプリを作るためのお作法ですね。

この辺のサイトが参考になります。彩えんぴつを作った方のサイトのようです。

iOSでメモリ不足になったときの挙動

対策版のTaiatariHeroはテストして近いうちにリリースしようと思います。

Tags: , , ,