eaglesakuraの技術ブログ

技術的な話題とか、メモとか。

GLTextureViewを公開しました

Android 4.0(API Level 14)からTextureViewというViewが登場し、OpenGL ESの応用範囲が格段に広くなりましたが、GLSurfaceViewに相当する補助クラスが未だに登場していません。

Google的には必要ないという考えかもしれませんが、SurfaceViewよりもTextureViewでOpenGL ESを扱ったほうが非常に楽なため、俺俺GLTextureViewクラスを公開しました。

GLTextureView(github)

詳細はREADME.mdにも記述されています。

GLSurfaceViewとの相違点

使い方はGLSurfaceViewとほぼ変わりありません。 ですが、おおまかに次の点が異なります。

  • リソース解放用にonSurfaceDestroy()を追加した
  • requestRender()の設計が異なる
    • GLSurfaceViewの場合 -> レンダリングスレッドへpostされるため、非同期実行される
    • GLTextureViewの場合 -> その場でレンダリングと画面への反映が行われる
  • 初期化用のメソッド名が異なる
    • 基本的にEnumを定義し、それをメソッドへ渡すようにしています

サンプルコード

例えば、GLTextureViewでOpenGL ES 2.0を初期化し、レンダリングスレッドを作成するコードは次のようになります。


public class SimpleGL20Activity extends Activity implements Renderer {
    static final String TAG = SimpleGL20Activity.class.getSimpleName();

    GLTextureView glTextureView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        glTextureView = new GLTextureView(this);

        // Setup GLTextureView
        {
            glTextureView.setVersion(GLESVersion.OpenGLES20); // set OpenGL Version
            //            glTextureView.setSurfaceSpec(SurfaceColorSpec.RGBA8, true, false); // Default RGBA8 depth(true) stencil(false)
            //            glTextureView.setRenderingThreadType(RenderingThreadType.BackgroundThread); // Default BackgroundThread
            glTextureView.setRenderer(this);
        }
        setContentView(glTextureView);
    }

    @Override
    protected void onPause() {
        glTextureView.onPause();
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        glTextureView.onResume();
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        Log.d(TAG, "onSurfaceCreated");
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        Log.d(TAG, String.format("onSurfaceChanged(%d x %d)", width, height));
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        GLES20.glClearColor(0, (float) Math.random(), (float) Math.random(), 1.0f);
        GLES20.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    }

    @Override
    public void onSurfaceDestroyed(GL10 gl) {
        Log.d(TAG, String.format("onSurfaceDestroyed"));
    }

}

日経ソフトウエア 2013年 04月号

日経ソフトウエア 2013年 04月号

初めてのOpenGL ES

初めてのOpenGL ES

日経ソフトウエア4月号にTextureViewの記事が掲載されました

「TextureViewで作ろう!」という記事が掲載されました

日経ソフトウエア 2013年 4月号に私が執筆したTextureViewを使った記事が掲載されました。

記事内容

Android 4.0(ICS)から追加された"TextureView"というViewの簡単な解説記事です。
API自体は一年以上前に公開されたため多少古いですが、現在までほとんど日本語の情報がないため、少しでも参考になればと思います。
TextureViewはSurfaceViewの強化版という認識で問題ありませんが、内部処理は全く違います。
今回の記事はその違いを説明するために、カメラを使った簡単なアプリを作成しました。

アプリ内容

端末のシステムレイヤー上に常にカメラ映像をオーバーレイします。
アプリを起動するとServiceを立ちあげ、Activity自体はすぐにfinish()します。
ServiceからTextureViewを作成し、システムレイヤーに登録してカメラのプレビューを行います。

f:id:eaglesakura:20130223200956j:plain

  • TextureViewを使った効果で、端末負荷やフレームレートが飛躍的に向上しています
  • オーバーレイするカメラ映像のα値を自由に設定出来ます
  • もともとmatsumoさんが作成した光学迷彩というAndroidアプリという似たアプリがあります
  • 操作は全てステータスバーで行います

f:id:eaglesakura:20130223201057j:plain

インストール

アプリ本体はGoogle Playにて公開中です。

ソースコード全文公開

ソースコードはgithubで公開中です。

よかったら買ってください

もし気になるようだったら買ってもらえると嬉しいです。

日経ソフトウエア 2013年 04月号

日経ソフトウエア 2013年 04月号

JenkinsにBGMを付ける

 Jenkinsを使った開発を楽しくしようとして、BGMをつけたら案外話題になったからそのまとめ。

 

事の始まり

  • iOSアプリの開発のために、余っていたMac Book AirにJenkinsを導入することに
  • せっかくMBAだから、サーバー側のJenkinsには出来ないことをやろうと思った

 

導入方法

導入というほど大仰なことは実は行ってなくて、かなり適当な方法を取っています。

Macのターミナルには"afplay"という音源再生のコマンドがあるので、それを組み合わせるだけです。

  • 鳴らしたい音をmp3でJenkinsを導入したMBAに保存
  • もともとJenkinsのビルドはシェルを実行する形式だったので、シェルに直接サウンドを鳴らすコマンドを記述する

スクリプト記述例

  • ここではci-buildというシェルスクリプトをgitのrootに用意して、Jenkinsからそのスクリプトを蹴っている
  • Macのターミナルの場合"&"を使うとビルドとサウンドを同時に行える
  • afplayだけを使うと、ビルド完了後BGMを再生したり、BGM再生後にビルドを開始するという悲しいことになる
  • "wait"を使うと、ビルド実行とBGM再生の両方が終わるのを待つ(らしい)
  • 実際にはビルドが5分以上かかるから、BGMが先に終わることはない
  • ビルド完了後の効果音処理についてはこちらのブログが詳しいです

------------------------------------------------------------------------------------------------

./ci-build & afplay ~/sound.jenkins/build.mp3

# ビルド実行待ちを行う

wait

if [ $? -ne 0 ]; then

    echo "build failed…"

    exit 1

fi

------------------------------------------------------------------------------------------------ 

 

効能

  • ビルド開始やテスト開始等のJenkinsの動きに応じて好きなBGMを付けられる
  • BGMとSEのお陰で「どのプロジェクト」が「どのようなビルド結果になったのか」を職場の全員にブロードキャストできる
  • Jenkinsを導入する気になる
  • Jenkinsが頑張ってる感が出る
  • テストも作る気になる
  • FF楽曲はやる気が出る
  • コーディングが楽しくなる!!

難点

  • BGMとSEのお陰でテストが壊れるとDISられる

 

 というわけでシェルを使うだけのとても簡単な方法でBGMを付けられるので、余ってるMacがあってJenkinsを導入してる人はオススメです。

お一人様から楽しめます。