2013年10月31日木曜日

TextureViewのライフサイクル(予想)

ところどころ違う箇所があるかもしれません。
なので予想です。表現が違っている箇所があるかもしれません。
例えばGLにtextureの作成を依頼するところとか。

肝はsurfaceを通じてnativeのGLの描画と関連付けすることです。
関連付けたsurfaceさえあればGLの描画スレッドとやりとりできるということです。
surfaceがHandlerみたいな感じですね。

Listenerは通知です。
AvailableはTextureViewが持つsurfaceをGLに関連付けするフェーズです。
UpdatedはGLからのsurfaceの受け取り完了通知を表しています。
DestroyedはGLに対して関連付けしたsurfaceの破棄を依頼することを表しています。


start
TextureViewがaddViewされる

TextureViewのonAttachedWindow
変更:getHardwareLayerが呼ばれて

TexureViewにSurfaceTextureListenerしたmListenerが呼ばれる


mListenerのonSurfaceTextureAvailableが呼ばれる

mListenerのonSurfaceTextureAvailableでsurfaceが用意されている

追加:Runnableに入る前にメンバーとしてGLインスタンスもっとかないと色々マズイ

surfaceのtextureを作るRunnable()を実行する。引数にsurfaceが必要。

RunnableでopenGLESの初期化と設定を行う。もしかしたらUI上で初期化がいるかもしれない。

surfaceをGLとバインドする。超大事。

初期化と設定が終わったらGLにsurfaceに描画するtextureの作成を依頼する

GL側でtextureができたらmListenerのonSurfaceTextureUpdatedが呼ばれる

textureがsurfaceに表示される
end

start
AcitivtyなりFragmentなり自身がisFinishing = trueなり、isRemoving = trueになり、detachedなり。

TextureViewのonDettachedWindow

onDettachedWindow内でmListenerのonSurfaceTextureDestroyedが呼ばれる。

surfaceをクライアントか「システム※1」かどちらが破棄するかのフラグをリターンする
※1.trueならonSurfaceTextureDestroyedが終わった後にonDettachedWindowでreleaseされる

追加:メンバーとしてGLインスタンスもっていれば、ここで破棄をGLに依頼できる※2
※2.onDettachedWindowに戻る前に破棄ができる。
onDettachedWindowでmListenerとのバインドが解除される

onDettachedWindowが終了。surface及びmListenerとの関連付けが全てなくなる。
end

0 件のコメント:

コメントを投稿