追記
なぜだか、先日リリースのiOS9.1にアップデートしたらこの問題は直りました。あれえ……。この記事が真実だとすれば、「iOS9.1のMetalは8のそれに対して互換性が100%となるように修正された」となります。もしくは…この記事自体完全に間違いで、全てiOS9.0.xのどこかのせいだったか……
※iOS9.1においても、マルチタスク機能を有効にしているとフレームレートが慢性的に低下しますが、無効にしていれば気にならないレベルです。
以前からお伝えしているように、iOSを9にアップデートした場合(もしくはiOS9がプリインストールされたiPhone 6sなどでも同様ですが)、Unityで作られたゲームの動作が遅くなってしまう問題があります。具体的には、フレームレートが遅くなり、カクカクした動作になります。
これについて調べると、どうやらハードウェアに起因しているらしく、またUnityやiOSのアップデート内容も深くかかわっているようです。
目次
問題についてのここまでの理解

まず、iOS9にアップデートした直後から様々なゲームの動作確認をするうえで、音楽ゲームのDeemoがカクカクした動作になるということを発見しました。
そして次々に同じ現象に見舞われているゲームを発見し、あとは以下のような手順で論証しました。
- Unityを使用しているゲームが同じ問題に遭遇しているのを発見
- DeemoもUnityを使用しているのでは?
→確かに使用されていることが確認された - 同じ問題が発生している他のゲームも、全てUnityを使用
→少なくともUnityを使用すると起こる問題であることが確認された
Unity
とても省略的に言えば、3Dでのゲーム開発を支援するツールのようなものです。大幅に簡略化できるため、企業や個人の別を問わず、あらゆる開発者に使われています。
以上のことから、iOS9とUnityは相性が悪いのではないか、という結論でいったん終了させました。これについて詳しく書いてあるのが以下の投稿ですので、もしご興味があればご覧ください。
【iOS9】一部ゲームが遅くなる問題、Unityが関係?
しかし、この結論は帰納的に求められたものであって、ソフトウェア・ハードウェア間の働きを詳しく確認したわけではありませんので、パーフェクトな答えとは言えません。また、この結論では説明できない、以下のような疑問もありました。
- 手持ちのiPad mini 3で起こり、またiPhone 6やiPad mini 4でも同じ現象を報告してくださった方がいる反面、iPhone 5だと同じ現象が一切起こらない。
- ハードウェアの問題としても、なぜiOS9にアップデートした途端発生したのか?
- 同じ問題が発生していたアプリの1つであるMUSYNCがアップデートによって問題を解決したが、開発者が解決できる問題なのか?
これらの問題について、すべて説明することができる原因を発見したため、今回の記事にしました。「iOS9とUnityの相性が悪い」ということはある意味正しかったですが、Unity以外の開発環境であっても起こる可能性がありました。
この問題の要因
それでは、まずは問題を引き起こした要因とは何なのか、という「点」をそれぞれ見ていきます。どういうプロセスで問題が発生したかという「線」を語るためには、まずは元となる知識が必要ですからね。
要因A:問題が発生した端末のCPUは64bit

手持ちのiPad mini 3で起こり、またiPhone 6やiPad mini 4でも同じ現象を報告してくださった方がいる反面、iPhone 5だと同じ現象が一切起こらない。
と上で書きました。ここで問題を確認できた端末の共通点を探すと、それらのCPUは64bit構造(※)で、問題が発生していないその他の端末は32bitでした。
CPU
ざっくりいえばコンピュータの頭脳。様々な処理をします。○○bitというのは、数字が大きいほど一度にできる処理が大きくなるのだと考えてください。iPhoneで言えば5sより、それまで32bitだったCPUが64bitとなりました。しかし、構造が違えばそれに対応できるソフトも違ってきます。これが今回の問題の原因の1つと考えられます。
※ Apple A7 および A8 。
要因B:Unity5でiOSアプリの64bitでのビルドをサポート

Unity4ではサポートしていなかったのですが、Unity5(今年3月のアップデート)で、iOSアプリを64bitでビルド(Unity上で作ったものを、iOSで動くようにする作業と思ってください)するのをサポートしました。
Unity4では、32bitでのビルドしかできなかったのです。64bitのCPUでそれを実行することも一応できるようにはなっていますが、誤作動を起こす可能性もないとは言えませんし、あまり望ましくありません。
要因C:UnityはレンダリングにMetalを使用

レンダリングというのは画面に描画することで、MetalというのはiOS専用に最適化された、高速なグラフィックス処理関連の機能です。ちなみにMetalは64bitの端末でしか使用することができません。
で、UnityはiOSアプリを作成するとき、Metalが使えるならレンダリングにそれを使用するようになっています。これも、今回の問題の原因の1つです。
要因D:MetalがiOS9で拡張
そのMetalが、iOS9で拡張されました。このことが、iOS9へのアップデートにより不調が起こる原因だと考えられます。
さて、これで問題を説明するための役者である「点」が揃いました。これらを「線」にするべく、説明に入りましょう。
この問題の原因の説明
まず、iOS9より前の話をします。AppStoreでアプリを販売するとき、64bitに対応することが義務付けられたのはごく最近のことですから、AppStoreで販売するアプリを作成する際、Unityでゲームを開発する人は32bitのサポートをするだけでもよかったわけです。
ただ、義務付けられていないとはいえ、64bitもサポートしておけばよかったのではと思いませんか? 何故でしょうか、答えは先ほどの「点」の中にあります。

そうです、Unityは最近64bitのビルドをサポートした(要因B)ため、そもそも古いUnity4を使っている開発者は、64bitをサポートする術がなかったのです。32bitのアプリを64bitのCPUで動かすと、誤作動を起こす可能性が無いとは言い切れません。

しかし、それでも今までは目立った問題にはなりませんでした。具体的なことは分かりませんが、iOSはけっこう上手いことをやっていたようで、特に互換性に問題は生じなかったのです。
さて、ここからが本題。そのままならよかったのですが、iOSがアップデートされたことにより、これに水を差すこととなりました。iOSのアップデートで追加されたものってなんでしたっけ?

そう、Metalが強化されました(要因D)。これにより、レンダリングに元々Metalを使用するようにしているUnity4(要因C)は、iOS8のMetalを扱っている気でiOS9のMetalを取り扱います。こうなると、最適な動作を得られない原因になりかねません。

しかし、そもそも32bitのCPUでMetalは使えないので、その場合Unityは最初からMetalではなく他のグラフィックスAPIを使用するようにしているため、iOS9のアップデートは全く関係なく、不都合は起こりえないということになります。これが要因Aの理由。
まとめ
ここまでで説明は終わりましたが、最初で示した疑問点について、この記事でどのような答えが与えられたのかを振り返ってみましょう。
なぜ特定の端末だけで発生したのか?
特定の端末とは、「Apple A7以上、つまり64bitのチップを搭載した端末」でした。
そもそも32bitのアプリを64bitのCPU上で動かそうとしているのが主な原因であって、32bitのアプリを32bitのCPU上で動かすときには当然問題はないのです。それで新しい端末に限って問題が発生するようになってしまったのです。
しかも、32bitの端末ではMetalも使えないので、iOS9でそれが強化されても影響を受けるはずがありませんしね。
なぜiOS9にアップデートした途端発生したのか?
iOS9ではMetalが強化されました。それにより、iOS8のMetalの使用しかサポートしていないUnity4を使っている場合、互換性に問題が発生するようになったのでしょう。
開発者が解決できる問題なのか?
32bitのアプリしかビルドできず、iOS8のMetalしか使用できないUnity4はもう使わなければよいのです。つまり、Unity5に移行すれば解決することができます。
厳密にはiOS9とUnityだけの問題ではなかった
今回は、Metalが絡んでいるために問題が発生していました。しかし、Unityを使わずにゲームを作ることを考えた場合、普通はiOSだけでなくAndroidなどにも対応できるようにしたいはずなので、あえてMetalを選ぶということはあまりありません。
MetalはiOSに最適化されたiOS専用のAPIであって、Android向けと同時に作りたいのなら他のAPI使いますから。
ですから、今回の問題はUnityだけに発生するように見えていましたが、実はMetalを使用するアプリをビルドする数少ないものがUnityだったというだけの話で、他にiOS8上でMetalを使用していたアプリがあり、それがiOS9用にアップデートされていないというのであれば、同じ問題が起こるかもしれません。ま、これ相当稀な話だと思うのですが。
というわけで、実質的に、iOS9とUnity「4」が相性が悪い、と言って一応差し支えなかったでしょう。「4」がね。
次回のアップデートで解決されると推測される
前に述べた通り、現在のAppStoreは、64bitに対応したデータを含めてアプリを提出しないと受け取ってもらえません。
つまり、現在問題が発生しているDeemoなどのゲームが次にアップデートされるときは64bitに対応していることは確実であって、その場合、この記事で述べた「原因」が正しいのなら、問題は解決されると思われます。
終わりに
というわけで、前回の記事で疑問になっていた点を、この説明であればすべて解消できるのではないかと思うのですが、どうでしょうか。
説明する力がなく、かなり雑多な文章になってしまい、書いてから反省しています。申し訳ありません。不明な点や、何か矛盾などを発見されましたら、ご遠慮なくコメント欄に書いていただければと思います。
確かこの問題は、iOS9の「GPU負荷がそれほど高くない場合はCPUパフォーマンスを落として消費電力を抑える」が過剰に動いていた為だったと何処かにあった気がします。
あとUnity 4でも64bit版はサポートしています。
ついでに言えば、Metal非対応アプリはAppStoreの「お勧めリスト」に載れないので、商売したいならばMetalは必須です。
それならば9.1から同じ問題が発生しなくなったことも頷けます。なおご指摘の通りUnity 4でも64bitをサポートしているバージョンはあるようですが、目次直前に記載しているように、このブログはプロフェッショナル向けではないので、厳密な表現を用いていません。
[…] 2016/06/07 11:33:37 T3gTcaps0.net >>659 http://nagished.com/report/20151026-unity-game-problem/ […]