2011/10/25
Android 3.x 描画 API の比較
Canvas など Android の画面は CPU でレンダリングされています。
画面全体を常に書き換えているアプリは、解像度が上がるほど速度が
落ちていく可能性があります。
SurfaceView を使ったゲームアプリなど、スマートフォンではスムーズに
動いていたのに Tablet では極端に遅くなることがありました。
最近はスマートフォンの解像度も HD 化しており、Tablet と同じくらい
描画が負担になっていると考えられます。
大画面前提の Tablet 向け Android 3.x では 2.x と比べて色々と改良が
施されているようです。
その一つが 2D 描画のハードウェアアクセラレーションです。
使えるコマンドは限られますが Canvas のレンダリングも GPU による描画が
行われます。AndroidManifest.xml に android:hardwareAccelerated="true"
を追加するだけです。
256x256 pixel のテクスチャ画像から 24x24 pixel を切り出して、
24x24 dot の小さい正方形として描画します。
これを 1600個、ばらばらに動かしています。
SurfaceView ではハードウエアアクセラレーションが有効とならなかったため
速度が逆転しています。HW が有効なら View + onDraw() の方が高速に
描画できています。
それでも OpenGL とは比較になりません。
GLSurfaceView は Java 上で OpenGL ES 2.0 を利用しています。
速すぎて 1600個では測定出来なかったため 30000個に増やしています。
当然かもしれませんがゲームは OpenGL を使った方がよさそうです。
以下 Android 2.3 との比較。
今後登場する Android 4.0 (Ice Cream Sandwich) では、スマートフォンも
GPU による描画に対応します。
1280x720 など画面解像度が高い機種ほど 2.3→4.0 の差が大きいかもしれません。
Android 3.x には他にも RenderScript があります。
NDK + OpenGL ES の上位ライブラリに近く、機能が限られる代わりに
Java から容易に扱えるようになっています。
こちらも後ほど試してみたいと思っています。
画面全体を常に書き換えているアプリは、解像度が上がるほど速度が
落ちていく可能性があります。
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 から容易に扱えるようになっています。
こちらも後ほど試してみたいと思っています。
2011/10/22
Android エスプガルーダ2/怒首領蜂第復活
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 対応になりました。
対応端末のスペックを調べてみました。
端末一覧と比べてみると、ちょうど Adreno 205/PVR SGX530 以上の端末が
動作対象となっています。
CPU/GPU 等の搭載プロセッサで線引きが行われているようです。
GPU 性能で下記のようにグループ分けしてみました。
Group 2 以上が今回の動作対象となっています。
関連エントリ
・iPhone 3GS エスプガルーダII ESPGALUDA2
エスプガルーダⅡと怒首領蜂大復活
手持ちで対応していた端末は下記の 3台。
・Galaxy S2 SC-02C (Exynos4210)
・EVO 3D ISW12HT (MSM8660)
・Optimus Pad L-06C (Tegra250)
● 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
2011/10/21
OpenGL ES 2.0 Mobile GPU の比較、重いテクスチャ
テクスチャ負荷が高いケースでのテスト
背景データ
・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 では圧縮できませんでした。
このあたりが速度に影響しているかもしれません。
・圧縮テクスチャ対応表
高負荷で長時間走らせていると端末も結構熱を持ちます。
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世代) 更新
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世代) 更新
2011/10/20
Android 4.0 Ice Cream Sandwich SDK と AVD
Emulator (AVD) が ARMv7 になっているようです。
neon ありでデフォルトの RAM 容量も 512MB。
(以前は ARMv5TE)
ndk も armeabi-v7a のまま走らせられるようになります。
SDK Manager 周りの UI が変更されているようです。
下記インストール手順のページを修正しました。
・Android SDK/NDK install 方法
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 方法
2011/10/19
Android Java で OpenGL ES 2.0 を使う
Android の OpenGL ES 2.0 対応は OS 2.0 Eclair からです。
まず NDK で使えるようになり、2.2 Froyo (API Level 8) では Java からも
呼び出せるようになっています。
実際に使ってみました。
2.0 への切り替えは GLSurfaceView の setEGLContextClientVersion( 2 ) です。
GLSurfaceView.Renderer には GL10 の interface が引数で渡されますが使いません。
android.opengl.GLES20 の static メソッドをそのまま呼び出します。
試してみて気がついたのですが、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) を使って自分で作ればこの問題を回避できるそうです。
まず 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) を使って自分で作ればこの問題を回避できるそうです。
2011/10/18
頂点性能の比較 その2 (OpenGL ES 2.0 Mobile GPU)
最適な頂点形式を割り出すため strip 変換時のパフォーマンスも調べて
みました。
テスト条件は前回と同じです。
50880ポリゴンの球モデルを 22個、画面あたり 1119628ポリゴンの描画を
行なっています。
各 GPU 毎に最も高速だった項目に '*' マークをつけています。
各項目の詳細は下記のとおりです。
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 速度比較のまとめ
関連エントリ
・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 の速度
みました。
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 の速度
2011/10/16
OpenGL ES 2.0 Mobile GPU の頂点性能を比較する
前回までのテストはピクセル性能に左右されていたため、ほぼ頂点だけの
描画を行ってみました。
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)
描画を行ってみました。
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)
2011/10/15
A5 PowerVR SGX543MP2 は iOS 5 だと速い
iPad2 を iOS5 にアップデートしたら 3D の描画性能が大幅に向上しました。
テスト内容は前回までと同じです。
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)
テスト内容は前回までと同じです。
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)
2011/10/14
さらに OpenGL ES 2.0 Mobile GPU の速度比較
single core CPU 世代の GPU 結果も追加しました。
画面解像度が異なるため fps で速度を比べることができません。
比較する場合は pix/sec の数値を見てください。
ただしシーンにはポリゴンの重なりがあるので厳密ではありません。
補足が多数あるので前回の記事もあわせてご参照ください。
GPU や転送能力と比べて解像度が高い傾向があるため、実行時間のほとんどが
ピクセルで費やされていることがわかります。(1)→(4) とピクセルシェーダー
(Fragment Shader) の負荷を軽くするとその傾向は下がります。
やはり GPU のおおまかなグループ分けとしては下記の 3つでだいたい合っている
ように思います。
関連エントリ
・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)
(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 の速度をもう少し詳しく調べてみました。
(※ 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 速度のグループ分けは下記のとおりです。
※以下 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)
(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)
2011/10/09
Android HTC EVO 3D GPU Adreno 220 の速度
HTC EVO 3D の 3D 描画能力のテスト。
第三世代の Snapdragon で、Adreno 220 を搭載しています。
以前の比較とはシェーダーが多少違います。
背景+複数キャラクタ+ライティング+Shadow map あり。
画面サイズが違うので単純には比較できませんが、秒間のピクセル数に
変換しても Mali-400MP には及びませんでした。
ただし Adreno は mobile GPU の中でも描画機能が非常に充実しており
ピクセルの演算精度も高くなっています。
第二世代の Adreno 205 (Snapdragon MSM8255 1GHz) 比では 2倍以上高速
なので十分良い数値と言えます。
以下は分岐を伴う、より複雑なライティングのシェーダーでのテスト。
下記ページにも追加しています。
・OpenGL ES 2.0 Mobile GPU 比較
・Mobile GPU Extension
関連エントリ
・OpenGL ES 2.0 shader の演算精度
・Android Galaxy S2 ARM Mali-400 MP は速い (2)
第三世代の 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)
2011/10/01
Android OpenWnn のコンパイル方法メモ
親指 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 を有効にする
・親指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 を有効にする