最適な頂点形式を割り出すため 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 の方が速度を圧迫しているため、
このような頂点構造の違いは大した問題ではないかもしれません。
テスト機材一覧 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 の速度