2012/09/13(木) [n年前の日記]
#1 [as3][starling][android] Android実機でStarlingを使ったAIRアプリを動かしてみたり
Lenovo IdeaPad A1 に、Starlingを使ったAIRアプリを転送して動作確認。
さっくり60FPSが出るかと期待してたけど全然ダメだった。20FPS前後をふらふら。色々試してみたけれど、そもそも何も表示してない状態ですら50FPSに達しない。これでは下手すると、Starlingを使わずに、旧来のFlashの描画の仕方でも良かったのではないか。たしか Haxe を使って動作確認した際も、このくらいのガクガク具合で動いていたような…。
最新、かつ、そこそこ強力なスペックを持つAndroid端末上で動かせば、Starling を使うことで速度が改善する可能性はあるのかもしれないけど。ヘボい中華Padモドキでは効果がよく分からないという結果になりそうな。
一応、デバッグ用にビルドした .apk を転送したら、起動時に「OpenGL」という文字列が送られてきたので、そのあたりを使って描画してるんだろうけど…。もしかすると、OpenGL を使うと30FPSで頭打ちになるハードウェアなのかしら。昔の端末はそういう仕様だったとどこかで見かけた記憶もあるし。また、Starling関係のサンプルを眺めていると、mobile用(iOS、Android)のソレは、えてして30FPSが指定されてあるものが多いし。スマートフォンなのに60FPSを要求するほうがおかしい…?
ひとまず、試したアレコレをメモ。
さっくり60FPSが出るかと期待してたけど全然ダメだった。20FPS前後をふらふら。色々試してみたけれど、そもそも何も表示してない状態ですら50FPSに達しない。これでは下手すると、Starlingを使わずに、旧来のFlashの描画の仕方でも良かったのではないか。たしか Haxe を使って動作確認した際も、このくらいのガクガク具合で動いていたような…。
最新、かつ、そこそこ強力なスペックを持つAndroid端末上で動かせば、Starling を使うことで速度が改善する可能性はあるのかもしれないけど。ヘボい中華Padモドキでは効果がよく分からないという結果になりそうな。
一応、デバッグ用にビルドした .apk を転送したら、起動時に「OpenGL」という文字列が送られてきたので、そのあたりを使って描画してるんだろうけど…。もしかすると、OpenGL を使うと30FPSで頭打ちになるハードウェアなのかしら。昔の端末はそういう仕様だったとどこかで見かけた記憶もあるし。また、Starling関係のサンプルを眺めていると、mobile用(iOS、Android)のソレは、えてして30FPSが指定されてあるものが多いし。スマートフォンなのに60FPSを要求するほうがおかしい…?
ひとまず、試したアレコレをメモ。
- Starling の viewPortその他で画面拡大を任せず、root相当のSpriteを自前で計算して拡大縮小してみた。
- 速度はどちらも変わらなかった。もしかすると Starling 内部でも同じことをしているのかもしれない?
- 一番奥・画面全部を覆う背景を、グラデーションのQuad(矩形)で描画していたけど、それをImage(テクスチャ付きのQuad)に変更してみた。
- 微妙に速くなった。どうやら、Quad より Image のほうが速いらしい。特定色で塗り潰しをしているだけの Quad のほうが速いんじゃないかと予想してたけど、なんだか意外。ビットマップデータをひたすら転送するほうがまだ速いのだろうか。
- 半透明の指定(Quad.alpha や Image.alpha 等)を極力無くした。
- 微妙に速くなった。
- 基準画面サイズを、480x320から320x240にしてみた。
- 微妙に速くなった。
◎ 実機で動かして分かったこと。 :
実機で動かしたら、指でタップした位置と、実際に取得された座標にずれがあって悩んでしまった。例えば、左手の親指でバーチャルパッドの中心を押さえたつもりが、少し左下の位置が押されたものと判別されているようで。まあ、実際に触れているのは、親指の先・中心ではなくて、少し根元に近いほう、ということだろうけど。触ってる人間が期待しているソレと、端末が取得してる情報の間にはずれがある、ということなのかな。
何かこのあたり、細かい一工夫が必要になりそう。本来は、こういうのもキャリブレーション?する機能を入れるべきなんだろうけど。
知らない間にキャリブレーションすることもできなくはない、かもしれない。アプリ開始時から何度か各ボタンをタップさせるうちに、ボタンの中心位置からのずれを平均値にして持っておいて後で使うとか? ユーザは、ボタンをタップする際に、えてして真ん中を叩いているつもりのはず、と仮定したり。しかし、右手の人差指でタップするのと、左手の親指で押すのでは、触れる部分が違うはずで…。
何かこのあたり、細かい一工夫が必要になりそう。本来は、こういうのもキャリブレーション?する機能を入れるべきなんだろうけど。
知らない間にキャリブレーションすることもできなくはない、かもしれない。アプリ開始時から何度か各ボタンをタップさせるうちに、ボタンの中心位置からのずれを平均値にして持っておいて後で使うとか? ユーザは、ボタンをタップする際に、えてして真ん中を叩いているつもりのはず、と仮定したり。しかし、右手の人差指でタップするのと、左手の親指で押すのでは、触れる部分が違うはずで…。
[ ツッコむ ]
以上です。