#より美しく、より使いやすく…でも遅い?
Xperia X Performanceは2016年6月、Z5 Compactは2015年11月発売の機種で、スペック的にもX Performanceのほうが良いはずなんですが、同じUnityアプリを実行すると、なぜかZ5 Compactのほうが安定して60fpsが出て、X Performanceは30fps前後。これはおかしい。
最初は画面解像度の違いで、X Performanceは1920x1080、Z5 Compactは1280x720だから後者の方がフィルレート的に有利なのかなーとも思ったんですが、Screen.SetResolutionで1280x720にしてもフレームレートの改善がほとんど見られませんでした。OSはともにAndroid 6.0。
#Profiling
ということで、Profilerで見てみました。
CPUの"Others"がZ5では2ms程度、Xではなんと10ms。そりゃ16msに収まらないわけです。"Others"の中身は"Unaccounted"と"Overhead"。つまり、"不明"です。"Overhead"は同程度なので、明らかに"Unaccounted"に何かあります。
#調査編
日本語での情報はほとんどなく、英語だと関係ありそうな情報があるにはあるものの、Unityのバージョン5.4と特定の機種(解像度が高いものに多い?)の組み合わせっぽいというところまでは分かったんですが、このスレッドも解決には至っていませんでした。
Profiler constant 'unaccounted' entry takes 50% (13ms) on a SINGLE android device
http://answers.unity3d.com/questions/1235376/profiler-constant-unaccounted-entry-takes-50-13ms.html
BIG Performance Issue with Unity5 on Android !!!
https://forum.unity3d.com/threads/big-performance-issue-with-unity5-on-android.338847/
#解決編
…が、見つけましたー!!
Unity 5.3にアップデート後、Android端末での処理落ち
http://contoracutar.blog.fc2.com/blog-entry-37.html
簡単に言うと、"Player Settings->Other Settings"の"Auto Graphics API"のチェックを外して、"OpenGLES2"->"OpenGLES3"の順番に入れ替える、つまりOpenGL ES 3.0を使うのをやめると直るのでした。
#最後に
特定の機種でしか発生しないようなので、気付いていない開発者の方も多いと思います。OpenGL ES 3.0専用の機能を使っていないのであれば、OpenGL ES 2.0にすると、今まで以上にいろんなユーザーに喜ばれるかもしれません。
…ただ、実際の原因が分からないんですよねー。OpenGL ES 3.0を使うようにしたら直ったので、OpenGL ES 3.0のUnity側の実装がまずいのか、Xperia X Performance側の実装がまずいのか、そういうものなのか。試しにUnity5.5ベータでもビルドしてみましたが、結果は同じでした。うーむ。
#追記(2016/11/18)
気になって、修正前のUnityアプリに拙作のこれ( http://qiita.com/MARQUE/items/fd08fe57cbe4e0b53aa8 )を実装して各機種の描画APIを見てみたんですが、XもZ5も”OpenGLES3"と表示されました。予想していたのは「Z5だけOpenGL ES 2.0が適用される」だったんですが、違った…。Adrenoのドライバーの問題なのか、Unityが機種による実装レベルの違いを抽象化できていないのか、はたまた、1920x1080という画面解像度に最適化されていないという問題なのか…。
#追記2(2016/11/21)
Xperia X Performanceと同じSnapdragon820を搭載するGalaxy S7 edgeと、Exynos7420を搭載するGalaxy S6をチェック。どちらもOpenGLES3のままでも謎なCPU負荷は発生しませんでした。それどころか、2560x1440という高解像度ながらUnityChan程度なら60fps出るレベル。さらに謎。