注意! この記事はQiitaにて公開されていた内容をimportしたものです。
これらの内容は場合によっては陳腐化していて役に立たなくなっていたり、有害であったり、現在の著者の主張と異なることがあります。
皆様の判断の上でご利用いただけますと幸いです(度を超してヤバいものは著者に連絡して頂ければ対応します m(_ _)m)


悩んだ結果のこのタイトル、ひどいねw

はじめに

AndroidにはGLSurfaceViewというViewがあります。OpenGL関連の操作を扱いやすくしたSurfaceView拡張Viewといったところです。 SurfaceViewはAPI level 1から存在し、GLSurfaceViewはAPI level 3から存在しています。

一方、API level 14から登場した後発のTextureViewには、GLTextureViewみたいなものが存在しません。 というわけでサードパーティーをアテにしていくのですが、現状2つの実装がありまして、どう違うのかな、というのを調べました。

そもそもなんでGLTextureViewが必要なん?TextureViewってオワコンだってネットに書いてあったけど?

おまえそれ下の条件が揃っても同じ事言えるの?(ライオンのAA略) これにマッチしない場合の利用想定はよく知らないです。

  • ExoPlayerを使っている
  • 独自のエフェクト(モノクロとか)を差し込みたい(SimpleExoPlayerViewは使えない)
  • GLSurfaceView.Rendererを実装したRendererをGLSurfaceView#setRenderer()して使っていた
  • これ重要:KitKatでカメラ撮影した動画の像が正しく表示されないのを解決したい
    • (具体的にはportlaitで撮ったものが90度回転している)
    • ExoPlayerのIssueにもあるが解決は難しいらしい
    • 同じIssue内にsetTransformを使ったワークアラウンドがあるが、TextureViewにはあってSurfaceViewにはない
    • ぶっちゃけGLSurfaceViewで手早く解決できるならそのほうが良いが、うまくいかないものでGLTextureViewを探した

1. eaglesakura/gltextureview

eaglesakuraさんは日本語におけるOpenGL ES関連で情報発信されている、たいへん有名な方だと思います。 今やっている案件で必要になったのでこの記事とか10回以上は読み直したし、氏の書籍を2冊読んで案件に取り組んだりしました。感謝。

GLSurfaceViewに似せて作ろうとかそういうことではなく、作者の経験に基づく改善アプローチがAPIから垣間見えます。 つまるところ利用する側から見れば、単にGLSurfaceViewから置き換えるだけではAPI互換がないということです。とはいえ、違うところはREADMEに書かれているので(特に日本語が読める人には)親切な設計です。

規模感としては、いくつかのファイルに分かれているものの、全ての行数を足しても1000行いくかいかないか、という感じです。

ライセンスはNYSLです。プロジェクトで使っても安心。

2. com.google.android.apps.muzei.render.GLTextureView.java at romannurik/muzei

muzeiはGooglerのRoman Nurikさんが制作しているLive Wallpaperアプリです。ソースコードが公開されています。

こちらはeaglesakuraさんのものと異なり、GLSurfaceViewに似せて作っているようです。 ただAPIが似てるだけじゃなくて、忠実にGLSurfaceViewの振る舞いを再現しているように見えます(試したわけではない)。

規模感としては、1700行ちかくあります。しかしこのファイルだけコピペしたら動くので楽チンです。 (コピペするときは Apache Licences Version 2.0 に従って使うこと)

「今週の GLTextureViewは どっち!?」

muzeiのGLTextureViewを採用しました。

理由

うすうす感づかれた方もいるかと思いますが、私のプロジェクトではGLSurfaceViewで問題があったので移行せざるを得なくなりました。 そのため、できる限りGLSurfaceViewとの機能差が少ないほうを選びました。

実はeaglesakura/gltextureviewを当初使おうとしていたのですが、GLSurfaceView#queueEvent(Runnable)相当の振る舞いを再現できず、発生したlibEGL関連のエラーを解決できなかったという事情もあります。 GLTextureView#requestAction(Runnable)がそれっぽいので使っていたんですが、うまくいきませんでした。

最後に

そもそもTextureViewがなー、うーん、みたいな話はありますが、まぁいろいろあるので頑張って参りたいと思います。