日本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
© Copyright 2024 ExpyDoc