Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
あ…ありのまま 今 起こった事を話すぜ!
おれはTextureViewで
プロジェクトを開始していたと思ったら
いつのまにかSurfaceViewに戻っていた
株式会社トップゲート
山下武志@eaglesakura
諸事情により、
ABC2014Spring版から
一部の画像が削除されています
Effective Androidと
ちょっと違う方向性だが
そんなセッションで大丈夫か?
自己紹介
山下武志
@eaglesakura
著書
初めてのOpenGL ES
コピペではじめる
Androidゲームプログラミング
Effective Android
宣伝
OpenGL ES Android/iOS対応
基礎編
4月発売予定
宣伝
OpenGL ES Android/iOS対応
応用編
5月発売予定
今日の話がなんと本に?
これから20分間何を話すのか
Effective Androidで
語り足りなかった
TextureViewへの怨嗟の呻き声
あるいは、如何にして
俺が地獄へ落ちたか
TextureViewとは
TextureViewが
どれだけ素晴らしいか
君たちに教えてあげよう
2011年11月
Android 4.0リリース
G⃝⃝gle「すっげーView作ったったwwwww」
TextureViewの特徴①
SurfaceViewと違ってWindowを作らない
SurfaceViewの仕組み
SurfaceView
Activity
SurfaceView
SurfaceViewの仕組み
SurfaceViewはActivityの
「手前」か「奥」にしか
描画できない
SurfaceViewの仕組み
Viewという名前が付いてるけど、
実装はタダのWindowである。
SurfaceViewの仕組み
Viewと同じ座標にWindowを生成して
Viewっぽく見せてるけど、Window。
ImageView
SurfaceViewの仕組み
SurfaceView
ボタン
こういう複雑なレイアウトは
作ることが出来ない
ImageView
TextureViewの仕組み
TextureView
ボタン
TextureViewは「View」である。
複雑なレイアウトもおk
TextureViewの特徴①
TextureViewはViewである。
ImageView
TextureViewの仕組み
TextureView
ボタン
TextureViewは「View」である。
動的にレイアウトの移動も出来る
ImageView
TextureViewの仕組み
TextureView
ボタン
TextureViewは「View」である。
回転も出来る
ImageView
TextureViewの仕組み
TextureView
ボタン
TextureViewは「View」である。
ALPHAも使える
うはwwww便利wwwww
TextureViewの特徴②
EGLSurface用
native_windowとして使える
TextureViewの特徴②
つまりは
OpenGL ESの描画が行える
TextureViewの特徴②
あと、
カメラのプレビューとかにも
使える
うはwwww便利wwwww
TextureViewの特徴③
SurfaceViewに比べて
ライフサイクルが簡略化されている
SurfaceViewのライフサイクル
・surfaceChanged
・surfaceCreated
・surfaceDestroyed
ライフサイクルタイミング
・Activity#onCreate
・Activity#onPause
・Activity#onResume
・Activity#onConfigurationChanged
・透過ActivityならばonPause...
ライフサイクルタイミング
つまりはアプリがPause/Resume/終了等
かなり頻繁に呼び出される
TextureViewのライフサイクル
・onSurfaceTextureAvailable
・onSurfaceTextureSizeChanged
・onSurfaceTextureDestroyed
ライフサイクルタイミング
・Activity#onCreate
・Activity#onConfigurationChanged
・Activity#onDestroy
ライフサイクルタイミング
onCreateでTextureViewが確保∼
onDestroyでTextureViewが廃棄されるまで、
ライフサイクルが発生しない
ライフサイクルタイミング
うはwwww便利wwwww
TextureViewとは何者なのか
大雑把に説明する
TextureViewの中身は、
OpenGL ESで言うところの
テクスチャレンダリング
(表現を変えると)内部的に
Bitmapを持っていて、
そこに描画を行わせている。
一度描画用メモリを確保したら、
Activityのライフサイクルに
かかわらず保持し続ける。
一方SurfaceViewは
実体がWindowであるため、
Windowの破棄・生成タイミング
でライフサイクルが発生する。
それによる利点
EGLSurfaceが
onPause/onResumeで死なない
以上の利点により、
OpenGL ESを使った
某プロジェクトで
TextureViewを導入
プロジェクト は
じゅんちょう に
すすんでいた
かのように見えた
3ヶ月後
絶望が俺のゴールだ
TextureViewの地獄①
この世の理はすなわち
描画速度だと思いませんか!?
TextureViewの地獄①
TextureViewは垂直同期をとらない
TextureViewの地獄①
SurfaceViewは自動的に垂直同期をとる。
たぶん、Windowだから。
TextureViewの地獄①
具体的には、eglSwapBuffersで
自動的に垂直同期がとられる。
TextureViewの地獄①
TextureViewは
テクスチャレンダリングを行うため、
垂直同期をとらない。
TextureViewの地獄①
具体的には、eglSwapBuffersが
垂直同期を待たずに終了する。
TextureViewの地獄①
実際にやってみた
TextureViewの地獄②
TextureViewは速い(確信)
TextureViewの地獄②
glFinishしかしとらん
TextureViewの地獄②
TextureViewは内部で
Bitmap(SurfaceTexture)を持つ
じゃあ、それが解放される
onSurfaceTextureDestroyed
はいつ呼ばれるのか?
TextureViewの地獄②
onPauseじゃ呼ばれない。
onDestroyまで呼ばれない。
!
つまりはライフサイクルがシンプルに出来る。
TextureViewの地獄②
TextureViewの地獄②
onPause中のActivityはリソースを程よく殺す。
つまり、TextureViewも程よく殺す。
TextureViewの地獄②
TextureViewの地獄②
他のアプリでメモリが足りないなら、
TextureViewが死ぬしかないじゃない!!
いつ殺すの?
TextureViewの地獄②
知らんがな(́・ω・`)
TextureViewの地獄②
つまり検証が難しい。
TextureViewの地獄②
TextureViewはメモリを大量に消費する
TextureViewの地獄③
onResume後のActivityは
メモリが優先的に保持される
TextureViewの地獄③
つまり、
他のアプリやServiceを殺してでも
生き残る!
TextureViewの地獄③
史上最大の絶望
TextureViewの地獄④
TextureViewの地獄④
漏れてるの。
アレが。
何がって
TextureViewの地獄④
メモリ♥
TextureViewの地獄④
TextureViewの地獄④
メモリリークを引き起こす最小コード
TextureViewの地獄④
TextureViewの地獄④
TextureViewの地獄④
TextureViewの地獄④
解決方法
TextureViewを捨て、
SurfaceViewへ切り替えた
TextureViewの地獄④
TextureViewの地獄④
そしたら直った
TextureViewの地獄④
実際の所、
これはOS/GPUドライバ側の実装、
もしくは俺氏のコードの問題である
可能性が微レ存
TextureViewの地獄④
まとめ
G⃝⃝gleが説明した要件
すごい
俺氏の理解
最強に見える(迫真)
実装された運用
いや、確かに強いが、
運用に問題がありすぎね?
俺氏が本当に必要だったもの
SurfaceView
is
安
TextureView
is
[検閲により削除]
ドキュメントなんて単なる目安だ!
あとは勇気(デスマ)で補えばいい!!
質問があれば
あ・・・ありのまま今起こったことを話すぜ!おれはTextureViewでプロジェクトを開始していたと思ったらいつのまにかSurfaceViewに戻っていた
あ・・・ありのまま今起こったことを話すぜ!おれはTextureViewでプロジェクトを開始していたと思ったらいつのまにかSurfaceViewに戻っていた
あ・・・ありのまま今起こったことを話すぜ!おれはTextureViewでプロジェクトを開始していたと思ったらいつのまにかSurfaceViewに戻っていた
あ・・・ありのまま今起こったことを話すぜ!おれはTextureViewでプロジェクトを開始していたと思ったらいつのまにかSurfaceViewに戻っていた
あ・・・ありのまま今起こったことを話すぜ!おれはTextureViewでプロジェクトを開始していたと思ったらいつのまにかSurfaceViewに戻っていた
あ・・・ありのまま今起こったことを話すぜ!おれはTextureViewでプロジェクトを開始していたと思ったらいつのまにかSurfaceViewに戻っていた
Upcoming SlideShare
Loading in …5
×

あ・・・ありのまま今起こったことを話すぜ!おれはTextureViewでプロジェクトを開始していたと思ったらいつのまにかSurfaceViewに戻っていた

23,879 views

Published on

Android Bazaar and Conference 2014 Springで発表したTextureViewとSurfaceViewの特徴に関するスライドです。

Published in: Technology
  • Be the first to comment

あ・・・ありのまま今起こったことを話すぜ!おれはTextureViewでプロジェクトを開始していたと思ったらいつのまにかSurfaceViewに戻っていた

  1. 1. あ…ありのまま 今 起こった事を話すぜ! おれはTextureViewで プロジェクトを開始していたと思ったら いつのまにかSurfaceViewに戻っていた 株式会社トップゲート 山下武志@eaglesakura
  2. 2. 諸事情により、 ABC2014Spring版から 一部の画像が削除されています
  3. 3. Effective Androidと ちょっと違う方向性だが そんなセッションで大丈夫か?
  4. 4. 自己紹介
  5. 5. 山下武志 @eaglesakura
  6. 6. 著書 初めてのOpenGL ES コピペではじめる Androidゲームプログラミング Effective Android
  7. 7. 宣伝 OpenGL ES Android/iOS対応 基礎編 4月発売予定
  8. 8. 宣伝 OpenGL ES Android/iOS対応 応用編 5月発売予定 今日の話がなんと本に?
  9. 9. これから20分間何を話すのか
  10. 10. Effective Androidで 語り足りなかった TextureViewへの怨嗟の呻き声
  11. 11. あるいは、如何にして 俺が地獄へ落ちたか
  12. 12. TextureViewとは
  13. 13. TextureViewが どれだけ素晴らしいか 君たちに教えてあげよう
  14. 14. 2011年11月 Android 4.0リリース
  15. 15. G⃝⃝gle「すっげーView作ったったwwwww」
  16. 16. TextureViewの特徴① SurfaceViewと違ってWindowを作らない
  17. 17. SurfaceViewの仕組み SurfaceView Activity SurfaceView
  18. 18. SurfaceViewの仕組み SurfaceViewはActivityの 「手前」か「奥」にしか 描画できない
  19. 19. SurfaceViewの仕組み Viewという名前が付いてるけど、 実装はタダのWindowである。
  20. 20. SurfaceViewの仕組み Viewと同じ座標にWindowを生成して Viewっぽく見せてるけど、Window。
  21. 21. ImageView SurfaceViewの仕組み SurfaceView ボタン こういう複雑なレイアウトは 作ることが出来ない
  22. 22. ImageView TextureViewの仕組み TextureView ボタン TextureViewは「View」である。 複雑なレイアウトもおk
  23. 23. TextureViewの特徴① TextureViewはViewである。
  24. 24. ImageView TextureViewの仕組み TextureView ボタン TextureViewは「View」である。 動的にレイアウトの移動も出来る
  25. 25. ImageView TextureViewの仕組み TextureView ボタン TextureViewは「View」である。 回転も出来る
  26. 26. ImageView TextureViewの仕組み TextureView ボタン TextureViewは「View」である。 ALPHAも使える
  27. 27. うはwwww便利wwwww
  28. 28. TextureViewの特徴② EGLSurface用 native_windowとして使える
  29. 29. TextureViewの特徴② つまりは OpenGL ESの描画が行える
  30. 30. TextureViewの特徴② あと、 カメラのプレビューとかにも 使える
  31. 31. うはwwww便利wwwww
  32. 32. TextureViewの特徴③ SurfaceViewに比べて ライフサイクルが簡略化されている
  33. 33. SurfaceViewのライフサイクル ・surfaceChanged ・surfaceCreated ・surfaceDestroyed
  34. 34. ライフサイクルタイミング ・Activity#onCreate ・Activity#onPause ・Activity#onResume ・Activity#onConfigurationChanged ・透過ActivityならばonPause中にもライフサイ クルが発生する
  35. 35. ライフサイクルタイミング つまりはアプリがPause/Resume/終了等 かなり頻繁に呼び出される
  36. 36. TextureViewのライフサイクル ・onSurfaceTextureAvailable ・onSurfaceTextureSizeChanged ・onSurfaceTextureDestroyed
  37. 37. ライフサイクルタイミング ・Activity#onCreate ・Activity#onConfigurationChanged ・Activity#onDestroy
  38. 38. ライフサイクルタイミング onCreateでTextureViewが確保∼ onDestroyでTextureViewが廃棄されるまで、 ライフサイクルが発生しない
  39. 39. ライフサイクルタイミング うはwwww便利wwwww
  40. 40. TextureViewとは何者なのか
  41. 41. 大雑把に説明する
  42. 42. TextureViewの中身は、 OpenGL ESで言うところの テクスチャレンダリング
  43. 43. (表現を変えると)内部的に Bitmapを持っていて、 そこに描画を行わせている。
  44. 44. 一度描画用メモリを確保したら、 Activityのライフサイクルに かかわらず保持し続ける。
  45. 45. 一方SurfaceViewは 実体がWindowであるため、 Windowの破棄・生成タイミング でライフサイクルが発生する。
  46. 46. それによる利点
  47. 47. EGLSurfaceが onPause/onResumeで死なない
  48. 48. 以上の利点により、 OpenGL ESを使った 某プロジェクトで TextureViewを導入
  49. 49. プロジェクト は じゅんちょう に すすんでいた
  50. 50. かのように見えた
  51. 51. 3ヶ月後
  52. 52. 絶望が俺のゴールだ
  53. 53. TextureViewの地獄① この世の理はすなわち 描画速度だと思いませんか!?
  54. 54. TextureViewの地獄① TextureViewは垂直同期をとらない
  55. 55. TextureViewの地獄① SurfaceViewは自動的に垂直同期をとる。 たぶん、Windowだから。
  56. 56. TextureViewの地獄① 具体的には、eglSwapBuffersで 自動的に垂直同期がとられる。
  57. 57. TextureViewの地獄① TextureViewは テクスチャレンダリングを行うため、 垂直同期をとらない。
  58. 58. TextureViewの地獄① 具体的には、eglSwapBuffersが 垂直同期を待たずに終了する。
  59. 59. TextureViewの地獄① 実際にやってみた
  60. 60. TextureViewの地獄② TextureViewは速い(確信)
  61. 61. TextureViewの地獄② glFinishしかしとらん
  62. 62. TextureViewの地獄② TextureViewは内部で Bitmap(SurfaceTexture)を持つ
  63. 63. じゃあ、それが解放される onSurfaceTextureDestroyed はいつ呼ばれるのか? TextureViewの地獄②
  64. 64. onPauseじゃ呼ばれない。 onDestroyまで呼ばれない。 ! つまりはライフサイクルがシンプルに出来る。 TextureViewの地獄②
  65. 65. TextureViewの地獄②
  66. 66. onPause中のActivityはリソースを程よく殺す。 つまり、TextureViewも程よく殺す。 TextureViewの地獄②
  67. 67. TextureViewの地獄② 他のアプリでメモリが足りないなら、 TextureViewが死ぬしかないじゃない!!
  68. 68. いつ殺すの? TextureViewの地獄②
  69. 69. 知らんがな(́・ω・`) TextureViewの地獄②
  70. 70. つまり検証が難しい。 TextureViewの地獄②
  71. 71. TextureViewはメモリを大量に消費する TextureViewの地獄③
  72. 72. onResume後のActivityは メモリが優先的に保持される TextureViewの地獄③
  73. 73. つまり、 他のアプリやServiceを殺してでも 生き残る! TextureViewの地獄③
  74. 74. 史上最大の絶望
  75. 75. TextureViewの地獄④
  76. 76. TextureViewの地獄④ 漏れてるの。 アレが。
  77. 77. 何がって TextureViewの地獄④
  78. 78. メモリ♥ TextureViewの地獄④
  79. 79. TextureViewの地獄④
  80. 80. メモリリークを引き起こす最小コード TextureViewの地獄④
  81. 81. TextureViewの地獄④
  82. 82. TextureViewの地獄④
  83. 83. TextureViewの地獄④ 解決方法
  84. 84. TextureViewを捨て、 SurfaceViewへ切り替えた TextureViewの地獄④
  85. 85. TextureViewの地獄④ そしたら直った
  86. 86. TextureViewの地獄④
  87. 87. 実際の所、 これはOS/GPUドライバ側の実装、 もしくは俺氏のコードの問題である 可能性が微レ存 TextureViewの地獄④
  88. 88. まとめ
  89. 89. G⃝⃝gleが説明した要件
  90. 90. すごい
  91. 91. 俺氏の理解
  92. 92. 最強に見える(迫真)
  93. 93. 実装された運用
  94. 94. いや、確かに強いが、 運用に問題がありすぎね?
  95. 95. 俺氏が本当に必要だったもの
  96. 96. SurfaceView is 安
  97. 97. TextureView is [検閲により削除]
  98. 98. ドキュメントなんて単なる目安だ! あとは勇気(デスマ)で補えばいい!!
  99. 99. 質問があれば

×