Archives

October 2011 の記事

Canvas など Android の画面は CPU でレンダリングされています。
画面全体を常に書き換えているアプリは、解像度が上がるほど速度が
落ちていく可能性があります。

SurfaceView を使ったゲームアプリなど、スマートフォンではスムーズに
動いていたのに Tablet では極端に遅くなることがありました。
最近はスマートフォンの解像度も HD 化しており、Tablet と同じくらい
描画が負担になっていると考えられます。

大画面前提の Tablet 向け Android 3.x では 2.x と比べて色々と改良が
施されているようです。
その一つが 2D 描画のハードウェアアクセラレーションです。

使えるコマンドは限られますが Canvas のレンダリングも GPU による描画が
行われます。AndroidManifest.xml に android:hardwareAccelerated="true"
を追加するだけです。

Optimus Pad L-06C (Tegra 250) Android 3.1

View(SW)         15.0fps      24x24 x  1600個   13.8Mpix/sec
View(HW)         27.8fps      24x24 x  1600個   25.6Mpix/sec
SurfaceView      16.3fps      24x24 x  1600個   15.0Mpix/sec
GLSurfaceView    12.8fps      24x24 x 30000個  221.2Mpix/sec
GLSurfaceView    20.6fps      12x12 x 50000個  148.3Mpix/sec

256x256 pixel のテクスチャ画像から 24x24 pixel を切り出して、
24x24 dot の小さい正方形として描画します。
これを 1600個、ばらばらに動かしています。

SurfaceView ではハードウエアアクセラレーションが有効とならなかったため
速度が逆転しています。HW が有効なら View + onDraw() の方が高速に
描画できています。

それでも OpenGL とは比較になりません。

GLSurfaceView は Java 上で OpenGL ES 2.0 を利用しています。
速すぎて 1600個では測定出来なかったため 30000個に増やしています。
当然かもしれませんがゲームは OpenGL を使った方がよさそうです。

以下 Android 2.3 との比較。

                    View(SW)  View(HW)  SurfaceView  GLSurfaceView
            OS      x1600     x1600     x1600        x30000
------------------------------------------------------------------
OptimusPad  A3.1    15.0fps   27.8fps   16.3fps      12.8fps
HTC EVO 3D  A2.3    20.2fps   --        26.4fps      16.5fps
Galaxy S2   A2.3    31.8fps   --        44.8fps      28.1fps

今後登場する Android 4.0 (Ice Cream Sandwich) では、スマートフォンも
GPU による描画に対応します。
1280x720 など画面解像度が高い機種ほど 2.3→4.0 の差が大きいかもしれません。

Android 3.x には他にも RenderScript があります。
NDK + OpenGL ES の上位ライブラリに近く、機能が限られる代わりに
Java から容易に扱えるようになっています。
こちらも後ほど試してみたいと思っています。


iPhone 版やりこんでいたので Android 版も購入しました。
エスプガルーダⅡと怒首領蜂大復活
手持ちで対応していた端末は下記の 3台。

・Galaxy S2 SC-02C (Exynos4210)
・EVO 3D ISW12HT (MSM8660)
・Optimus Pad L-06C (Tegra250) ※2011/10/21現在 エスプガルーダIIのみ


● Galaxy S2 SC-02C

高速です。描画の処理落ちもなくタッチの遅延もなく非常に良好です。
画面はコントラストが高く他機種に比べて濃い発色となります。
気になる場合は設定→画面→スクリーンモード
HDMI アダプタを使って外部モニタでのプレイもあり。

● EVO 3D ISW12HT

推奨端末ですが描画は処理落ちがあります。
Adreno 220 は 3D 性能が高かったのでどこが原因かは不明。
タッチの遅延は少なく追従性は比較的良好です。
Rendering skip off で難易度が下がるので上達した気になる。

● Optimus Pad L-06C

エスプガルーダⅡだけですが、処理落ちもなく描画は高速です。
ただタッチパネルの入力遅延が大きく、操作に対して自機が遅れて
ついてくる動きになっています。

2011/10/26追記 怒首領蜂大復活も L-06C 対応になりました。


対応端末のスペックを調べてみました。

◎推奨端末
Galaxy S SC-02B        S5PC110 Cortex-A8 1GHz      PVR SGX540  512MB
Galaxy S2 SC-02C       S5PC210 Cortex-A9 x2 1.2GHz Mali-400MP    1GB
PHOTON ISW11M          Tegra250 Cortex-A9 x2 1GHz  ULP GeForce   1GB
EVO 3D ISW12HT         MSM8660 Scorpion x2 1.2GHz  Adreno 220    1GB

◎対応端末
Xperia arc  SO-01C     MSM8255 Scorpion 1GHz       Adreno 205  512MB
Xperia acro SO-02C     MSM8255 Scorpion 1GHz       Adreno 205  512MB
Xperia ray  SO-03C     MSM8255 Scorpion 1GHz       Adreno 205  512MB
Xperia play SO-01D     MSM8255 Scorpion 1GHz       Adreno 205  512MB
Optimus bright L-07C   OMAP3630 Cortex-A8 1GHz     PVR SGX530  512MB
Optimus Pad L-06C      Tegra250 Cortex-A9 x2 1GHz  ULP GeForce   1GB
AQUOS PHONE SH-12C     MSM8255 Scorpion 1.4GHz     Adreno 205  512MB
AQUOS PHONE SH-13C     MSM8255 Scorpion 1GHz       Adreno 205  512MB
MEDIAS WP N-06C        MSM8255 Scorpion 1GHz       Adreno 205  512MB
Panasonic P-07C        OMAP3630 Cortex-A8 1GHz     PVR SGX530  512MB
FUjitsu F-12C          MSM8255 Scorpion 1GHz       Adreno 205  512MB
Galaxy Tab SC-01C      S5PC110 Cortex-A8 1GHz      PVR SGX540  512MB

SHARP IS05             MSM8655 Scorpion 1GHz       Adreno 205  512MB
Xperia acro IS11S      MSM8655 Scorpoin 1GHz       Adreno 205  512MB
AQUOS PHONE IS11SH     MSM8655 Scorpion 1.4GHz     Adreno 205  512MB
AQUOS PHONE IS12SH     MSM8655 Scorpion 1.4GHz     Adreno 205  512MB
INFOBAR A01            MSM8655 Scorpion 1.4GHz     Adreno 205  512MB
G'zOne IS11CA          MSM8655 Scorpion 1GHz       Adreno 205  512MB
REGZA Phone IS11T      MSM8655 Scorpion 1.4GHz     Adreno 205  512MB
MIRACH IS11PT          MSM8655 Scorpion 1.0GHz     Adreno 205  512MB

Desire HD 001HT        MSM8255 Scorpion 1GHz       Adreno 205  768MB
GALAPAGOS 003SH        MSM8255 Scorpion 1GHz       Adreno 205  512MB
GALAPAGOS 005SH        MSM8255 Scorpion 1GHz       Adreno 205  512MB
AQUOS PHONE 006SH      MSM8255 Scorpion 1.4GHz     Adreno 205  512MB
AQUOS HYBRID 007SH     MSM8255 Scorpion 1GHz       Adreno 205  512MB
Sweety 003P            OMAP3630 Cortex-A8 1GHz     PVR SGX530  512MB
ZTE 008Z               MSM8255 Scorpion 1GHz       Adreno 205  512MB
Vision 007HW           MSM8255 Scorpion 1GHz       Adreno 205  512MB
AQUOS PHONE 009SH      MSM8255 Scorpion 1GHz       Adreno 205  512MB
DM009SH                MSM8255 Scorpion 1GHz       Adreno 205  512MB

端末一覧と比べてみると、ちょうど Adreno 205/PVR SGX530 以上の端末が
動作対象となっています。
CPU/GPU 等の搭載プロセッサで線引きが行われているようです。

GPU 性能で下記のようにグループ分けしてみました。
Group 2 以上が今回の動作対象となっています。

GPU別
G3   | Adreno 220, PVRSGX543MP2, Mali-400MP
G2   | Adreno 205, PVRSGX530/535/540, ULP GeForce(Tegra250)
G1   | Adreno 200, Z430
G0   | ARMv6 (ARM11)

Chip (CPU)
G3   | MSM8260/8660, Exynos4210, A5
G2.5 | Tegra250
-------- ↑ Dual core CPU ------------------------
G2   | MSM8255/8655, S5PC110, OMAP3630, A4
G1   | QSD8250/8650, i.MX515
-------- ↑ ARMv7 --------------------------------
G0   | MSM7227, MSM7225


関連エントリ
iPhone 3GS エスプガルーダII ESPGALUDA2


Emulator (AVD) が ARMv7 になっているようです。
neon ありでデフォルトの RAM 容量も 512MB。
(以前は ARMv5TE)

Processor	: ARMv7 Processor rev 0 (v7l)
BogoMIPS	: 405.50
Features	: swp half thumb fastmult vfp edsp neon vfpv3 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xc08
CPU revision	: 0

ndk も armeabi-v7a のまま走らせられるようになります。


SDK Manager 周りの UI が変更されているようです。
下記インストール手順のページを修正しました。

Android SDK/NDK install 方法



Android の OpenGL ES 2.0 対応は OS 2.0 Eclair からです。
まず NDK で使えるようになり、2.2 Froyo (API Level 8) では Java からも
呼び出せるようになっています。
実際に使ってみました。

2.0 への切り替えは GLSurfaceView の setEGLContextClientVersion( 2 ) です。

public class MarkerView extends GLSurfaceView {
    public MarkerView( Context context ) {
        super( context );
        setEGLContextClientVersion( 2 );    // GLES 2.0
        setRenderer( new MarkerRenderer( context ) );
    }
}

GLSurfaceView.Renderer には GL10 の interface が引数で渡されますが使いません。
android.opengl.GLES20 の static メソッドをそのまま呼び出します。

public class MarkerRenderer implements GLSurfaceView.Renderer {

  ~

    public void onSurfaceChanged( GL10 ugl, int w, int h ) {
        GLES20.glViewport( 0, 0, w, h );
    }

    public void onDrawFrame( GL10 ugl ) {
        GLES20.glClearColor( 0.0f, 0.0f, 0.5f, 0.0f );
        GLES20.glClear( GLES20.GL_COLOR_BUFFER_BIT|GLES20.GL_DEPTH_BUFFER_BIT );

        GLES20.glEnable( GLES20.GL_CULL_FACE );
        GLES20.glFrontFace( GLES20.GL_CW );
        GLES20.glCullFace( GLES20.GL_BACK );

        ~
        GLES20.glBindBuffer( GLES20.GL_ELEMENT_ARRAY_BUFFER, ibuffer );
        GLES20.glDrawElements( GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, 0 ); // ← できない
    }
}

試してみて気がついたのですが、Android 2.2 の Java からは
VertexBuffer/IndexBuffer (VBO) が使えないようです。

glVertexAttribPointer() や glDrawElements() の最後の引数に、
NULL やアドレスのオフセットを与えることができないからです。

Android 2.3 (API Level 9) では修正されており、足りない命令が追加
されていました。

↓また下のスライドに説明があります。

io2011-opengl-for-android

Android 2.2 の場合は、glVertexAttribPointer() / glDrawElements()
の 2命令を jni (NDK) を使って自分で作ればこの問題を回避できるそうです。


親指 Pie さんの下記のページを参考にさせて頂きました。

親指Pie OpenWnnのビルド

簡単にビルドできることがわかったので書いておきます。
Android 自体のビルドは不要です。


(1) Android ソースリスト入手

下記のページの通り進めます。
VirtualBox + Ubuntu 11.04 x64 (natty) を使いました。

Android open source project : Initializing a Build Environment

注意: 2011/09/30 現在 android.git.kernel.org にアクセスできないようです。
(この記事の手順を確認したのは 2011/09/01)


(2) OpenWnn の参照

個別ビルドするため別の場所に移動します。Windows でも構いません。
ソースコード中 packages/inputmethods/OpenWnn フォルダをまるごと任意の
場所にコピーします。

コピーしたあと OpenWnn の中のフォルダ libs を jni にリネームします。


(3) Android SDK/NDK install

Android のアプリケーション開発環境を整えます。
SDK と NDK 両方必要です。

Android SDK/NDK install から実機の接続、サンプルの実行まで


(4) ビルド

ndk を使った通常のアプリと同じ手順でビルドできます。
以下 Windows を想定。

プロジェクト作成

 1. Eclipse 起動
 2. File → New → Project
 3. Android を開いて Android Project を選択して [Next]
 4. Create project from existing source を選択
 5. Browse.. ボタンで OpenWnn フォルダを選択して [OK]
 6. Android 2.2 を選択して [Finish]

NDK でコンパイル

 1. cygwin shell で OpenWnn フォルダに移動
 2. ndk-build を実行 ( ~/android-ndk-r6b/ndk-build を実行)

Eclipse 上でビルド&実行

 1. プロジェクト (default だと OpenWnnControlPanelJAJP) を選択して
   右ボタンのメニューから「Refresh」を実行
 2. 同じようにプロジェクトの右ボタンメニューから
   Run As → Android Application
 3. Emulator or 実機の設定画面から Japanese IME を有効にする