Android* 開発者向けラーニングシリーズ 11: インテル® Atom™ プロセッサー・べースの Android* 向け OpenGL* ES のサポート、パフォーマンス、機能について
この記事は、インテル® デベロッパー・ゾーンに掲載されている「Intel for Android* Developers Learning Series #11: OpenGL ES* Support, Performance, and Features for Android* on the Intel® Atom™ Processor」の日本語参考訳です。
1. はじめに
Android* の 3D グラフィックス用の標準 API は OpenGL* ES であり、現在のモバイルデバイスで最も広範に利用されている 3D グラフィックス用の API です。Android* では、OpenGL* ES を使用して 2D および 3D グラフィックスを高速化しています。Android* の初期のリリースでは OpenGL* ES による高速化はオプションでしたが、Android* が進化し、画面サイズが大きくなるにつれ、高速な OpenGL* ES は Android* のグラフィックス・システムに不可欠なものとなりました。
OpenGL* ES 1.0 および 1.1 は Android* の初期リリースからサポートされており、OpenGL* ES 2.0 のサポートは Android* 2.2 で追加されました。現在、Android* 開発者は任意のバージョンを使用することができます。表 1 は、これまでの Android* のメジャーリリースと、各リリースにおけるインテル® Atom™ プロセッサーのシステムイメージのビルトインサポート状況をまとめたものです。
リリース | 名前 | API | サポート | インテル® Atom™ プロセッサーのサポート |
---|---|---|---|---|
Android* 1.5 | Cupcake* | 3 | OpenGL* ES 1.0 | |
Android* 1.5 | Cupcake* | 3 | OpenGL* ES 1.0 | |
Android* 1.6 | Donut* | 4 | OpenGL* ES 1.0、1.1 | |
Android* 2.0 | Eclair* | 5 | OpenGL* ES 1.0、1.1 | |
Android* 2.1 | Eclair* | 7 | OpenGL* ES 1.0、1.1 | |
Android* 2.2 | Froyo* | 8 | OpenGL* ES 1.0、1.1、2.0 | |
Android* 2.3.3 | Gingerbread* | 10 | OpenGL* ES 1.0、1.1、2.0 | ○ |
Android* 3.0 | Honeycomb* | 11 | OpenGL* ES 1.0、1.1、2.0 | |
Android* 3.1 | Honeycomb* | 12 | OpenGL* ES 1.0、1.1、2.0 | |
Android* 3.2 | Honeycomb* | 13 | OpenGL* ES 1.0、1.1、2.0 | |
Android* 4.0 | Ice Cream Sandwich* | 14 | OpenGL* ES 1.0、1.1、2.0 | |
Android* 4.0.3 | Ice Cream Sandwich* | 15 | OpenGL* ES 1.0、1.1、2.0 | ○ |
Android* 4.1 | Jelly Bean* | 16 | OpenGL* ES 1.0、1.1、2.0 | ○ |
表 1: Android* バージョン、統合されている OpenGL* ES、およびインテル® Atom™ プロセッサーのシステムイメージ
インテル® Atom™ プロセッサー・ベースのプラットフォームでは、OpenGL* ES 1.0、1.1、および 2.0 に対応した Android* 2.3.3 以降がサポートされています。インテル® Atom™ プロセッサーの OpenGL* ES サポートは包括的で、その独特な機能の組み合わせにより、他の Android* ソリューションよりも優れています。
- PowerVR* SGX540 および SGX544MP2 GPU (400MHz 以上)
- 高速な浮動小数点演算
- Android* Virtual Device エミュレーター用の x86 システムイメージ
- インテル® Hardware Accelerated Execution Manager (インテル® HAXM)
- インテル® グラフィックス・パフォーマンス・アナライザー (インテル® GPA)
インテルは Google と協力し、今後も Android* プラットフォーム向けに x86 システムイメージ、インテル® HAXM、インテル® GPA をリリースし、最善のサポートを提供するべく取り組んでいきます。
2. Android* Virtual Device エミュレーター用の x86 システムイメージ
仮想デバイス・エミュレーターにより新しいアプリケーション・ソフトウェア開発の効率がどの程度上がるか、組込み開発者なら知っていることでしょう。Android* Virtual Device (AVD) は、Windows* または Linux* 開発システム上ですべての ARM 命令をエミュレーションしなければならないため、AVD 用の ARM システムイメージは非常に遅く、一般的な ARM AVD 上では Android* を起動するだけでも 5 分以上かかります。インテルは、インテル® Hardware Accelerated Execution Manager (インテル® HAXM) でこの問題を解決しています。このツールをインストールし、AVD 用のインテル® Atom™ X86 System Image とともに使用すると、アプリケーション開発をスピードアップし、インテル® Atom™ プロセッサーがなくても開発することができます。
Google の AVD エミュレーターは、この記事の執筆時点 (2012 年 11 月) では OpenGL* ES 1.0 および 1.1 をサポートしていますが、OpenGL* ES 2.0 はサポートしていません。これは、CPU や GPU のアーキテクチャーとは関係ない Google のエミュレーター側の制限です。
3. インテル® グラフィックス・パフォーマンス・アナライザー (インテル® GPA)
インテル® Atom™ プロセッサー・ベースの Android* 向け OpenGL* ES アプリケーションの開発においてもう 1 つの重要なツールは、インテル® グラフィックス・パフォーマンス・アナライザー (インテル® GPA) です。このツールスイートは、CPU、GPU、OpenGL ES を含む主要なシステム要件のリアルタイム・ビューを可能にします。Windows* または Ubuntu* Linux* 開発システムで動作し、Android* のデバッグ・インターフェイス (adb) を利用して Android* ターゲットデバイス上のドライバー・コンポーネントと通信します。何回かテスト実行することで、グラフィックス・パイプラインのボトルネックを素早く特定し、コードを最適化する可能性を見つけることができます。
Android* 開発向けのインテル® GPA (2012 R4) の詳細とダウンロードについては、次のページを参照してください:
http://software.intel.com/en-us/vcsource/tools/intel-gpa?cid=sem121p7972 (英語)
4. OpenGL* ES ドライバーの入手方法
Android* 向けインテル® Atom™ プロセッサー用の OpenGL* ES ドライバーは簡単に入手できます。インテル® Atom™ プロセッサー対応の Android* SDK をダウンロードすると、このドライバーは x86 システムイメージにすでに統合されています。インテルと Google の開発者の協力により、x86 デバイスでも ARM デバイスと同じように簡単に Android* アプリケーション (OpenGL* ES を多用するアプリケーションであっても) を開発できます。
Android* 2.3.3 (Gingerbread*)、4.0.3 (Ice Cream Sandwich*)、4.1 (Jelly Bean*) は、OpenGL* ES 1.1 および 2.0 のドライバーを含め、インテル® Atom™ プロセッサーのシステムイメージをビルトインでサポートしています。Android* SDK Manager でこれらのバージョンを選択するだけで利用できます。選択したバージョンに “Intel x86 Atom System Image” が含まれていることを確認してください。また、Android* SDK Manager の [Extras] 以下にあるインテル® Hardware Accelerated Execution Manager (インテル® HAXM) をダウンロードしてインストールしてください。Android* SDK Manager がインストールされていない場合は、次の Web サイトからダウンロードできます:
http://developer.android.com/sdk/index.html (英語)
また、直接インテルの Web サイトから Intel x86 System Images をダウンロードすることもできます:
http://software.intel.com/en-us/articles/android-ice-cream-sandwich-x86-emulator-image (英語)
5. PowerVR* GPU
インテル® Atom™ プロセッサーは、PowerVR* グラフィックス・アクセラレーターを採用しています。PowerVR* は、現在モバイルデバイスで最も広範に利用されている OpenGL* ES アクセラレーターです。PowerVR* は、成熟した実績のあるユニバーサル・スケーラブル・シェーダー・エンジン (USSE) アーキテクチャー・ベースの設計を採用しています。しかし、すべての PowerVR* コアが同じであるわけではありません。SGX540 シリーズの USSE の数は SGX530 の 2 倍、SGX544MP2 は 4 倍です。動作クロックが同じ場合、パフォーマンスもそれぞれ 2 倍、4 倍になります。インテル® Atom™ プロセッサーはほかのプロセッサーと比べてクロックレートが高いため、OpenGL* ES でより高いパフォーマンスが得られ、よりスムーズなユーザー体験を可能にします。表 2 は、インテル® Atom™ プロセッサーで採用されている PowerVR* コアファミリーをまとめています。
インテル® Atom™ プロセッサー | GPU コア | GPU クロック |
---|---|---|
インテル® Atom™ プロセッサー Z24XX | PowerVR* SGX 540 | 400MHz |
インテル® Atom™ プロセッサー Z2580 | PowerVR* SGX 544MP2 | 533MHz |
表 2: Android* 向けインテル® Atom™ プロセッサーの OpenGL* ES アクセラレーター
PowerVR* の USSE アーキテクチャーは、OpenGL* 2.1 と DirectX* 10.1 のユニファイド・シェーダー・モデル要件に対応しています。ただし、Android* 開発者は OpenGL* ES 1.1、OpenGL* ES 2.0、およびこれらの拡張で公開されている機能のみ利用できます。
6. OpenGL* ES 拡張
Khronos の OpenGL* ES 1.1 および 2.0 の仕様書で、OpenGL* ES の機能はプラットフォームに関係なくほぼ同じでなければならないとしています。これは、API を標準化する目的と言えます。ただし、GPU 開発者は OpenGL* ES 拡張を通して、GPU の特殊機能を利用することができます。Khronos により管理されている OpenGL* ES 拡張のオンライン・レジストリーの公式サイト http://www.khronos.org/registry/gles (英語) に、すべての拡張が記載されています。
圧縮テクスチャーやダイレクト・テクスチャー・ストリーミングのサポートなど、重要な OpenGL* ES 拡張はほとんどの Android* プラットフォームで利用できますが、OpenGL* ES で使用される圧縮テクスチャーのフォーマットは多種多様です。インテル® Atom™ プロセッサーに内蔵されている PowerVR* コアは、最も広範な圧縮テクスチャー・フォーマットをサポートしています。
テクスチャーの圧縮は、3D アプリケーションのメモリー使用量を減らし、パフォーマンスを向上させる重要な手法ですが、使用されるフォーマットは拡張によって定義されるため、プラットフォームごとに異なります。最も広範にサポートされているのは ETC1_RGB8 (Ericsson Texture Compression) フォーマットですが、ピクセルあたり 8 ビットの精度のみをサポートしており、ピクセルごとのアルファ情報はサポートしていません。ETC1_RGB8 に加えて、PowerVR* GPU は ETC1_RGB8 と比べるといくつかの重要な利点がある PVRTC フォーマットもサポートしています。PVRTC フォーマットは、ピクセルあたり 2 ビットまたは 4 ビットの精度をサポートしており、オプションでピクセルごとのアルファ情報もサポートしています。そのため、ETC1_RGB8 形式よりもテクスチャーのサイズを大幅に減らし、アルファ・ブレンディング効果を利用することができます。
PowerVR* コアと PVRTC は、すべての世代の Apple iPhone*、iPod* Touch、および iPad* デバイスでも使用されているため、インテル® Atom™ プロセッサー・ベースの Android* で OpenGL ES 標準よりも高い互換性を提供します。これは、Android* と iOS の両方のプラットフォーム向けにアプリケーションを開発する場合に重要です。詳細は、次のサイトの「Texture compression support」 (英語) を参照してください。
http://developer.android.com/guide/topics/graphics/opengl.html
このほかにも重要な OpenGL* ES 拡張として、OpenGL* ES と Android* システムのほかの部分 (例えば、OpenMAX* からのビデオフレームなど) との間で高速ストリーミングを提供するものがあります。OpenGL* ES 用のインテル® Atom™ プロセッサーのドライバーは、これらの拡張もサポートしています。
Android* アプリケーションは、特定のデバイスで特定の OpenGL* ES 拡張が利用可能であると仮定すべきではありません。代わりに、ランタイムで利用可能な拡張のリストを OpenGL* ES に照会します。拡張のリストは、OpenGL* ES および EGL ドライバーから次の呼び出しを使用して取得できます。
glGetString(GL_EXTENSIONS); eglQueryString(eglGetCurrentDisplay(), EGL_EXTENSIONS);
実行中の Android* デバイスでこの照会を行い、照会結果のリストを表示する便利なツールが Google Play サイトにあります:
https://play.google.com/store/apps/details?id=com.realtechvr.glview (英語)
Android* で利用可能な OpenGL* ES 拡張は、CPU アーキテクチャーの違いではなく、GPU コアによって大きく異なります。インテル® Atom™ プロセッサーは x86 CPU アーキテクチャー・ベースですが、基本的に PowerVR* GPU を採用しているほかの Android* プラットフォームと同じ OpenGL* ES 拡張が利用できます。インテル® Atom™ プロセッサーに内蔵されている PowerVR* コアは、ほとんどの GPU と比べると、より多くの専用 OpenGL* ES 拡張をサポートしており、そのいくつかは非常に有用です。当然、これらの専用の拡張を使用すると、PowerVR* コアを搭載したほかの Android デバイスへのアプリケーションの移植性は制限されます。“IMG” で終わる拡張名は、PowerVR* 専用の拡張である可能性が高いですが、必ずしもそうであるとは限りません。GLView のようなツールを使用して、さまざまな Android* デバイスで拡張をテストしてみると良いでしょう。
以下に、いくつかの PowerVR* 専用の OpenGL* ES 拡張を示します。
OpenGL* ES アプリケーションが最適に動作するには、CPU コアと GPU コアの両方の浮動小数点パフォーマンスが高速であることが重要です。シェーダープログラムは浮動小数点演算を多用し、それらは GPU で実行されます。OpenGL* ES アプリケーション・コードも多くの浮動小数点演算を必要とし、それらは OpenGL* ES の呼び出しに備えて CPU で実行されなければなりません。インテル® Atom™ プロセッサーは CPU コアと GPU コアの両方で浮動小数点演算を高速に実行できるため、この点でもインテル® Atom™ プロセッサーのほうが ARM ベースのソリューションよりも優れています。 浮動小数点ハードウェアがないシステムでは、代わりに “Common-Lite” と呼ばれる OpenGL* ES 1.1 用のドライバーとあわせて固定小数点演算を使用します。すべてのインテル® Atom™ プロセッサーには CPU コアと GPU コアの両方にハードウェア浮動小数点が備わっており、固定小数点演算を使用する必要がないため、Android* 用のインテルのシステムイメージには OpenGL* ES 1.1 用の “Common” (浮動小数点) ドライバーしか含まれていません。Khronos の OpenGL* ES 2.0 規格では、浮動小数点演算のみを定義しています。 Android * アプリケーションで OpenGL* ES を使用する最も簡単な方法は、Android* SDK の GLSurfaceView クラスを使用することです。このクラスは、ほとんどの EGL、スレッド、および OpenGL* ES のレンダリング領域と Android* の描画領域の割り当ての初期化を行います。OpenGL* ES は、変換、アルファ・ブレンディングのような追加機能を備えた TextureView オブジェクトでレンダリングすることもできますが、設定と使用には別途コードが必要です。Android* SDK は、Google および Khronos から提供されている次のパッケージで Java* バインティングを通じて OpenGL* ES をサポートしています。 現在、この 3 つのバージョンの OpenGL* ES API は Android* 1.0、1.1、2.0 で利用できます。OpenGL* ES 1.0 は廃止され、1.1 に代わりました。OpenGL* ES 2.0 は、シェーダー・プログラミングにより高い柔軟性をもたらしますが、OpenGL* ES 1.1 で記述されたコードと互換性がありません。表 3 は、アプリケーション開発に使用可能な OpenGL* ES API のバージョンと Android* 用のクラスです。 表 3: Android* の OpenGL* ES クラス インテル® Atom™ プロセッサー・ベースの Android* プラットフォームは、SDK または NDK を通じてこれらのバージョンの OpenGL* ES を使用するアプリケーションをサポートしています。
glFramebufferTexture2DMultisampleIMG()
glRenderbufferStorageMultisampleIMG()
glMultiDrawArraysEXT()
glMultiDrawElementsEXT()
7. 浮動小数点のパフォーマンス
8. Android* フレームワーク SDK
OpenGL* ES API バージョン
クラス
OpenGL* ES 1.0
android.opengl.GLES10
OpenGL* ES 1.0
android.opengl.GLES10Ext
OpenGL* ES 1.1
android.opengl.GLES11
OpenGL* ES 1.0
android.opengl.GLES11Ext
OpenGL* ES 2.0
android.opengl.GLES20
9. Android* NDK
ネイティブコード開発キット (NDK) は、開発者が Dalvik VM (ダルビック仮想マシン) を介さずに C/C++ コードをネイティブに実行し、Android* アプリケーションがより高いパフォーマンスを引き出せるように Google によって開発されました。この NDK は誰でも利用でき、C/C++ で記述された既存のアプリケーションを簡単に移植したり、3D ゲームのようにパフォーマンスが重要なアプリケーションで高いパフォーマンスを実現することができます。
Android* NDK は OpenGL* ES 1.1 と 2.0 の両方をサポートしており、両バージョン向けのサンプル・アプリケーションを提供しています。OpenGL* ES を使用するほとんどのアプリケーションは C/C++ で記述されており、NDK は C/C++ コードと Java* ベースの Android* フレームワークを組み合わせるメカニズムを提供します。このメカニズムは JNI (Java Native Interface) と呼ばれ、Android* 上で高速なグラフィックス描画を必要とするアプリケーションの実装手段として主流になりつつあります。NDK r6b から JNI はインテル® Atom™ プロセッサーでサポートされています。NDK は以下のサイトからダウンロードできます:
https://developer.android.com/ndk/index.html (英語)
10. RenderScript
RenderScript は Android 3.0 で初めて追加されました。これも Google により開発された技術で、Dalvik VM を介さないようにすることで、グラフィックスも含め、計算を多用するアルゴリズムを高速化します。ただし、NDK と異なり、RenderScript コードはランタイムに Android* デバイス上でコンパイルされます。RenderScript は、複数のプロセッサーを利用できるように設計されていますが、この記事の執筆時点 (2012 年 11 月) では CPU 上のプロセシング・コアのみを利用し、GPU 上のコアは利用していません。将来のリリースでは、GPU コアも利用するように改良されるでしょう。そうなった場合、既存の RenderScript コードでも新しいその能力を (うまくいけばコード変更なしで) 利用できる可能性があります。
RenderScript は、アプリケーション開発者が CPU アーキテクチャーや実際に利用可能なプロセッサー数を考慮しなくても済むようにハードウェアを抽象化します。抽象化には、GLSL や OpenCL* のような既存の並列コンピューティング・モデルを使用する代わりに、OpenGL* ES のビルトインサポートを備えた C99 ベースの新しい言語を使用します。RenderScript の抽象化は、インテル® Atom™ プロセッサー・ベースのデバイスを含む任意の Android* デバイス上で実行が保証されています。RenderScript に関する詳細は以下を参照ください:
http://android-developers.blogspot.com/2011/02/introducing-renderscript.html (英語)
11. まとめ
インテル® Atom™ プロセッサーの x86 アーキテクチャーは、ARM ベースのソリューションと同じ機能に加えて、多くの追加機能も提供するため、Android* 向け OpenGL* ES アプリケーションを問題なく開発できます。さまざまな Android* プラットフォームで OpenGL* ES に対応するには、GPU アーキテクチャーのほうが重要です。インテル® Atom™ プロセッサーに内蔵されている PowerVR* コアは、現在モバイルデバイスで最も広範に利用されている GPU です。クラス最高の PowerVR* コア、高速な浮動小数点演算、優れたソフトウェア・サポートによる高速な AVD エミュレーション、グラフィックス・パイプラインのパフォーマンス解析を組み合わせたインテル® Atom™ プロセッサーは、Android* 向け OpenGL* ES アプリケーションの開発において最良の総合ソリューションを提供します。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。