ナギサものおき

【iOS9】Unityゲームが遅くなる問題、64bitCPU搭載端末のみで発生か

calendar

reload

【iOS9】Unityゲームが遅くなる問題、64bitCPU搭載端末のみで発生か
追記

なぜだか、先日リリースのiOS9.1にアップデートしたらこの問題は直りました。あれえ……。この記事が真実だとすれば、「iOS9.1のMetalは8のそれに対して互換性が100%となるように修正された」となります。もしくは…この記事自体完全に間違いで、全てiOS9.0.xのどこかのせいだったか……

※iOS9.1においても、マルチタスク機能を有効にしているとフレームレートが慢性的に低下しますが、無効にしていれば気にならないレベルです。

以前からお伝えしているように、iOSを9にアップデートした場合(もしくはiOS9がプリインストールされたiPhone 6sなどでも同様ですが)、Unityで作られたゲームの動作が遅くなってしまう問題があります。具体的には、フレームレートが遅くなり、カクカクした動作になります。

これについて調べると、どうやらハードウェアに起因しているらしく、またUnityやiOSのアップデート内容も深くかかわっているようです。

注意:厳密に言うと事実と異なる部分もありますが、知識が無くても分かりやすいように無駄な説明を省いているためです。ご了承ください。

問題についてのここまでの理解

27-deemo-eyecatch

まず、iOS9にアップデートした直後から様々なゲームの動作確認をするうえで、音楽ゲームのDeemoがカクカクした動作になるということを発見しました。

そして次々に同じ現象に見舞われているゲームを発見し、あとは以下のような手順で論証しました。

  1. Unityを使用しているゲームが同じ問題に遭遇しているのを発見
  2. DeemoもUnityを使用しているのでは?
    →確かに使用されていることが確認された
  3. 同じ問題が発生している他のゲームも、全てUnityを使用
    →少なくともUnityを使用すると起こる問題であることが確認された
Unity

とても省略的に言えば、3Dでのゲーム開発を支援するツールのようなものです。大幅に簡略化できるため、企業や個人の別を問わず、あらゆる開発者に使われています。

以上のことから、iOS9とUnityは相性が悪いのではないか、という結論でいったん終了させました。これについて詳しく書いてあるのが以下の投稿ですので、もしご興味があればご覧ください。

【iOS9】一部ゲームが遅くなる問題、Unityが関係? | ナギサものおき
この記事に掲載されているゲームのスクリーンショットは、作者に権利が帰属します。ポリシー

iOS9へのアップデートを最初から推奨していなかった私ですが、ソフトウェアオタクの本分を発揮(?)…

しかし、この結論は帰納的に求められたものであって、ソフトウェア・ハードウェア間の働きを詳しく確認したわけではありませんので、パーフェクトな答えとは言えません。また、この結論では説明できない、以下のような疑問もありました。

  • 手持ちのiPad mini 3で起こり、またiPhone 6やiPad mini 4でも同じ現象を報告してくださった方がいる反面、iPhone 5だと同じ現象が一切起こらない
  • ハードウェアの問題としても、なぜiOS9にアップデートした途端発生したのか
  • 同じ問題が発生していたアプリの1つであるMUSYNCがアップデートによって問題を解決したが、開発者が解決できる問題なのか

これらの問題について、すべて説明することができる原因を発見したため、今回の記事にしました。「iOS9とUnityの相性が悪い」ということはある意味正しかったですが、Unity以外の開発環境であっても起こる可能性がありました。

この問題の要因

それでは、まずは問題を引き起こした要因とは何なのか、という「点」をそれぞれ見ていきます。どういうプロセスで問題が発生したかという「線」を語るためには、まずは元となる知識が必要ですからね。

要因A:問題が発生した端末のCPUは64bit

165

手持ちの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でのビルドをサポート

076

Unity4ではサポートしていなかったのですが、Unity5(今年3月のアップデート)で、iOSアプリを64bitでビルド(Unity上で作ったものを、iOSで動くようにする作業と思ってください)するのをサポートしました。

Unity4では、32bitでのビルドしかできなかったのです。64bitのCPUでそれを実行することも一応できるようにはなっていますが、誤作動を起こす可能性もないとは言えませんし、あまり望ましくありません。

要因C:UnityはレンダリングにMetalを使用

166

レンダリングというのは画面に描画することで、MetalというのはiOS専用に最適化された、高速なグラフィックス処理関連の機能です。ちなみにMetalは64bitの端末でしか使用することができません。

で、UnityはiOSアプリを作成するとき、Metalが使えるならレンダリングにそれを使用するようになっています。これも、今回の問題の原因の1つです。

要因D:MetalがiOS9で拡張

そのMetalが、iOS9で拡張されました。このことが、iOS9へのアップデートにより不調が起こる原因だと考えられます。


さて、これで問題を説明するための役者である「点」が揃いました。これらを「線」にするべく、説明に入りましょう。

この問題の原因の説明

まず、iOS9より前の話をします。AppStoreでアプリを販売するとき、64bitに対応することが義務付けられたのはごく最近のことですから、AppStoreで販売するアプリを作成する際、Unityでゲームを開発する人は32bitのサポートをするだけでもよかったわけです。

ただ、義務付けられていないとはいえ、64bitもサポートしておけばよかったのではと思いませんか? 何故でしょうか、答えは先ほどの「点」の中にあります。

167

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

168

しかし、それでも今までは目立った問題にはなりませんでした。具体的なことは分かりませんが、iOSはけっこう上手いことをやっていたようで、特に互換性に問題は生じなかったのです。

さて、ここからが本題。そのままならよかったのですが、iOSがアップデートされたことにより、これに水を差すこととなりました。iOSのアップデートで追加されたものってなんでしたっけ?

169

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

170

しかし、そもそも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に対応していることは確実であって、その場合、この記事で述べた「原因」が正しいのなら、問題は解決されると思われます。

終わりに

というわけで、前回の記事で疑問になっていた点を、この説明であればすべて解消できるのではないかと思うのですが、どうでしょうか。

説明する力がなく、かなり雑多な文章になってしまい、書いてから反省しています。申し訳ありません。不明な点や、何か矛盾などを発見されましたら、ご遠慮なくコメント欄に書いていただければと思います。

この記事をシェアする

folder リテラシー

【Twitter】悪質な連携アプリの解除方法と正しい見分け方を知ろう
more...

folder ブログについて

ものおき、改修しました。
【お知らせ】サーバ変更を完了しました
ブログ1か月続けて思ったこと
more...