Android上での3D描画の基礎と、
 NDKによる実践的⾼速化⼿法。




                               2011年7⽉17⽇


           (C)2011 HI CORPORATION. All Rights Reserved.
ご挨拶

吉⽥ 宏(よしだ ひろし)
株式会社エイチアイ 開発部門 基盤技術部1課 所属

3Dエンジン“MascotCapsule”を中⼼に
ミドルウェア製品企画・開発・サポートを担当



                                      yosyda



             <2>   (C)2011 HI CORPORATION. All Rights Reserved.
アジェンダ

1.SDK(Java)サンプルを使い、OpenGL ESの基礎を解説
2.NDK(C-Native)で⾼速化!
3.その他の⾼速化ポイント




                   <3>   (C)2011 HI CORPORATION. All Rights Reserved.
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説

javax.microedition.khronos.opengles
 AndroidにおけるOpenGL ESサポートの標準となる
 パッケージ。




   http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10.html
   より引用




                                          <4>     (C)2011 HI CORPORATION. All Rights Reserved.
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説

              改変元のオリジナルプログラムは
              ApiDemosサンプル中の
              Graphics/OpenGL/GLSurfaceView




              キューブ2個→8×8×8(512個)

                   <5>   (C)2011 HI CORPORATION. All Rights Reserved.
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説




 1.サンプルプログラムを自分のワークスペース配下に展開
 2.Package ExplorerもしくはFileメニューからImport
   General/Existing Projects into Workspaceを選択 
 3.Select root directoryからサンプルプログラムを展開
   したディレクトリを選択
                       <6>   (C)2011 HI CORPORATION. All Rights Reserved.
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説




 4. Projectsの欄に2本のサンプルが表⽰されていることを
    確認して、Finishボタンを押す。
    Projectメニューの”Build Automatically”がチェックさ
    れていれば、自動的にビルドが完了する。
                     <7>   (C)2011 HI CORPORATION. All Rights Reserved.
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説

サンプルのビルドに失敗する場合

 ・サンプルはAndroid2.1-update1を使用
  それ以外のSDKを使う場合には、プロジェクトの
  PropertyのAndroidの項目にある“Project Build Target”
  をインストール済のSDKと合わせる必要あり。
 ・リソース関連のエラー(R.java)が発⽣する場合、
  プロジェクトをRefresh(F5)することや、Cleanしてみる
  ことで、解決する場合もある。




                       <8>   (C)2011 HI CORPORATION. All Rights Reserved.
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説




              PackageExplorerのsrcを展開し、
              Cube.javaを開く。




                  <9>   (C)2011 HI CORPORATION. All Rights Reserved.
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説
  Cube.java                          GL_FIXED(固定⼩数点)で、
                                     0x10000が1.0fを意味します。
int one = 0x10000;                                                           (-1.0)
    int vertices[] = {                                ③                    ②
          -one, -one, -one, (0)
          one, -one, -one,   ①   (+1.0)
          one, one, -one,    ②          ⑦                      ⑥ (+1.0)
          -one, one, -one, ③
          -one, -one, one, ④                         (0)                   ①
          one, -one, one,    ⑤ Y
          one, one, one,     ⑥
          -one, one, one, ⑦
    };                            (-1.0)④                      ⑤
                                     (-1.0)                   (+1.0)
                              Z                     X

                                  <10>   (C)2011 HI CORPORATION. All Rights Reserved.
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説
                                   左の要素からRGBAを表します。
  Cube.java
                                  スムースシェーディングで着⾊する
                                    各頂点の⾊を指定します。
int colors[] = {
          0, 0, 0, one,           ⿊
          one, 0, 0, one,                            ③                    ②
                                  赤
          one, one, 0, one,       ⻩
          0, one, 0, one,         緑
          0, 0, one, one,         ⻘      ⑦                    ⑥
          one, 0, one, one,     マゼンタ
          one, one, one, one,     ⽩                 (0)                   ①
          0, one, one, one,      シアン
     };
                                         ④                    ⑤




                                 <11>   (C)2011 HI CORPORATION. All Rights Reserved.
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説
                      キューブは、三角形12個で構成
  Cube.java
                     されています。インデックスバッファ
                     を使い、定義済の頂点をどう繋いで
byte indices[] = {   三角形を描画するかを指定します。
          0, 4, 5,        (TriangleList)
      0, 5, 1,
          1, 5, 6,
      1, 6, 2,                           ③                    ②
          2, 6, 7,
      2, 7, 3,
          3, 7, 4,           ⑦                    ⑥
      3, 4, 0,
          4, 7, 6,                      (0)                   ①
      4, 6, 5,
          3, 0, 1,
      3, 1, 2                ④                    ⑤
    };



                     <12>   (C)2011 HI CORPORATION. All Rights Reserved.
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説
Cube.java
     ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
     vbb.order(ByteOrder.nativeOrder());
     mVertexBuffer = vbb.asIntBuffer();
     mVertexBuffer.put(vertices);
                                          確保しByteBufferに
     mVertexBuffer.position(0);
                                       頂点データを書き込みます。
     ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length*4);
     cbb.order(ByteOrder.nativeOrder());
     mColorBuffer = cbb.asIntBuffer();
     mColorBuffer.put(colors);
     mColorBuffer.position(0);

     mIndexBuffer = ByteBuffer.allocateDirect(indices.length);
     mIndexBuffer.put(indices);
     mIndexBuffer.position(0);



                              <13>   (C)2011 HI CORPORATION. All Rights Reserved.
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説
Cube.java

  public void draw(GL10 gl)
   {
     gl.glFrontFace(gl.GL_CW);
          ・
          ・
         (略)
   }                          時計回り、反時計回りのどちらの
                             ポリゴンが表⾯なのかを指定します。
                               (GL_CWは時計周りが表)




                                                       表



                                 <14>   (C)2011 HI CORPORATION. All Rights Reserved.
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説
Cube.java
           用意したByteBufferを毎フレーム転送します。(頂点配列)
         OpenGL ES1.1以降では、バッファオブジェクトを使うことで、
          常時GPU側にバッファを置き、⾼速化することも可能です。

 public void draw(GL10 gl)
  {
          (略)
    gl.glVertexPointer(3, gl.GL_FIXED, 0, mVertexBuffer);
    gl.glColorPointer(4, gl.GL_FIXED, 0, mColorBuffer);

      gl.glDrawElements(gl.GL_TRIANGLES, 36,
                            gl.GL_UNSIGNED_BYTE, mIndexBuffer);
  }

            TriangleList形式で、インデックスバッファの頭から
            36要素(12ポリゴン)分を描画することを指⽰します。

                              <15>   (C)2011 HI CORPORATION. All Rights Reserved.
1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説

 Androidにおいて、OpenGL ESで描画を⾏うには、
 GLSurfaceViewの流儀で実装する必要がある。

 ①GLSurfaceViewのインスタンスを⽣成
 ②GLSurfaceView.Renderer を継承したRendererクラスを作成
       onDrawFrame()
       onSurfaceCreated()
       onSurfaceChanged()
       など必要なメソッドを記述。
 ③setContentView()で、GLSurfaceViewをActivityの描画対象に設定
       ActivityのonResume() / onPause()から、GLSurfaceViewの
       onResume() / onPause()をオーバーライド

 HiGlesDemoSdk.java / CubeRenderer.javaの実装を参照。




                             <16>   (C)2011 HI CORPORATION. All Rights Reserved.
2.NDK(C-Native)で⾼速化!




  OpenGL ESを使ったにもかかわらず、
  思ったほどフレームレートが上がらない?




                   <17>   (C)2011 HI CORPORATION. All Rights Reserved.
2.NDK(C-Native)で⾼速化!



アプリは膨大な回数のOpenGL ES呼び出しで構成。

今回のサンプルも、⾏列演算を用いて個別に回転。
glDrawElements()だけでもCubeの個数分実⾏される。
(合計512回)




                   <18>   (C)2011 HI CORPORATION. All Rights Reserved.
2.NDK(C-Native)で⾼速化!

OpenGL ESのC-API自体はかなり⾼速。

Java経由でGLメソッドを使用すると、JavaとNativeの
変換処理が毎回必要となる。

      Java                                  C-Native
   glDrawElements()
                      重(JNI)               glDrawElements()


   Javaの重いGL-APIを使うのではなく、
   C-Native APIを使い、JNI呼び出しの回数を
   まとめて減らすことが⾼速化にとても重要

                       <19>   (C)2011 HI CORPORATION. All Rights Reserved.
2.NDK(C-Native)で⾼速化!

Draw()    Java                                       C-Native
     glDrawElements()
                           重(JNI)                   glDrawElements()
     glDrawElements()                               glDrawElements()
     glDrawElements()                               glDrawElements()
     glDrawElements()                               glDrawElements()



Draw()
                                                       glDrawElements()
     nativeRender()
                      重(JNI)                           glDrawElements()
                               nativeRender()
                                                       glDrawElements()
ついでに、アプリのロジック自体も
C⾔語で書いてしまうとさらに⾼速!                                      glDrawElements()


                               <20>   (C)2011 HI CORPORATION. All Rights Reserved.
2.NDK(C-Native)で⾼速化!

メソッドをC⾔語で記述し、JNIで呼び出すには?

 ・nativeという宣⾔を持つ、ダミーのJavaメソッドを記述
    HiGlesDemoNdk.java
      private native void nativeInit();
      private native void nativeResize(int w, int h);
      private native void nativeRender();
 ・Eclipseを使い⼀次コンパイル(classファイル⽣成のため)
 ・ヘッダファイルを⽣成
  javah というユーティリティで自動的に⽣成可能。
 ・ヘッダと対応したCソースファイルを記述。

                          <21>   (C)2011 HI CORPORATION. All Rights Reserved.
2.NDK(C-Native)で⾼速化!

メソッドをC⾔語で記述し、JNIで呼び出すには?

 ・jniディレクトリにShell(コマンドライン)で移動し、
     ndk-build スクリプトを実⾏。
     →/libs/armeabi ディレクトリに.soが⽣成される。
 ・Eclipseから、⽣成済の.soを含めてビルド・実⾏。


 今回のNDK向けサンプルも、上記の2⼿順でビルド可能
  (Android NDKサンプルのSanAngelesの構成を踏襲)



                   <22>   (C)2011 HI CORPORATION. All Rights Reserved.
2.NDK(C-Native)で⾼速化!
同じ機能をNDK(JNI)で実装したサンプルのソースを確認。
※jniディレクトリ以下のdemo.cソースを参照




                                           Java使用の場合と
                                             処理の内容は
                                              ほぼ等価。




                   <23>   (C)2011 HI CORPORATION. All Rights Reserved.
2.NDK(C-Native)で⾼速化!

               ⾒た目はSDK(Java)版と同じ。
               ※背景⾊のみSDKと⾒た目を
                変えるため、グレーに変更。




                   <24>   (C)2011 HI CORPORATION. All Rights Reserved.
2.NDK(C-Native)で⾼速化!

SDK版とNDK版動作速度⽐較

 SDK(Java)                   19.24FPS

 NDK(JNI:C-Native)           29.09FPS
             ※Android 2.3.4搭載のNexus Oneにて測定


 弊社3Dエンジンを使った例では、フレームレートで
 3倍程度の差が出た例もある。




                      <25>    (C)2011 HI CORPORATION. All Rights Reserved.
2.NDK(C-Native)で⾼速化!

NativeActivityという選択肢は?

 Android2.3(GingerBread)以降のみで対応している機能。
 Android2.2(Froyo)以前の端末がまだまだ流通している
 現状では、NDKベースでJNI記述するのが現実的。

 将来的には、おそらくNativeActivityに集約されるが、
 プログラム技術は同じものが転用可能。




                   <26>   (C)2011 HI CORPORATION. All Rights Reserved.
3. その他の⾼速化ポイント

・圧縮テクスチャの使用
  ATITC (Qualcomm系チップ)
  PVRTC (PowerVR系チップ)
  DXT    (nVidia系チップ)
  ※環境ごとに別の圧縮テクスチャが必要

  OpenGL ES2.0以降、ETC1は標準で使用可能だが、
  アルファ(マスク)のデータを持つことができず使いにくい。

  圧縮テクスチャは、展開されずそのままGPUの描画に
  使用され、データの転送帯域が⼩さくて済むことから、
  処理が⾼速化される場合が多いのがポイント。

                 <27>   (C)2011 HI CORPORATION. All Rights Reserved.
3. その他の⾼速化ポイント
・Triangle Listではなく、Triangle Strip形式の活用


            http://en.wikipedia.org/wiki/Triangle_strip より引用



Stripが⻑くなればなるほど、インデックスバッファの⻑さと、
ポリゴン数の⽐が1:1に収束する。
(Triangle Listの場合には常に3:1)

ハードウェアが既にセットアップ済の2頂点を再利用して
描画するため⼀般的にTriangleListよりも⾼速。


                       <28>   (C)2011 HI CORPORATION. All Rights Reserved.
One more thing!


OpenGL ESを使えば、⾼速にポリゴンが描画できる。
しかし、それでアプリを作るのに必要な機能は充分?


      例)
      ボーンアニメーション
      カメラ制御
      3Dツールで作成したデータの読み込み
      3Dの当たり判定



                  <29>   (C)2011 HI CORPORATION. All Rights Reserved.
One more thing!


           MascotCapsule eruption ST
 ・今までの3D描画エンジンと比べて処理速度が速くなり、ポリゴンの表示能
  力が飛躍的に向上。
 ・機器を選ばないライブラリ実装で、ネイティブ、Javaなどさまざまな環境
  でのサポートが可能。
 ・国際標準規格であるOpenGL® ESに対応した、3Dアクセラレータチップの
  連携が可能。 OpenGL® ES 2.0にも対応。
 ・市販3Dツールで作成したデータを専用フォーマットへ変換して使用可能。
 ・MascotCapsule V3のmbac/mtraデータの描画も可能。
 ・従来のeruptionに対して、立体視機能拡張が追加されています。



                         <30>   (C)2011 HI CORPORATION. All Rights Reserved.
One more thing!

                           MascotCapsule eruption ST 主要機能


         モーションブレンド                   モーフィング                   エフェクト(パーティクル)
   モーションブレンドを使うことで、滑ら         モーフィング機能を使い、例えばフェイ            パーティクル(粒⼦)の運動、形状変化
   かにモーションデータを切り替えられま         シャルアニメーションのような演出が可            等のパラメータに基づき、粒⼦の集合体
   す。                         能になります。                       をまとめて描画可能です。データは専用
                                                            のエフェクトエディタで作成します。




    ⾛り       中間       歩き       笑い        中間       怒り



         テクスチャタイリング                 バンプマッピング                  プロジェクションシャドウ
                              物体の表⾯に凹凸があるように⾒せるこ
  少ないテクスチャ領域で、地⾯や壁といっ                                       物体の影をよりリアルで正確に投影する
                              とができます。(BREW3などOpenGL
  たサイズの大きな部分をカバーすること                                        ことができます。
                              ES1.0対応機種は非対応)
  ができます。




                                法線マップ




                                        <31>    (C)2011 HI CORPORATION. All Rights Reserved.
One more thing!

                     MascotCapsule eruption ST 主要機能


                  ⽴体視対応                                     V3Loaderサポート

                                                      MascotCapsule V3用のmbac/mtra
   裸眼⽴体視に対応した左目用、右目用の画像を自動的に⽣成可能です。
                                                      データの描画が可能です。




                                                            OpenGL ES2.0対応

 SHARP ⽴体視対応Android端末及び                               OpenGL ES2.0のShaderを取り扱う

       (SH-03C / SH-12C等)                             APIをサポートしています。
                                                      ES2.0環境では、ES1.1の固定機能APIが

 Docomo FOMA ⽴体視対応Prime端末                             削除されていますが、独自の
                                                      Shaderエミュレーションレイヤを実装

       (SH-10C / CA-01C / F-09C等)                     していますので、ES1.1向けのコンテン
                                                      ツもそのまま動作させることが可能です。

 では、端末標準搭載のためライセンス不要!


                                 <32>     (C)2011 HI CORPORATION. All Rights Reserved.
ご清聴ありがとうございました。




     http://www.hicorp.co.jp
 http://www.mascotcapsule.com

             <33>   (C)2011 HI CORPORATION. All Rights Reserved.

Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法

  • 1.
    Android上での3D描画の基礎と、 NDKによる実践的⾼速化⼿法。 2011年7⽉17⽇ (C)2011 HI CORPORATION. All Rights Reserved.
  • 2.
    ご挨拶 吉⽥ 宏(よしだ ひろし) 株式会社エイチアイ 開発部門 基盤技術部1課所属 3Dエンジン“MascotCapsule”を中⼼に ミドルウェア製品企画・開発・サポートを担当 yosyda <2> (C)2011 HI CORPORATION. All Rights Reserved.
  • 3.
  • 4.
    1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 javax.microedition.khronos.opengles AndroidにおけるOpenGL ESサポートの標準となる パッケージ。 http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10.html より引用 <4> (C)2011 HI CORPORATION. All Rights Reserved.
  • 5.
    1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 改変元のオリジナルプログラムは ApiDemosサンプル中の Graphics/OpenGL/GLSurfaceView キューブ2個→8×8×8(512個) <5> (C)2011 HI CORPORATION. All Rights Reserved.
  • 6.
    1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 1.サンプルプログラムを自分のワークスペース配下に展開 2.Package ExplorerもしくはFileメニューからImport General/Existing Projects into Workspaceを選択  3.Select root directoryからサンプルプログラムを展開 したディレクトリを選択 <6> (C)2011 HI CORPORATION. All Rights Reserved.
  • 7.
    1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 4. Projectsの欄に2本のサンプルが表⽰されていることを 確認して、Finishボタンを押す。 Projectメニューの”Build Automatically”がチェックさ れていれば、自動的にビルドが完了する。 <7> (C)2011 HI CORPORATION. All Rights Reserved.
  • 8.
    1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 サンプルのビルドに失敗する場合 ・サンプルはAndroid2.1-update1を使用  それ以外のSDKを使う場合には、プロジェクトの  PropertyのAndroidの項目にある“Project Build Target”  をインストール済のSDKと合わせる必要あり。 ・リソース関連のエラー(R.java)が発⽣する場合、  プロジェクトをRefresh(F5)することや、Cleanしてみる  ことで、解決する場合もある。 <8> (C)2011 HI CORPORATION. All Rights Reserved.
  • 9.
    1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 PackageExplorerのsrcを展開し、 Cube.javaを開く。 <9> (C)2011 HI CORPORATION. All Rights Reserved.
  • 10.
    1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 Cube.java GL_FIXED(固定⼩数点)で、 0x10000が1.0fを意味します。 int one = 0x10000; (-1.0) int vertices[] = { ③ ② -one, -one, -one, (0) one, -one, -one, ① (+1.0) one, one, -one, ② ⑦ ⑥ (+1.0) -one, one, -one, ③ -one, -one, one, ④ (0) ① one, -one, one, ⑤ Y one, one, one, ⑥ -one, one, one, ⑦ }; (-1.0)④ ⑤ (-1.0) (+1.0) Z X <10> (C)2011 HI CORPORATION. All Rights Reserved.
  • 11.
    1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 左の要素からRGBAを表します。 Cube.java スムースシェーディングで着⾊する 各頂点の⾊を指定します。 int colors[] = { 0, 0, 0, one, ⿊ one, 0, 0, one, ③ ② 赤 one, one, 0, one, ⻩ 0, one, 0, one, 緑 0, 0, one, one, ⻘ ⑦ ⑥ one, 0, one, one, マゼンタ one, one, one, one, ⽩ (0) ① 0, one, one, one, シアン }; ④ ⑤ <11> (C)2011 HI CORPORATION. All Rights Reserved.
  • 12.
    1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 キューブは、三角形12個で構成 Cube.java されています。インデックスバッファ を使い、定義済の頂点をどう繋いで byte indices[] = { 三角形を描画するかを指定します。 0, 4, 5, (TriangleList)       0, 5, 1, 1, 5, 6,       1, 6, 2, ③ ② 2, 6, 7,       2, 7, 3, 3, 7, 4, ⑦ ⑥       3, 4, 0, 4, 7, 6, (0) ①       4, 6, 5, 3, 0, 1,       3, 1, 2 ④ ⑤ }; <12> (C)2011 HI CORPORATION. All Rights Reserved.
  • 13.
    1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 Cube.java ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4); vbb.order(ByteOrder.nativeOrder()); mVertexBuffer = vbb.asIntBuffer(); mVertexBuffer.put(vertices); 確保しByteBufferに mVertexBuffer.position(0); 頂点データを書き込みます。 ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length*4); cbb.order(ByteOrder.nativeOrder()); mColorBuffer = cbb.asIntBuffer(); mColorBuffer.put(colors); mColorBuffer.position(0); mIndexBuffer = ByteBuffer.allocateDirect(indices.length); mIndexBuffer.put(indices); mIndexBuffer.position(0); <13> (C)2011 HI CORPORATION. All Rights Reserved.
  • 14.
    1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 Cube.java public void draw(GL10 gl) { gl.glFrontFace(gl.GL_CW);          ・          ・         (略) } 時計回り、反時計回りのどちらの ポリゴンが表⾯なのかを指定します。 (GL_CWは時計周りが表) 表 <14> (C)2011 HI CORPORATION. All Rights Reserved.
  • 15.
    1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 Cube.java 用意したByteBufferを毎フレーム転送します。(頂点配列) OpenGL ES1.1以降では、バッファオブジェクトを使うことで、 常時GPU側にバッファを置き、⾼速化することも可能です。 public void draw(GL10 gl) {       (略) gl.glVertexPointer(3, gl.GL_FIXED, 0, mVertexBuffer); gl.glColorPointer(4, gl.GL_FIXED, 0, mColorBuffer); gl.glDrawElements(gl.GL_TRIANGLES, 36, gl.GL_UNSIGNED_BYTE, mIndexBuffer); } TriangleList形式で、インデックスバッファの頭から 36要素(12ポリゴン)分を描画することを指⽰します。 <15> (C)2011 HI CORPORATION. All Rights Reserved.
  • 16.
    1. SDK(Java)サンプルを使い、OpenGL ESの基礎を解説 Androidにおいて、OpenGL ESで描画を⾏うには、 GLSurfaceViewの流儀で実装する必要がある。 ①GLSurfaceViewのインスタンスを⽣成 ②GLSurfaceView.Renderer を継承したRendererクラスを作成 onDrawFrame() onSurfaceCreated() onSurfaceChanged() など必要なメソッドを記述。 ③setContentView()で、GLSurfaceViewをActivityの描画対象に設定 ActivityのonResume() / onPause()から、GLSurfaceViewの onResume() / onPause()をオーバーライド HiGlesDemoSdk.java / CubeRenderer.javaの実装を参照。 <16> (C)2011 HI CORPORATION. All Rights Reserved.
  • 17.
    2.NDK(C-Native)で⾼速化! OpenGLESを使ったにもかかわらず、 思ったほどフレームレートが上がらない? <17> (C)2011 HI CORPORATION. All Rights Reserved.
  • 18.
  • 19.
    2.NDK(C-Native)で⾼速化! OpenGL ESのC-API自体はかなり⾼速。 Java経由でGLメソッドを使用すると、JavaとNativeの 変換処理が毎回必要となる。 Java C-Native glDrawElements() 重(JNI) glDrawElements() Javaの重いGL-APIを使うのではなく、 C-Native APIを使い、JNI呼び出しの回数を まとめて減らすことが⾼速化にとても重要 <19> (C)2011 HI CORPORATION. All Rights Reserved.
  • 20.
    2.NDK(C-Native)で⾼速化! Draw() Java C-Native glDrawElements() 重(JNI) glDrawElements() glDrawElements() glDrawElements() glDrawElements() glDrawElements() glDrawElements() glDrawElements() Draw() glDrawElements() nativeRender() 重(JNI) glDrawElements() nativeRender() glDrawElements() ついでに、アプリのロジック自体も C⾔語で書いてしまうとさらに⾼速! glDrawElements() <20> (C)2011 HI CORPORATION. All Rights Reserved.
  • 21.
    2.NDK(C-Native)で⾼速化! メソッドをC⾔語で記述し、JNIで呼び出すには? ・nativeという宣⾔を持つ、ダミーのJavaメソッドを記述 HiGlesDemoNdk.java private native void nativeInit(); private native void nativeResize(int w, int h); private native void nativeRender(); ・Eclipseを使い⼀次コンパイル(classファイル⽣成のため) ・ヘッダファイルを⽣成  javah というユーティリティで自動的に⽣成可能。 ・ヘッダと対応したCソースファイルを記述。 <21> (C)2011 HI CORPORATION. All Rights Reserved.
  • 22.
    2.NDK(C-Native)で⾼速化! メソッドをC⾔語で記述し、JNIで呼び出すには? ・jniディレクトリにShell(コマンドライン)で移動し、 ndk-build スクリプトを実⾏。 →/libs/armeabi ディレクトリに.soが⽣成される。 ・Eclipseから、⽣成済の.soを含めてビルド・実⾏。 今回のNDK向けサンプルも、上記の2⼿順でビルド可能 (Android NDKサンプルのSanAngelesの構成を踏襲) <22> (C)2011 HI CORPORATION. All Rights Reserved.
  • 23.
  • 24.
    2.NDK(C-Native)で⾼速化! ⾒た目はSDK(Java)版と同じ。 ※背景⾊のみSDKと⾒た目を  変えるため、グレーに変更。 <24> (C)2011 HI CORPORATION. All Rights Reserved.
  • 25.
    2.NDK(C-Native)で⾼速化! SDK版とNDK版動作速度⽐較 SDK(Java) 19.24FPS NDK(JNI:C-Native) 29.09FPS ※Android 2.3.4搭載のNexus Oneにて測定 弊社3Dエンジンを使った例では、フレームレートで 3倍程度の差が出た例もある。 <25> (C)2011 HI CORPORATION. All Rights Reserved.
  • 26.
    2.NDK(C-Native)で⾼速化! NativeActivityという選択肢は? Android2.3(GingerBread)以降のみで対応している機能。 Android2.2(Froyo)以前の端末がまだまだ流通している 現状では、NDKベースでJNI記述するのが現実的。 将来的には、おそらくNativeActivityに集約されるが、 プログラム技術は同じものが転用可能。 <26> (C)2011 HI CORPORATION. All Rights Reserved.
  • 27.
    3. その他の⾼速化ポイント ・圧縮テクスチャの使用  ATITC(Qualcomm系チップ)  PVRTC (PowerVR系チップ)  DXT (nVidia系チップ) ※環境ごとに別の圧縮テクスチャが必要  OpenGL ES2.0以降、ETC1は標準で使用可能だが、  アルファ(マスク)のデータを持つことができず使いにくい。 圧縮テクスチャは、展開されずそのままGPUの描画に 使用され、データの転送帯域が⼩さくて済むことから、 処理が⾼速化される場合が多いのがポイント。 <27> (C)2011 HI CORPORATION. All Rights Reserved.
  • 28.
    3. その他の⾼速化ポイント ・Triangle Listではなく、TriangleStrip形式の活用 http://en.wikipedia.org/wiki/Triangle_strip より引用 Stripが⻑くなればなるほど、インデックスバッファの⻑さと、 ポリゴン数の⽐が1:1に収束する。 (Triangle Listの場合には常に3:1) ハードウェアが既にセットアップ済の2頂点を再利用して 描画するため⼀般的にTriangleListよりも⾼速。 <28> (C)2011 HI CORPORATION. All Rights Reserved.
  • 29.
    One more thing! OpenGLESを使えば、⾼速にポリゴンが描画できる。 しかし、それでアプリを作るのに必要な機能は充分? 例) ボーンアニメーション カメラ制御 3Dツールで作成したデータの読み込み 3Dの当たり判定 <29> (C)2011 HI CORPORATION. All Rights Reserved.
  • 30.
    One more thing! MascotCapsule eruption ST ・今までの3D描画エンジンと比べて処理速度が速くなり、ポリゴンの表示能 力が飛躍的に向上。 ・機器を選ばないライブラリ実装で、ネイティブ、Javaなどさまざまな環境 でのサポートが可能。 ・国際標準規格であるOpenGL® ESに対応した、3Dアクセラレータチップの 連携が可能。 OpenGL® ES 2.0にも対応。 ・市販3Dツールで作成したデータを専用フォーマットへ変換して使用可能。 ・MascotCapsule V3のmbac/mtraデータの描画も可能。 ・従来のeruptionに対して、立体視機能拡張が追加されています。 <30> (C)2011 HI CORPORATION. All Rights Reserved.
  • 31.
    One more thing! MascotCapsule eruption ST 主要機能 モーションブレンド モーフィング エフェクト(パーティクル) モーションブレンドを使うことで、滑ら モーフィング機能を使い、例えばフェイ パーティクル(粒⼦)の運動、形状変化 かにモーションデータを切り替えられま シャルアニメーションのような演出が可 等のパラメータに基づき、粒⼦の集合体 す。 能になります。 をまとめて描画可能です。データは専用 のエフェクトエディタで作成します。 ⾛り 中間 歩き 笑い 中間 怒り テクスチャタイリング バンプマッピング プロジェクションシャドウ 物体の表⾯に凹凸があるように⾒せるこ 少ないテクスチャ領域で、地⾯や壁といっ 物体の影をよりリアルで正確に投影する とができます。(BREW3などOpenGL たサイズの大きな部分をカバーすること ことができます。 ES1.0対応機種は非対応) ができます。 法線マップ <31> (C)2011 HI CORPORATION. All Rights Reserved.
  • 32.
    One more thing! MascotCapsule eruption ST 主要機能 ⽴体視対応 V3Loaderサポート MascotCapsule V3用のmbac/mtra 裸眼⽴体視に対応した左目用、右目用の画像を自動的に⽣成可能です。 データの描画が可能です。 OpenGL ES2.0対応 SHARP ⽴体視対応Android端末及び OpenGL ES2.0のShaderを取り扱う (SH-03C / SH-12C等) APIをサポートしています。 ES2.0環境では、ES1.1の固定機能APIが Docomo FOMA ⽴体視対応Prime端末 削除されていますが、独自の Shaderエミュレーションレイヤを実装 (SH-10C / CA-01C / F-09C等) していますので、ES1.1向けのコンテン ツもそのまま動作させることが可能です。 では、端末標準搭載のためライセンス不要! <32> (C)2011 HI CORPORATION. All Rights Reserved.
  • 33.
    ご清聴ありがとうございました。 http://www.hicorp.co.jp http://www.mascotcapsule.com <33> (C)2011 HI CORPORATION. All Rights Reserved.