2016年4月8日金曜日

SurfaceView で死んだ話

SurfaceView はマルチスレッドで動く絵を見せるビューです。 本体と独立しているというのが特徴で、例えばミスでビュー側の画像更新がストップしたとしても、 メインの処理は関係なく進んでいます。 で、音だけはバキバキ聞こえてきて、気が付いたら敵を全滅させていたりします。 また、描画スピードが物事に追いついていないとコマ落ちになります。

SurfaceView に関して不満があったので、相当いろいろ調べましたが明確な答えは出てきませんでした。 ただ、Android 4.x 以降になってからは混乱が見受けられるといのが印象です。 2010年くらいの記事だと、SurfaceView 重い・遅い・クソ、という話は見えてきません。 で、問題となるのはハードウェアアクセラレーションなのかもしれません。

ハードウェアアクセラレーションとは

Android 5.x 以降の機種では開発者向けオプションで 「GPUレンダリングを使用」 「GPU表示の更新を表示」 などという項目があります。 GPU とはパソコンでいうとこのグラフィックボードみたいなものだと思うんですけどね、 描画専門の機能のことです。 で、ハードウェアが持っているGPUを行使することで グラフィック描画機能を向上させるみたいです。 この機能は、Android 4.x だとデフォルトでオンになっているというのが通説です。

で、話はややこしいですよ。 ハードウェアアクセラレーション使用はメリットがある反面、デメリットもあります。 場合によっては恣意的にオフにしてやった方がよいということも…。 この辺はググって調べてください。内容がアバウトじゃないから、調べるのは容易だろうと思います。 で、何がややこしいかというと、
・View には適用されるけど、SurfaceView には適用されない(真実は…?)
・だから、View の方が逆に早いよ(真実は…?)
・じゃあ Android 5.x はデフォルトでオンなのですか?
・ついでに Android 6.x はデフォルトでオンなのですか?
・もしかして、メーカー単位で微妙に設定が違っていないですか?
いろいろな疑惑がでてきます。

シャープが悪いのか?

個人的な経緯を説明しましょう。 ゲームを Android で作成していて直面した事態です。

・デバッグ機は2台目、Xperia SO-02f です。

・今まで Viewで作ってきたけど、SurfaceView にしたろか?

・とりあえず移植完了。早い遅いの変化は感覚的に変化なし。

・新たにNexus5X と、AQUOS(SHARP) SH-02Hをゲット!

・新機で実機デバッグ開始。画面表示、動作など特に問題なし。

・Eclipse だと直結で run できないので、SO-02f(Android4.4.2)が相変わらずメインデバッグ機。

・普段使い(電話&インターネット)はシャープですね。お出かけでウェブ見る分にはとてもいいマシーンですね。

・あれれ、何かこのボスと戦うとき明らかに遅くなってない?

・画面内にFPSが表示されるように細工

・ソニー(Android4.4.2)が最速で、シャープ(Android5.1)とネクサス(Android6.0)はもっさり

・ちゃんと比べていないが、ソニーはシャープの5倍以上の速度で描画することが可能、というかシャープが異常に重い

・解決のために色々やってみる。実際は例のボス以外でも遅くなっているシーンが多発していることが判明

・色々やったけど、やっぱ無理やねん、劇的な改善とはならず…。そうや、久々にネクサスでデバッグしてみよか…

・ネクサスだと改善されとる…! どの段階で良くなったのかはもう分からん

はい、この…。私の個人的な体験に加えてですよ、いくら調べてもハッキリしない真実。 そういえば、上記の問題とは別に、マップ画面開始直後にシャープの場合はなぜか落ちるので、 ちょっと小細工して落ちないように工夫したことがありましたよ、すっかり忘れていたぜ。 …シャープさんが悪いとは言い切れないんですよ、Android5.1 特有の問題かもしれないのだから。 私が国内外の機種20個くらいで、真面目に比較検討したわけではないっすからね。 とてもそこまで大がかりなテストはできない、現実的じゃない…。 こういうとき、リファレンス機があると便利です。 ネクサスで問題なく動くんだから、文句ないよね? と、考えていいわけですから。

とりあえず、ネクサスで目的のスピードが確保できたのでこれ以上この問題を掘り下げて考えることはしません。 ちなみに、FPSどれくらいなの? って思うでしょ。 私が作っております「アタックダンジョンMMF」のFPS(フレームレート)、 標準目標が10枚/秒で、シャープだと5~9です。 たったの10です。 世間的には超ロースペックですが、これを仮にFPS30のゲームとするでしょ(描画速度が出るかどうかは別として)。 例えば敵を切るアクション(斜めに線が入っていく的な)。 まあ0.3~0.5秒くらいの尺は欲しいですね。 と、いうことは9~15枚の絵を描かないといけないわけですよ。 これを、あらゆるアクションパターンに対して行う。 さらに敵の絵は地獄。 考えるだけでも恐ろしい。 だから、研究を重ねてギリギリまでFPSを少なくしました。 FPS10の場合であっても、アニメーションオブジェクトは700~800枚くらいありますからね。

たったの10ですからね、別にどうということはない処理なんですが、敵の数や描画オブジェクトが多いときは重くなりがちです。 これはマシーンの性能が悪いからではなく、設定がうまいこと機能せずに SurfaceView というパターンに対して見事にかみ合わない。 そういうことなんだと思いますけどね。 仮に普通の View で描画性能の競争をしたら、SHARPさん負けはしない、きっと勝つと。

どんな機種でも動く…は戯言なのか?

今回の出来事で分かったのは「新型が旧型に劣る場合がある」ということです。 これは結果的にそうなわけで、演算処理能力やOSのバージョンで勝っていても局地的な不利をカバーしきれないことがある。 特定の場合に限り、○○はまともに動作しない、という、ケースバイケースな感じの不安。 じゃあ、安心はできない。 メーカーといっても、日本だったらソニー、シャープ、富士通、東芝、NECくらいのものでしょうが、 世界的には Samsung、Huawei、Asus、Lenovo、Motorola、Archos、HTC、LGE、etc…いっぱいありますね。

味付けは基本します。日本のメーカーに限らず海外のメーカーも。 クセがあるっていうことですねえ、ネクサス以外は。 その結果、どのような差異が出るのか? これは誰にも分からない。

0 件のコメント:

コメントを投稿