SlideShare a Scribd company logo
1 of 33
Download to read offline
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.

More Related Content

What's hot

磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!Ra Zon
 
ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介JustSystems Corporation
 
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』Yoshitaka Kawashima
 
すごい配列楽しく学ぼう
すごい配列楽しく学ぼうすごい配列楽しく学ぼう
すごい配列楽しく学ぼうxenophobia__
 
UnityとVuforiaで始めるAR開発
UnityとVuforiaで始めるAR開発UnityとVuforiaで始めるAR開発
UnityとVuforiaで始めるAR開発Takashi Yoshinaga
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装infinite_loop
 
実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選Drecom Co., Ltd.
 
Unityで意外と簡単・・・だけど難しいVRコンテンツ
Unityで意外と簡単・・・だけど難しいVRコンテンツUnityで意外と簡単・・・だけど難しいVRコンテンツ
Unityで意外と簡単・・・だけど難しいVRコンテンツinfinite_loop
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースHajime Yanagawa
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードShigenori Sagawa
 
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November増田 亨
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと増田 亨
 
いまさら学ぶMVVMパターン
いまさら学ぶMVVMパターンいまさら学ぶMVVMパターン
いまさら学ぶMVVMパターンYuta Matsumura
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編infinite_loop
 
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]bitter_fox
 
ゲームエンジンの文法【UE4】No.006 3次元座標(直交座標系) ,UE4の単位,アウトライナ,レイヤー
ゲームエンジンの文法【UE4】No.006 3次元座標(直交座標系) ,UE4の単位,アウトライナ,レイヤーゲームエンジンの文法【UE4】No.006 3次元座標(直交座標系) ,UE4の単位,アウトライナ,レイヤー
ゲームエンジンの文法【UE4】No.006 3次元座標(直交座標系) ,UE4の単位,アウトライナ,レイヤーTatsuya Iwama
 
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかJavaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかYoshitaka Kawashima
 
OpenFOAMにおける混相流計算
OpenFOAMにおける混相流計算OpenFOAMにおける混相流計算
OpenFOAMにおける混相流計算takuyayamamoto1800
 
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月Taku Miyakawa
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 

What's hot (20)

磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
 
ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介
 
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
 
すごい配列楽しく学ぼう
すごい配列楽しく学ぼうすごい配列楽しく学ぼう
すごい配列楽しく学ぼう
 
UnityとVuforiaで始めるAR開発
UnityとVuforiaで始めるAR開発UnityとVuforiaで始めるAR開発
UnityとVuforiaで始めるAR開発
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選
 
Unityで意外と簡単・・・だけど難しいVRコンテンツ
Unityで意外と簡単・・・だけど難しいVRコンテンツUnityで意外と簡単・・・だけど難しいVRコンテンツ
Unityで意外と簡単・・・だけど難しいVRコンテンツ
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
いまさら学ぶMVVMパターン
いまさら学ぶMVVMパターンいまさら学ぶMVVMパターン
いまさら学ぶMVVMパターン
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
 
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
 
ゲームエンジンの文法【UE4】No.006 3次元座標(直交座標系) ,UE4の単位,アウトライナ,レイヤー
ゲームエンジンの文法【UE4】No.006 3次元座標(直交座標系) ,UE4の単位,アウトライナ,レイヤーゲームエンジンの文法【UE4】No.006 3次元座標(直交座標系) ,UE4の単位,アウトライナ,レイヤー
ゲームエンジンの文法【UE4】No.006 3次元座標(直交座標系) ,UE4の単位,アウトライナ,レイヤー
 
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかJavaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか
 
OpenFOAMにおける混相流計算
OpenFOAMにおける混相流計算OpenFOAMにおける混相流計算
OpenFOAMにおける混相流計算
 
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 

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

Android OpenGL HandsOn
Android OpenGL HandsOnAndroid OpenGL HandsOn
Android OpenGL HandsOnIkuo Tansho
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介NilOne Ltd.
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignRyuji TAKEHARA
 
JJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/GrailsJJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/GrailsUehara Junji
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in DartGoro Fuji
 
Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesTakeshi Komiya
 
レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】Yasuhito Yabe
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGUehara Junji
 
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強Kiyoshi Ogawa
 
OpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみたOpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみた徹 上野山
 
20100930 sig startups
20100930 sig startups20100930 sig startups
20100930 sig startupsIchiro Fukuda
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~Sotaro Kimura
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発papamitra
 
130710 02
130710 02130710 02
130710 02openrtm
 
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)Takashi Yoshinaga
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/AndroidセキュアコーディングMasaki Kubo
 
Unityの夕べ in Fukuoka
Unityの夕べ in FukuokaUnityの夕べ in Fukuoka
Unityの夕べ in FukuokaShinobu Izumi
 

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

Android OpenGL HandsOn
Android OpenGL HandsOnAndroid OpenGL HandsOn
Android OpenGL HandsOn
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless Design
 
JJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/GrailsJJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/Grails
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
 
Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfes
 
レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
 
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
 
OpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみたOpenCVをAndroidで動かしてみた
OpenCVをAndroidで動かしてみた
 
20100930 sig startups
20100930 sig startups20100930 sig startups
20100930 sig startups
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発
 
130710 02
130710 02130710 02
130710 02
 
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/Androidセキュアコーディング
 
Unityの夕べ in Fukuoka
Unityの夕べ in FukuokaUnityの夕べ in Fukuoka
Unityの夕べ in Fukuoka
 

Recently uploaded

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 

Recently uploaded (8)

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 

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.
  • 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)で⾼速化! OpenGL ESを使ったにもかかわらず、 思ったほどフレームレートが上がらない? <17> (C)2011 HI CORPORATION. All Rights Reserved.
  • 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. 2.NDK(C-Native)で⾼速化! 同じ機能をNDK(JNI)で実装したサンプルのソースを確認。 ※jniディレクトリ以下のdemo.cソースを参照 Java使用の場合と 処理の内容は ほぼ等価。 <23> (C)2011 HI CORPORATION. All Rights Reserved.
  • 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ではなく、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.
  • 29. One more thing! OpenGL ESを使えば、⾼速にポリゴンが描画できる。 しかし、それでアプリを作るのに必要な機能は充分? 例) ボーンアニメーション カメラ制御 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.