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


テクスチャ負荷が高いケースでのテスト

GPU             fps       display pix/sec
--------------------------------------------------
Adreno 220      28.88fps  960x540  15.0M
Mali-400MP      20.08fps  800x480   7.7M  
ULP GeForce(8)   4.37fps 1280x752   4.2M  (Tegra250)
PVR SGX543MP2   20.65fps 1024x768  16.2M
PVR SGX535       8.70fps  480x320   1.3M

背景データ
 ・170000 ポリゴン
 ・1024x1024 カラーテクスチャ 5枚
 ・2048x2048 非圧縮ノーマルマップ 2枚
 ・ライティングあり(directional x2 + point x1)

キャラクタ
 ・10000ポリゴン前後 x5 (animation あり)
 ・ColorMap + NormalMap + SpecularMap
 ・ライティングあり(directional x2 + point x1)

背景の normal map は非圧縮 mip 無しで 1枚 12MByte もあります。
それでも Adreno 220/PVR SGX543MP2 はよくこの速度で動いています。

Color Texture の一部は alpha が入っており、
ETC1 しか使えない Mali-400MP では圧縮できませんでした。
このあたりが速度に影響しているかもしれません。

                alpha無し      alpha 1bit     alpha
---------------------------------------------------------
Mali-400MP      ETC1  4bpp     非圧縮         非圧縮
Adreno 220      ATC   4bpp     ATCA  8bpp     ATCI  8bpp
ULP GeForce     DXT1  4bpp     DXT1  4bpp     DXT5  8bpp
PVR SGX543MP2   PVRTC 4bpp     PVRTC 4bpp     PVRTC 4bpp

圧縮テクスチャ対応表

高負荷で長時間走らせていると端末も結構熱を持ちます。
Tablet は大丈夫ですが、うっかり雑誌の上においた EVO 3D が熱くなり
LED が点滅してました。


関連エントリ
頂点性能の比較 その2 (OpenGL ES 2.0 Mobile GPU)
OpenGL ES 2.0 Mobile GPU の頂点性能を比較する
A5 PowerVR SGX543MP2 は iOS 5 だと速い
さらに OpenGL ES 2.0 Mobile GPU の速度比較
OpenGL ES 2.0 Mobile GPU の速度比較 (dual core世代) 更新


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) を使って自分で作ればこの問題を回避できるそうです。


最適な頂点形式を割り出すため strip 変換時のパフォーマンスも調べて
みました。

          Mali-   Adreno  Adreno  AMD     ULP      PVR SGX  PVR
          400MP   220     200     Z430    GeForce  543MP2   SGX535
-------------------------------------------------------------------
List       9.07   29.49*   1.71    2.34   20.96    57.08*   14.51*
NStripC   16.42   25.81    3.09    4.30   24.28*   50.96    12.18
NStripL   18.11*  24.38    4.05    5.52   21.02    56.08    14.20
QStrip    17.20   18.41    4.14*   5.79*  21.18    56.06    14.20

単位は fps (大きい方が速い)

テスト条件は前回と同じです。
50880ポリゴンの球モデルを 22個、画面あたり 1119628ポリゴンの描画を
行なっています。

各 GPU 毎に最も高速だった項目に '*' マークをつけています。

各項目の詳細は下記のとおりです。

format   indices   DrawElements
----------------------------------------------------------------------
List      152640   GL_TRIANGLES        無変換 (v-cache hit率 66% 前後)
NStripC    74766   GL_TRIANGLE_STRIP   NVIDIA NvStrip。Cache 優先
NStripL    52873   GL_TRIANGLE_STRIP   NVIDIA NvStrip。長さ優先に修正
QStrip     51518   GL_TRIANGLE_STRIP   Qualcomm Qstrip 使用。

List よりも Strip の方が速いのは
Mali-400MP, ULP GeForce(Tegra2), Adreno 200 の 3種類です。
(AMD Z430 は Adreno 200 とほぼ同一のものです)

逆に Strip 化で速度が落ちたのは Adreno 220, PowerVR です。
この両者は適量の Vertex Cache が搭載されていると考えて間違い無いでしょう。

Strip の方が速い GPU でも、興味深いことに最適なフォーマットがどれも
ばらばらでした。

Mali-400MP = NStripL
ULP GeForce = NStripC
Adreno200/Z430 = QStrip

以下細かく見ていきます。


● Mali-400MP

頂点性能がぱっとしませんでしたが Strip 化で大きくスコアが伸びました。
実測で 20.3M tri/sec まで出せることが確認できました。
List 比 2倍程度なので V-Cache が全く無いわけではなさそうです。

NStripL は cache を無視して出来るだけ長くつながるよう NvStrip を設定
したものです。
同様に長さ優先と思われる QStrip ではなぜか速度が落ちました。


● ULP GeForce(8) (Tegra2)

さすが NVIDIA 製ツールと相性が良いです。
NvStrip の通常設定で一番スコアが伸びました。

Strip の方が高速ですが速度向上率が 16% と小さいため、V-Cache を搭載
しつつ、さらに Strip も速いハードだと考えられます。

たとえぶつ切りでも Cache 効率を優先して並べ変えた NStripC が速く、
無駄な index が無い NStripL/QStrip はかえって速度が落ちることに
なっています。


● Adreno 200/Adreno 205/AMD Z430

Strip 化でおよそ 2.4倍と大幅に伸びています。
このことから基本的に V-Cache が無く、Strip 化することで約 3倍まで
近づくハードウエアであると考えられます。

当然のように Qualcomm 製ツールで変換した場合が最も良い結果となっています。

ただし同じ Qualcomm でも、新型の Adreno 220 では逆に速度が落ちて
しまうので要注意です。


● PowerVR SGX535/SGX543MP2

List の方が高速です。
ただし今回のデータは List でも 66% と Cache hit 率が strip 相当なので
思ったより差が出ていません。

Cache 最適化された NStripC よりも、無駄な index が無い NStripL/QStrip
の方が速度が出ています。縮退 Triangle の効率が悪いのか、Index 転送量の
問題なのかわかりません。

SGX535 は iPod touch3/4 共に同じ数値でした。
画面解像度が影響せず、実行時間をほとんど頂点が占めていることがわかります。


● Adreno 220

List の方が高速です。
V-Cache 搭載 GPU として最も予想通りの結果で、どうすれば速いのか、
何をすれば遅くなるのか感覚的にも受け入れやすいものとなっています。

またこの結果から、Adreno 200/205 と Adreno 220 との間には
アーキテクチャ的な大きな変更があったことがわかります。

Adreno 200 向け最適化 (Qstrip) を行うと cache 効率が下がって却って
速度が落ちます。


●結論

全てに都合の良い頂点形式はありませんでした。
ぎりぎりの頂点性能を求めるなら各 GPU 毎に変換する必要があります。

最低限の頂点性能で幅広いハードで動作することを優先するなら、
遅い GPU の底上げ(Qstrip)でしょうか。

Adreno のように今後は速いペースで GPU の機能が desktop GPU に追いついて
いく事が考えられます。将来を視野に入れたデータ構造にするなら
Cache 優先の List になるでしょう。

ただ現状は頂点よりも圧倒的に pixel の方が速度を圧迫しているため、
このような頂点構造の違いは大した問題ではないかもしれません。

Mobile GPU 速度比較のまとめ

テスト機材一覧
 Mali-400MP         Exynos 4210   Samsung Galaxy S2 SC-02C
 Adreno 220         MSM8660       HTC EVO 3D ISW12HT
 Adreno 200         QSD8250       HTC Desire X06HT
 AMD Z430           i.MX51        Creative ZenTouch2
 ULP GeForce        Tegra 250     Acer ICONIA TAB A500
 PowerVR SGX543MP2  A5            Apple iPad2
 PowerVR SGX535     A4/S5PC100    Apple iPod touch4/iPod touch3


関連エントリ
OpenGL ES 2.0 Mobile GPU の頂点性能を比較する
A5 PowerVR SGX543MP2 は iOS 5 だと速い
さらに OpenGL ES 2.0 Mobile GPU の速度比較
OpenGL ES 2.0 Mobile GPU の速度比較 (dual core世代) 更新
Android HTC EVO 3D GPU Adreno 220 の速度


前回までのテストはピクセル性能に左右されていたため、ほぼ頂点だけの
描画を行ってみました。

GPU           Processor    Sh Unit   OS    display    fps   tri/sec
--------------------------------------------------------------------------
Mali-400MP    Exynos 4210  discrete  A2.3  480x800    9.21  10.3M (1031万)
Adreno 220    MSM8660      unified   A2.3  540x960   29.50  33.0M (3303万)
ULP GeForce   Tegra 250    discrete  A3.1  800x1232  20.85  23.3M (2334万)
PVR SGX543MP2 A5           unified   i5.0  768x1024  56.10  62.8M (6281万)

50880 ポリゴン(25919頂点) の球のモデルを 22個表示しています。
シーン内合計 1119360ポリゴン。

Fragment Shader はライティングなし、テクスチャなし、描画面積を減らすため
中央に小さく表示。
頂点フォーマットは float x 3 の座標値のみ。(stride = 12byte)
Vertex Shader は vec4 * mat4 だけの単純なものです。

球のモデルデータなので共有頂点が多く、Vertex Cache が有効な GPU にとっては
理想的なデータです。
頂点数は 25919 なので、もし仮に V-Cache が完全に hit したと考えると
1ポリゴンあたり 1頂点未満で描画できる計算になります。
実際にシミュレートしてみると 66% hit、つまり strip 変換相当でした。

ただしテストした GPU にどれだけ V-Cache が搭載されているか判明していません。
Strip 変換していないため、もし V-Cache 無しの GPU の場合は本来の能力を
発揮できていないことになります。
この場合はおそらくピーク性能の 1/3 程度の結果になっていると考えられます。

また GPU の Shader Unit の構造に注意してください。
GPU が Unified Shader の場合はおそらく突出した数値が出ていますが現実的
ではありません。
本来 Fragment Shader として機能する分の演算能力の多くが頂点に割り振られて
いると考えられるからです。
一般的な描画のシーンではピクセルの面積分だけ頂点性能が削られます。


● Mali-400MP

描画面積の多いシーンでは最強だった Mali-400MP の意外な弱点が判明しました。
Mali-400MP の構成を見ると、
Vertex Processor x 1 + Fragment Processor x 1~4
という構造になっているようです。MP4 なら Fragment Processor x4 です。
頂点 Unit 自体の個数は変化しません。

頂点性能をそこまで求めない代わりにピクセル性能が高く、比較的長い
Fragment Shader を走らせても動作効率が落ちませんでした。
このことから、ピクセル性能重視型 GPU として設計してあるようです。

おそらく Fragment Shader で様々なテクニックを駆使して絵作りを行うべき
GPU だと言えるでしょう。(ただし mediump のみ)

スマートフォンやタブレットなど、GPU 性能の向上よりも速いペースで解像度が
増加したため、用途として非常にバランスが良かったのだと思われます。

こちらによればピーク値 30M tri/s だそうです。


● Tegra 250

Mali とは逆に予想以上の数値を出したのが Tegra2 です。
Mali 同様 discrete タイプで「後藤弘茂のWeekly海外ニュース」によると
Shader の core は Vertex 4unit、Pixel 4unit とのこと。

おそらく Fragment Shader のシェーディングで工夫するよりもハイポリゴンに
した方が綺麗な絵が出せる GPU だといえます。

次の Kal-El (Tegra3) は Vertex unit そのままで Pixel Unit が 2倍になる
らしいので、弱点を補う意味でも理にかなった拡張です。


● Adreno 220

Unified Shader なのでこの値は控えめに見積もってください。
他の GPU が比較的一点集中型で、得意な項目と苦手な点がはっきりしている
のに対して、どのテストでもそつなく高い数値を出す傾向があります。

ピークが突出していない代わりに速度が落ちにくいバランスとなっているようです。
唯一 Vertex Texture が使えたり、Pixel 演算も highp で高精度だったりと
機能面でも手を抜いておらず、たいへん扱いやすい GPU です。


● PVR SGX543MP2

ピクセル負荷が減ると極端に速度が向上する特性を示していましたが、
頂点数が増えてもその傾向は変わらないようです。
Unified Shader なので通常利用時の性能ではありませんが、潜在能力が
高いのは間違いありません。

ピーキーな特性で、特に Fragment Shader の最適化は僅かな修正でも大きな
違いとなって現れます。
頂点とピクセルのバランス取りなど、使いこなしはまさに利用者の腕次第と言った
感じです。


今回のテスト結果を下記のページに追加しました。

Mobile GPU 速度比較のまとめ


関連エントリ
A5 PowerVR SGX543MP2 は iOS 5 だと速い
さらに OpenGL ES 2.0 Mobile GPU の速度比較
OpenGL ES 2.0 Mobile GPU の速度比較 (dual core世代) 更新
Android HTC EVO 3D GPU Adreno 220 の速度
OpenGL ES 2.0 shader の演算精度
Android Galaxy S2 ARM Mali-400 MP は速い (2)


iPad2 を iOS5 にアップデートしたら 3D の描画性能が大幅に向上しました。
テスト内容は前回までと同じです。

iPad2 ( A5 : PowerVR SGX543MP2 )

(1) light 3 + shadow map
------------------------------------
iOS 5    15.81 fps      13.0Mpix/sec
iOS 4    11.83 fps      12.4Mpix/sec


(2) light 3
------------------------------------
iOS 5    20.67 fps      16.3Mpix/sec
iOS 4    15.27 fps      12.0Mpix/sec


(3) light 1
------------------------------------
iOS 5    57.04 fps      44.9Mpix/sec
iOS 4    45.49 fps      35.8Mpix/sec

iOS5 では 15fps → 20fps 、 45fps → 57fps とスコアが伸びています。

iOS5 ではドライバレベルで大きく手が加えられているようです。

まず OpenGL が返す Extension List が増えています。
Extension の中身は下記のページに追加しました。

Mobile CPU/GPU の詳細 OpenGL Extension など

さらにレンダリング可能な解像度と最大テクスチャサイズも 2048 から 4096 へと
拡張されました。

iOS4 までは互換性重視なのか PowerVR SGX535 と全く同じ値を返していました。
iOS5 でやっと PowerVR SGX543MP 本来の能力を引き出せるようになったのかもしれません。

速度に大きな差があることから、シェーダーコンパイラの最適化がより進んだ
可能性があります。

残念ながら PowerVR SGX535 搭載の iPod tpuch3/4 では iOS5 に更新しても
速度は変わりませんでした。


今までのテスト結果を下記のページにまとめました。

Mobile GPU 速度比較のまとめ

シェーダー負荷が小さいケースではおそらく PowerVR SGX543MP2 の圧勝です。
重いシェーダーでは Mali-400MP, Adreno 220 に届きませんが差は縮まっています。
やはりこの 3 GPU が現段階での最速候補のようです。


関連エントリ
さらに OpenGL ES 2.0 Mobile GPU の速度比較
OpenGL ES 2.0 Mobile GPU の速度比較 (dual core世代) 更新
Android HTC EVO 3D GPU Adreno 220 の速度
OpenGL ES 2.0 shader の演算精度
Android Galaxy S2 ARM Mali-400 MP は速い (2)


single core CPU 世代の GPU 結果も追加しました。

(1) light 3 + shadow map  (ambient + directional x2 + point)

GPU          OS    fps     display  pix/sec   framebuffer
---------------------------------------------------------------------
Mali-400MP   A2.3  38.96   480x800   15.0M    565   24 8  Exynos 4210
Mali-400MP   A2.3  38.96   480x800   15.0M    8888  24 8  Exynos 4210
Adreno 220   A2.3  27.50   540x960   14.3M    565   16 0  MSM8660
Adreno 220   A2.3  25.00   540x960   13.0M    8888  24 8  MSM8660
SGX 543MP2   i4.3  11.83  768x1024    9.3M    8888  24 8  A5
ULP GeForce  A2.2   8.00  600x1024    4.9M    565   16 0  Tegra 250
ULP GeForce  A2.2   8.00  600x1024    4.9M    8888  16 8  Tegra 250
ULP GeForce  A3.1   5.80  800x1232    5.7M    565   16 0  Tegra 250
ULP GeForce  A3.1   5.65  800x1232    5.6M    8888  16 8  Tegra 250
SGX 535      i4.3   4.04   640x960    2.5M    8888  24 8  A4
SGX 535      i4.3  11.08   320x480    1.7M    8888  24 8  S5PC100
Adreno 200   A2.2   3.12   480x800    1.2M    565   16 0  QSD8250


(2) light 3  (ambient + directional x2 + point)

GPU          OS    fps     display  pix/sec   framebuffer
---------------------------------------------------------------------
Mali-400MP   A2.3  42.30   480x800   16.2M    8888  24 8  Exynos 4210
Adreno 220   A2.3  36.27   540x960   18.8M    8888  24 8  MSM8660
Adreno 220   A2.3  32.50   540x960   16.8M    8888  24 8  MSM8660
SGX 543MP2   i4.3  15.27  768x1024   12.0M    8888  24 8  A5
ULP GeForce  A2.2   9.50  600x1024    5.8M    565   16 0  Tegra 250
ULP GeForce  A3.1   5.90  800x1232    5.8M    565   16 0  Tegra 250
ULP GeForce  A3.1   5.74  800x1232    5.7M    8888  16 8  Tegra 250
SGX 535      i4.3   4.76   640x960    2.9M    8888  24 8  A4
SGX 535      i4.3  14.75   320x480    2.3M    8888  24 8  S5PC100
Adreno 200   A2.2   3.52   480x800    1.4M    565   16 0  QSD8250


(3) light 1  (ambient + directional)

GPU          OS    fps     display  pix/sec   framebuffer
---------------------------------------------------------------------
Mali-400MP   A2.3  59.95   480x800  算出不可  8888  24 8  Exynos 4210
Adreno 220   A2.3  55.36   540x960   28.7M    565   16 0  MSM8660
Adreno 220   A2.3  48.20   540x960   25.0M    8888  24 8  MSM8660
SGX 543MP2   i4.3  45.49  768x1024   35.8M    8888  24 8  A5
ULP GeForce  A2.2  17.10  600x1024   10.5M    565   16 0  Tegra 250
ULP GeForce  A3.1  13.00  800x1232   12.8M    565   16 0  Tegra 250
ULP GeForce  A3.1  12.10  800x1232   11.9M    8888  16 8  Tegra 250
SGX 535      i4.3  12.78   640x960    7.9M    8888  24 8  A4
SGX 535      i4.3  30.00   320x480    4.6M    8888  24 8  S5PC100
Adreno 200   A2.2   6.04   480x800    2.3M    565   16 0  QSD8250


(4) light 0

GPU          OS    fps     display  pix/sec   framebuffer
---------------------------------------------------------------------
Mali-400MP   A2.3  59.94   480x800  算出不可  8888  24 8  Exynos 4210
Adreno 220   A2.3  60.00   540x960  算出不可  565   16 0  MSM8660
Adreno 220   A2.3  60.00   540x960  算出不可  8888  24 8  MSM8660
SGX 543MP2   i4.3  60.00  768x1024  算出不可  8888  24 8  A5
ULP GeForce  A3.1  46.85  800x1232   46.2M    565   16 0  Tegra 250
ULP GeForce  A3.1  34.35  800x1232   33.9M    8888  16 8  Tegra 250
SGX 535      i4.3  52.13   640x960   32.0M    8888  24 8  A4
SGX 535      i4.3  60.00   320x480  算出不可  8888  24 8  S5PC100
Adreno 200   A2.2  11.60   480x800    4.5M    565   16 0  QSD8250


OS = A:Android, i:iOS
framebuffer = color depth stencil

画面解像度が異なるため fps で速度を比べることができません。
比較する場合は pix/sec の数値を見てください。
ただしシーンにはポリゴンの重なりがあるので厳密ではありません。

補足が多数あるので前回の記事もあわせてご参照ください。

GPU や転送能力と比べて解像度が高い傾向があるため、実行時間のほとんどが
ピクセルで費やされていることがわかります。(1)→(4) とピクセルシェーダー
(Fragment Shader) の負荷を軽くするとその傾向は下がります。

やはり GPU のおおまかなグループ分けとしては下記の 3つでだいたい合っている
ように思います。

低速
↑  Group 1 | Adreno 200
|  Group 2 | Adreno 205 / PowerVR SGX 535,540 / ULP GeForce(Tegra 250)
↓  Group 3 | Adreno 220 / PowerVR SGX 543MP2 / Mali-400MP
高速


関連エントリ
OpenGL ES 2.0 Mobile GPU の速度比較 (dual core世代) 更新
Android HTC EVO 3D GPU Adreno 220 の速度
OpenGL ES 2.0 shader の演算精度
Android Galaxy S2 ARM Mali-400 MP は速い (2)


GPU の速度をもう少し詳しく調べてみました。

(1) light 3 + shadow map  (ambient + directional x2 + point)

GPU          OS    fps     display  pix/sec   framebuffer
---------------------------------------------------------------------
Mali-400MP   A2.3  38.96   480x800   15.0M    565   24 8  Exynos 4210
Mali-400MP   A2.3  38.96   480x800   15.0M    8888  24 8  Exynos 4210
Adreno 220   A2.3  27.50   540x960   14.3M    565   16 0  MSM8660
Adreno 220   A2.3  25.00   540x960   13.0M    8888  24 8  MSM8660
SGX 543MP2   i4.3  11.83  768x1024    9.3M    8888  24 8  A5  (2011/10/12修正)
ULP GeForce  A2.2   8.00  600x1024    4.9M    565   16 0  Tegra 250
ULP GeForce  A2.2   8.00  600x1024    4.9M    8888  16 8  Tegra 250
ULP GeForce  A3.1   5.80  800x1232    5.7M    565   16 0  Tegra 250
ULP GeForce  A3.1   5.65  800x1232    5.6M    8888  16 8  Tegra 250


(2) light 3  (ambient + directional x2 + point)

GPU          OS    fps     display  pix/sec   framebuffer
---------------------------------------------------------------------
Mali-400MP   A2.3  42.30   480x800   16.2M    8888  24 8  Exynos 4210
Adreno 220   A2.3  36.27   540x960   18.8M    8888  24 8  MSM8660
Adreno 220   A2.3  32.50   540x960   16.8M    8888  24 8  MSM8660
SGX 543MP2   i4.3  15.27  768x1024   12.0M    8888  24 8  A5  (2011/10/12修正)
ULP GeForce  A2.2   9.50  600x1024    5.8M    565   16 0  Tegra 250
ULP GeForce  A3.1   5.90  800x1232    5.8M    565   16 0  Tegra 250
ULP GeForce  A3.1   5.74  800x1232    5.7M    8888  16 8  Tegra 250


(3) light 1  (ambient + directional)

GPU          OS    fps     display  pix/sec   framebuffer
---------------------------------------------------------------------
Mali-400MP   A2.3  59.95   480x800  算出不可  8888  24 8  Exynos 4210
Adreno 220   A2.3  55.36   540x960   28.7M    565   16 0  MSM8660
Adreno 220   A2.3  48.20   540x960   25.0M    8888  24 8  MSM8660
SGX 543MP2   i4.3  45.49  768x1024   35.8M    8888  24 8  A5  (2011/10/12修正)
ULP GeForce  A2.2  17.10  600x1024   10.5M    565   16 0  Tegra 250
ULP GeForce  A3.1  13.00  800x1232   12.8M    565   16 0  Tegra 250
ULP GeForce  A3.1  12.10  800x1232   11.9M    8888  16 8  Tegra 250


(4) light 0

GPU          OS    fps     display  pix/sec   framebuffer
---------------------------------------------------------------------
Mali-400MP   A2.3  59.94   480x800  算出不可  8888  24 8  Exynos 4210
Adreno 220   A2.3  60.00   540x960  算出不可  565   16 0  MSM8660
Adreno 220   A2.3  60.00   540x960  算出不可  8888  24 8  MSM8660
SGX 543MP2   i4.3  60.00  768x1024  算出不可  8888  24 8  A5  (2011/10/12修正)
ULP GeForce  A3.1  46.85  800x1232   46.2M    565   16 0  Tegra 250
ULP GeForce  A3.1  34.35  800x1232   33.9M    8888  16 8  Tegra 250


OS = A:Android, i:iOS
framebuffer = color depth stencil

(※ 2011/10/12更新 表のデータを追加しました)

それぞれ機種ごとに解像度が違うので、フレームレート(fps)での比較が
できないことに注意してください。

頂点よりもピクセル負荷の方が高いため、秒間の描画ピクセル数に変換しました。
pix/sec の数値を比べてください。

あくまで自作プログラム+自前シーンでの比較なので参考程度にお願いします。


●補足事項など

ARMv7 Cortex-A9 dual core (or Scorpion dual core) 相当の CPU
搭載機のみピックアップしています。CPU の動作クロックはそれぞれ異なります。

Android は OS2.2 ターゲットで NDK + OpenGL ES 2.0 を使っています。
armeabi-v7a の NEON 無しです。

背景込ですべてピクセル単位のライティングを行なっています。
シェーダーに動的分岐はありません。

Tegra2 は depth_texture が使えないため shadow map で同一条件の
比較ができません。(1) では texture_half_float を使っており他の GPU より
負荷が高くなります。

Tegra2 は 16bit depth しか選択することができません。
逆に Mali-400MP 等は 24bit depth + 8bit stencil しか選択できません。

543MP2 はプラットフォーム(OS) が異なりますが、完全に同一コード+
同一シェーダーで走らせています。ただし完全に同一状態とは言い切れない
ので、実際の数値はもう少し変動するかもしれません。

テクスチャはできる限り GPU 専用の圧縮フォーマットに変換しています。
DXT(S3TC), PVR, ATC, ETC1 の 4フォーマット対応です。

(3) で Mali-400MP の pix/sec が算出不可能なのは 60fps の上限に張り付いて
しまっているからです。

ポリゴンの重なりが多少あるので画面サイズから求めた pix/sec は厳密な値では
ありません。が、TBDR の PowerVR のようにポリゴンの重なりで Shader が無駄に
走らないことを特徴としている GPU もあるためそのまま比べます。



●テスト結果について

描画面積で速度が決まっており、ボトルネックは完全にピクセル負荷
(Fragment Shader) となっています。
(1), (2) などシェーダーが複雑になるほどテクスチャサイズの影響が無くなる
ため、純粋に Fragment Shader が複雑すぎるようです。

PowerVR, Tegra2 など precision 宣言が有効な GPU ほど速度が出ていない
のでシェーダー最適化が不十分で能力を発揮できていない可能性があります。

PVR SGX 543MP は (1) を見ると低速に見えますが、Fragment Shader の
複雑さが下がるほど急激に速度が上がっています。
(3) では上位 GPU にほぼ匹敵していることがわかります。
(4) では逆転するかもしれません。
最適化が足りないか、または実行命令ステップ数の影響を受けやすい GPU のようです。

Mobile GPU ではこの面積で (1),(2) のような複雑なシェーダーを走らせる
ことが想定されていなかったのかもしれません。
それでも Mali, Adreno 220 は意外なほどよく動いています。

Tegra2 はあまり良い結果が出ていませんが、1年以上前から製品に載っている
プロセッサなので、GPU 自体は一世代前のグループに属するのだと考えられます。
年内に出る Tegra3 と比べるべきかもしれません。

ゲームで互換性を考えるとおそらく (3)~(4) の範囲で作ることになるかと思います。
しかしながら Mali-400MP や Adreno 220 など新しい世代の GPU は
複雑なシェーダーでも非常によく動いています。
Mobile のゲームも、もう一段階上の表現が十分可能になってきているといえます。


これまでの結果から大体の GPU 速度のグループ分けは下記のとおりです。

Group 1 | Adreno 200
Group 2 | Adreno 205 / PowerVR SGX 535,540 / Tegra 250
Group 3 | Adreno 220 / PowerVR SGX 543MP2 / Mali-400MP


以下 2011/10/12 22:00 追記

iOS 時の計測方法に問題があったため表の数値を変更しました。
PowerVR SGX 543MP2 の数値が大きく増えています。
さらに PVR 向けに shader 最適化の余地があったため修正しました。

その結果、予想通りシェーダー負荷が軽くなるほど SGX543MP2 の数値は
高くなっており (3) で Adreno 220 を超えています。
Group 3 世代の性能を持っているといえます。

表 (2),(3),(4) のテスト結果も追加しました。



関連エントリ
Android HTC EVO 3D GPU Adreno 220 の速度
OpenGL ES 2.0 shader の演算精度
Android Galaxy S2 ARM Mali-400 MP は速い (2)


HTC EVO 3D の 3D 描画能力のテスト。
第三世代の Snapdragon で、Adreno 220 を搭載しています。
以前の比較とはシェーダーが多少違います。

Mali-400MP 800×480 : 56fps  (20.5Mpix/sec)  Exynos 4210 S5PC210 1.2GHz
Adreno 220 960×540 : 39fps  (19.4Mpix/sec)  Snapdragon MSM8660 1.2GHz

背景+複数キャラクタ+ライティング+Shadow map あり。
画面サイズが違うので単純には比較できませんが、秒間のピクセル数に
変換しても Mali-400MP には及びませんでした。

ただし Adreno は mobile GPU の中でも描画機能が非常に充実しており
ピクセルの演算精度も高くなっています。
第二世代の Adreno 205 (Snapdragon MSM8255 1GHz) 比では 2倍以上高速
なので十分良い数値と言えます。

以下は分岐を伴う、より複雑なライティングのシェーダーでのテスト。

Mali-400MP 800×480 : 19.6fps  (7.2Mpix/sec)
Adreno 220 960×540 : 13.7fps  (6.8Mpix/sec)

下記ページにも追加しています。
OpenGL ES 2.0 Mobile GPU 比較
Mobile GPU Extension


関連エントリ
OpenGL ES 2.0 shader の演算精度
Android Galaxy S2 ARM Mali-400 MP は速い (2)


親指 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 を有効にする