投稿

3月, 2021の投稿を表示しています

Android の OpenGL ES と SurfaceView / GLSurfaceView

イメージ
今さらながら Android の OpenGL ES に初めて手を付けてみた。これまでは ImageView の onDraw のカスタムか、ゲーム的なものでも、2D で SurfaceView の画面を丸ごと FrameBuffer として更新するような使い方しかしてこなかった。ところが今回、ちょっと凝った 2D のマップアプリのようなものを作ることになり、先述の通り従来は ImageView の onDraw カスタムで対処してきたのだが、できれば、SurfaceView か、さらには OpenGL ES 化して、Google Map のようなヌルヌルしたものにできないかと思い、3D 用だと思って敬遠してきた OpenGL ES の領域にまで足を踏み入れてみることにした。 SurfaceView 以前、使ったことがあると言っても、ちょっとした 2D ゲームのサンプルで使った程度であり、非ゲームのアプリに利用するというような場合も含めて SurfaceView 自体を研究したことはなかったので、まずは SurfaceView をいじってみることにした。 レンダリング用スレッドを使用する Activity 側で SurfaceHolder.Callback を implement するなりして、レンダリング用スッドの生成や終了処理を行う。レンダリング用スレッド中では、Canvas を通じて FrameBuffer の描画を行なう。 Canvas canvas = mSurfaceHolder.lockCanvas(); canvas.drawBitmap(mFrameBuffer, 0, 0, mPaintObject); mSurfaceHolder.unlockCanvasAndPost(canvas); レンダリング用スレッドを使わないで、そのまま Main UI スレッドで同様のことを行うこともできるが、圧倒的に処理が重い。SurfaceView を使う意味がなくなる。 カスタム Handler を用意する Google のサンプル( Grafika )では、レンダリング用スレッドにカスタムメッセージを渡せるようにするために、カスタム Handler を用意して、カスタムメッセージを定義している。 Choreograph