Androidの 画面描画機構を チューニングする!

日本Androidの会 2009年10月
Androidの
画面描画機構を
チューニングする!
Speaker:
日本システム開発株式会社
第2事業部 石原 正樹
[email protected]
Copyright © 日本システム開発株式会社 All Rights Reserved
会社紹介
日本システム開発株式会社
ソフトウェアの受託開発
業務システム、組込みソフト事業など
組込み事業では
 Linux、Android、iTronのソフト開発
 開発経験を生かした技術者教育
 etc...
詳しくはこちら
 http://www.nskint.co.jp/
p2
テーマ(1)
 Androidの特徴の1つに「オープンソー
ス」であることが挙げられます。
 誰でも自由に使えるという良い面がありま
すが、
 誰かのために最適化されたものではあり
ません。
 要求を満たすことができない部分は自身
で最適化を行う必要が出てきます。
p3
テーマ(2)
特に画面描画はその要求が大きくな
りやすい。
今回はAndroidの画面描画の中枢を
担うSurfaceFlingerをターゲットに、
課題となりやすいポイント
どのような解決方法があるのか
を紹介します。
p4
Agenda
①SurfaceFlingerとは?
②SurfaceFlingerのチューニング
ポイント
色深度
描画速度
1アプリケーションのメモリ
③Nativeアプリケーションでの描画
p5
① SurfaceFlinger
とは?
p6
SurfaceFlingerとは?
画面描画ソフトウェアスタックの中心
に位置し、描画の実行、管理を行う
コンポーネント。
p7
SurfaceFlingerとは?
Androidアプリケーション
JavaVM (Dalvik)
SurfaceFlinger
User
Kernel
描画エンジン(OpenGLなど)
Linux
FrameBuffer
Videoデバイス
p8
SurfaceFlingerの構成詳細
SurfaceFlingerの周辺の構成を、
もう少し詳しく説明します。
p9
SurfaceFlingerの構成詳細(1)
 SurfaceFlingerは各アプリケーションに
対し描画領域(Surface)を割り当てます。
p10
SurfaceFlingerの構成詳細(2)
 各アプリはSurfaceに
アプリ
アプリ
描画データの書き込み
Surface
Surface
を行います。
 SurfaceFlingerは各
SurfaceFlinger
Surfaceを取りまとめ、
描画エンジン
 描画エンジンを利用し
OpenGL
Copybit
てFrameBufferに書
き出しを行います。
FrameBuffer
p11
② SurfaceFlinger
のチューニング
ポイント
p12
SurfaceFlingerのチューニング
ポイント
色深度
描画速度
1アプリケーションのメモリ
p13
色深度
Android は 16bit カラーのみをサ
ポートしている
昨今は携帯電話をはじめ32bitカ
ラー(24bit以上)が要求されること
が多いが、その要求に答えることが
できない
p14
16bitカラー以上にするには?
 どこに修正を入れればよいか?
SurfaceFlingerのFrameBuffer設定
アプリの生成するSurface
p15
SurfaceFlingerのFrameBuffer設定
 現在の設定手順
システムの起動時に下記のようなやり取り
が行われている
SurfaceFlinger
FB情報取得
FrameBuffer
FBIOGET_VSCREENINFO
FBIOPUT_VSCREENINFO
16bitカラー
で動作する
ように設定!
16bitカラー
に変更!
FBIOGET_VSCREENINFO
FB設定反映
の確認
p16
SurfaceFlingerのFrameBuffer設定
つまり...
FrameBuffer を32bitで設定し、
SurfaceFlingerがFrameBufferを
32bitとして認識
できれば、実現は出来る
32bitカラー化
(16bitカラー以上)は
p17
SurfaceFlingerのFrameBuffer設定
 SurfaceFlingerで設定できる
FrameBuffreフォーマットは?
PIXEL_FORMAT_RGB_565 (default)
16bit RGB (565) フォーマット
PIXEL_FORMAT_BGRA_8888
32bit BGRA(8888) フォーマット
PIXEL_FORMAT_ARGB_8888
32bit ARGB(8888) フォーマット
SurfaceFlingerには32bitカラーの考慮有り
p18
SurfaceFlingerのFrameBuffer設定
 32bit化の方法
FrameBuffer を32bitに設定
SurfaceFlinger で FrameBufferのフォーマットを
PIXEL_FORMAT_BGRA_8888 として設定する
SurfaceFlinger FBIOGET_VSCREENINFOFrameBuffer
PIXEL_
FORMAT_
BGRA_8888
32bitカラー
で動作する
ように設定!
FBIOPUT_VSCREENINFO
32bitカラー
に変更!
FBIOGET_VSCREENINFO
p19
アプリの生成するSurface
 Surface 32bppバッファ割当て
Android フレームワークが割り当て
るSurfaceバッファのデフォルトは
16bitカラー
p20
アプリの生成するSurface
 Surface 32bppバッファ割当て
アプリが16bitカラーでは、
SurfaceFlinger → FrameBufferを
32bit化しても真価が発揮できない
16bpp
16bpp
32bpp???
p21
アプリの生成するSurface
 Surface バッファの割り当てパターンは?
OPAQUE (default)
16bit RGB(565)のバッファを確保
TRANSPARENT
16bit RGBA(5551)のバッファを確保
TRANSLUCENT
32bit ARGB(8888)のバッファを確保
Surfaceバッファにも32bit化の考慮有り
p22
Surface 32bppバッファ化
 アプリのSurface生成のデフォルト
設定をOPAQUE(16bpp)から
TRANSLUCENT (32bpp) に変
更することで既存アプリのSurface
も32bit化が可能
32bpp
32bpp
32bpp
p23
描画速度
32bitカラー化により次の問題が発
生した。
16bitカラーのときに比べて描画
性能が
1/10 に低下!!
p24
デモ
p25
描画速度
なぜ?
Androidの描画エンジンは16bitカ
ラーを前提としている
このため、32bitカラー時の性能まで
考慮されていない
p26
描画速度
描画速度の改善にはどのような方
法があるか?
ハードウェアアクセラレータを使用した
Copybitライブラリの使用
OpenGL描画エンジンの改善
p27
Copybitライブラリの使用
 Copybitライブラリとは?
ハードウェア・アクセラレータを使用した2D
描画エンジン・ライブラリ
p28
Copybitライブラリの使用
 Copybit
ライブラリ
とは?
存在していたらCopybit
エンジン呼び出し!
アプリ
アプリ
Surface
Surface
SurfaceFlinger
/system/lib/hw/copybit/
ro.hardware
があるか探す
描画エンジン
OpenGL
Copybit
出力
FrameBuffer
p29
Copybitライブラリの使用
 しかし…
Androidのオープンソースプロジェクトには
Copybitライブラリは含まれていない!
 Copybitライブラリがなかった場合は?
OpenGL汎用描画エンジンを使用する
(=2D描画でもOpenGLが使われる)
OpenGLはAndroidオープンソースプロジェクト
に含まれているため、どの環境でも使用可能
p30
OpenGLの性能問題
 1/10 に低下したのはOpenGLラ
イブラリが原因
 16bitカラーを想定した高速化ルー
トは存在するが・・・
 32bitカラーを想定した高速化ルー
トは存在しないため、汎用ルートを
通る
p31
OpenGL汎用ルートは何故遅い?
 全ての描画パターンに対応しているため、ピ
クセル単位で条件判定が発生
Surface
32bpp(α無し)
Surface
32bpp(α有り)
OpenGL
汎用描画
関数
Surface
16bpp
ボトルネック
FrameBuffer
p32
16bppの場合は?
 Surface の条件毎に専用のモジュールを設
定している
Surface
32bpp(α無し)
32bpp⇒16bpp
特化関数
Surface
32bpp(α有り)
32bpp⇒16bpp
α有り特化関数
Surface
16bpp
16bpp⇒16bpp
特化関数
FrameBuffer
16 bit
p33
さらに ARM アーキテクチャの場
合は?
アセンブラにして高速化している
p34
OpenGLの高速化には?
 Surface 単位に条件に応じたモジュールを
作成
 アセンブラ化して無駄なロジックを削る
Surface
32bpp(α無し)
32bpp⇒32bpp
特化関数
Surface
32bpp(α有り)
32bpp⇒32bpp
α有り特化関数
Surface
16bpp
16bpp⇒32bpp
特化関数
FrameBuffer
32 bit
p35
デモ
p36
1アプリケーションのメモリ
既に紹介したとおり、各アプリケー
ションにはSurfaceという描画領域
が割り当てられます。
そのSurfaceに割り当てられる描画
メモリは1アプリ単位で最大で8MB
となっています。
p37
1アプリケーションのメモリ
と、いうことは?
8MBを超える描画領域を必要とする
アプリケーションはメモリ確保が出来
ず起動に失敗する
32bitカラー化した場合、描画領域が
16bitカラーの倍必要となるため問題
となる可能性が上がる
p38
1アプリケーションのメモリ
では、どうすればよいか?
Surface バッファのメモリの上限を
8MB 以上にする
p39
③ Nativeアプリケー
ションでの描画
p40
Natvieアプリとは?
C/C++で記述したLinuxアプリ
ケーションのこと
p41
Androidのアプリは…
通常、Javaで実装を行います。
勿論、APIはJavaのクラスとなります。
ドキュメント、リファレンスもJavaのクラ
スしか用意されていません。
p42
でも、Java内部では…
C/C++のコードが呼び出されてい
ます。(JNI)
また、内部のC/C++のソースコード
に関しても、全てオープンソースで
公開されています。
p43
ということは…
 NativeアプリでもJavaと同じようにGUI
を持たせて共存できるのでは?
 JavaよりNatvieアプリのほうが実行速
度が速いのでは?
 そういった理由から、Natvieアプリでも
SurfaceFlingerを利用した画面描画を
行ってみました。
p44
Javaアプリで描画
 (既に説明済みですが)既存のJavaアプ
リは下図の構成で描画を行っています。
p45
では、Nativeアプリではどのよう
に描画するのか?
Native
アプリ
Surface
 Javaアプリと同じくSurfaceを生成して
描画してあげればOK!!
p46
仕組みをもう少し詳しく…
 JavaアプリとSurfaceFlingerはサーバ
/クライアントの形式で接続を行ってい
ます。
User Kernel
Java
アプリ
接続
Surface
Flinger
Frame
Buffer
Surface生成要求
Surface
Surface受け取り
p47
仕組みをもう少し詳しく…
 JavaアプリとSurfaceFlingerはサーバ
/クライアントの形式で接続を行ってい
ます。
User Kernel
Java
アプリ
描画
データ
書き込み
Frame
Buffer
Surface
Flinger
接続
Surface生成要求
Surface
Surface受け取り
Surface
集荷
出力
p48
Nativeアプリでの実現
その仕組みを利用して、同じ手順で
接続・要求を行うことで実現できる。
User Kernel
Java
Native
アプリ
アプリ
接続
Surface
Flinger
Frame
Buffer
Surface生成要求
Surface
Surface受け取り
p49
Nativeアプリでの実現
その仕組みを利用して、同じ手順で
接続・要求を行うことで実現できる。
User Kernel
SurfaceFlingerからはJavaアプリと同じに見え
る。(GUI共存が可能!!)
Frame
Surface
Java
Native
接続
Buffer
Flinger
アプリ
アプリ
描画
データ
書き込み
Surface生成要求
Surface
Surface受け取り
Surface
集荷
出力
p50
デモ
p51
Nativeアプリでの注意・補足(1)
 Javaアプリで使用していたCanvasや
SurfaceViewといった描画クラスは、
Nativeアプリ用には用意されていない。
Nativeアプリにとって、Surfaceバッファは
FrameBufferのメモリを直接さわっている
のと同じイメージ
現状、描画は全てドットでベタ塗り
p52
Nativeアプリでの注意・補足(2)
 アプリケーションを表示するレイヤに注意
レイヤ情報は整数値で管理されている。
既存Javaアプリの持つレイヤ情報を意
識して値を決定する必要がある。
 性能がどれだけかわる…?
Android アプリとNative アプリで、実際に
どれだけ性能アップするかは未評価(今後の
課題)
p53
Nativeアプリで描画ができると
…
 Linuxの既存GUIアプリをAndroid上で共存させられ
る可能性も…
p54
以上、
ご清聴ありがとう
ございました。
p55