【転】Android技術ーー図形システムの詳細


本論文では、Androidグラフィックスシステムの底辺実装について説明しようとしている。Androidグラフィックスシステムの下には非常に複雑な実装があり、ドキュメントが少なく、X window、Cairoなどのような比較的人気のあるグラフィックスを使用していません。
 
 
画像は添付ファイルのAndroid中のグラフィックシステムにClient/Serverアーキテクチャを採用しています。Serverは主にc+コードで構成されています。Clientのエンドコードは二つの部分に分けられています。一部はJavaから提供された供給用のアプリで、もう一つはc+から作成された下の階で実現されます。下図の概要は、Androidグラフィックスシステムのアーキテクチャと使用される主要コンポーネントを紹介しています。Androidグラフィックスシステムにおいて重要な概念と手がかりはsurfaceである。Viewとそのサブクラス(例えばTextView、Button)はsurfaceに描かれます。各surfaceはCanvasオブジェクトを作成します。(ただし、プロパティは常に変更されます。)各canvasオブジェクトは、一つのbitmapに対応して、Surfaceに描かれた内容を格納する。各Surfaceは通常二つのbuffer、一つのfront buffer、一つのback bufferに対応します。なお、back bufferとは、canvas描画時に対応するbitmap (研究android_viewSurface.cpp:lockCanvas)である。そのため、絵は常にback buffer上にあり、更新が必要な場合はback bufferとfront bufferを交換します。The window is tied to a Surface and the View Root asks the Surface for aCanvas that is then used by the View to draw onto.After View data canvas,Viewiotll surfacell surface.unct  display panel.  SurfaceFlinger handles to tranfers drawn data in canvas to Surface front buffer or backbuffer Except for SurfaceView、different view within the same View Root shot the same surfacer.Layerの概念:
  surface     layer, SurfaceFlinger     layer front buffer  (composite)      。
A Layer is something that can be composited by SurfaceFlinger (should have been called LayerFlinger). There are several types of Layers if you look in the code, in particular the regular ones (Layer.cpp) , they are backed by a Surface, and the LayerBuffer (very badly chosen name) which don't have a backing store, but receive one from their client. . Note that the GGLSurface type, should have been called GGLBuffer
 
Multiple layers are just composited to the final buffer in  their Z order.
いくつかのオブジェクトはSurface概念と密接に関係しています。1.Java Surface(fram ewarks/base/core/java/android/view/Surface.java)。オブジェクトを間接的に呼び出し(SurfaceView、View Rootなどを通じて)、アプリケーションはSurfaceを作成し(canvasを同時に作成する)必要があり、このオブジェクトに図形を描画し、最終的にスクリーンに投稿します。2.C++Surface(frame ewarks/base/libs/ui/Surface.cpp。このオブジェクトはJava SurfaceによってJniに呼び出され、Java Surfaceの機能を実現する3.ISurface(およびその派生クラスBnSurface)。このオブジェクトはアプリケーションとserverの間のインターフェースです。C++Surfaceは、このISurface(BnSurface)を作成し、画面にsurfaceコンテンツを更新するなどのコマンドを送信します。Server側はこのコマンドを受け取り、対応操作を実行します。surfaceがどのように作成するかを研究するための重要なパスは以下の通りです。viewSurface.cpp--Surface_init()この関数でSurfaceComponeserClientオブジェクトが作成されます。3.frame eworks/base/libs/ui/SurfaceComponeposerCient.cpp--SurfaceComponeposer Cient::SurfaceCompserCient()この関数は非常に重要で、ここでclientとserverの間の橋を建立しました。関数_によるゲットするsurface_manager()はserverに向けられたIBinderオブジェクト(ISurfaceComponeserインターフェースを持つ)を獲得した後、このIBinderを通じてプロセスをまたいでServerにアクセスする機能があります。ISurfaceComponectionを作成し、ISurfaceFlinerCientのIBinderに戻りました。4.frame eworks/base/libs/ui/SurfaceCompserClient.cpp--SurfaceCompserCient::createSurface()この関数は、前に得られたISurfaceFline ClintのIBinderを利用して、そのcreateSurfaceインターフェースを呼び出します。5 frame eworks/base/libs/surfacefling er/SurfaceFling er.cpp--Blient::createSurface()。BlientはISurfaceFlinerClientから派生した。6.frame eworks/base/libs/surfacefling er/SurfaceFliner.cpp--SurfaceFling er::createSurface()。この関数はSurfaceに対応するLayerを作成します。上記のキーパスでは、1、2、3、4はクリーンプロセスで実行され、5、6はserverプロセスで実行されます。serviceとしてCientへのアクセスを提供します。グラフィック関連のコードは主に下記のディレクトリにあります。1、frameweorks/base/graphcs/java/android/graphics 2、frameworks/base/cose/java/android/view 3、fram ewoorks/base/core/java/android/android/widget 4、fffffffffffffffffframe/ftttttfffffffffffffffffffffffffram/ffffffffffreeeeeeeeeeffffffffffffffff7、フレームワーク/base/core/jni/android/graphics 8、frame eworks/base/core/jni/android/opengl 9、fram eworks/base/core/jni/android_view*.cpp 10、external/skyia一、下記のカタログの一部コード:1、frameweorks/base/graphhics/java/java/android/graphhics 2、framew orks/base/core/java/android/view 3、fraameworks/base/base/cose/cose/cose/come/come/cococococome/come/come/core/core/cocore/core/core/core/core/core/core/core/cocore/cocococococococore/core/core/come/cocococococore/coco基本的な図形原語(点画線を描くように、グラフィックコンテキストなどを設定します)、イベント機構、グラフィックユーザーインターフェースのコントロールなどを開発します。canvasは2 Dグラフィックスを開発するために用いられ、Surfaceはグラフィックスシステムによって描画できるSurfaceを表す。2 Dライブ3 Dグラフィックスは、その上に描画することができる。二.frame eworks/base/opengl/このディレクトリはopengelのインターフェースとソフトウェアの実現を含みます。はい、http://developer.android.com/guide/topics/graphics/opengl.htmlandroid.openglを使って3 d graphicsを開発する方法を詳しく紹介しています。三.external/skya、台湾のJservさんにより良い紹介があります。興味のある読者は彼のブログを参考にしてもいいです。http://blog.linux.org.tw/~jserv/archives/002095.簡単に言えば、skyaはcairo機能に相当し、下の層のグラフィックハードウェアをパッケージ化し、上のグラフィックライブラリに最も基礎的な操作パターンハードウェアの原語を提供する。四.frame eworks/base/libs/uiとframe eworks/base/libs/surfacefling erISurfaceは、基本的なSurfaceインターフェースを定義して、グラフィカルシステムクライアントとserver端(すなわちsurfacefliger)が相互作用します。BpSurfaceはISurfaceの派生タイプで、serverがクライアント機能を起動するためにインタフェースを提供します。BnSurfaceはISurfaceのもう一つの派生タイプで、クライアントがserver機能を起動するためにインタフェースを提供します。Serverは、クライアントからの呼び出し要求を受信すると、register Buffers、postBufferなど、BnSurface:on Transactがトリガされます。Surface(Layer BaseClientのプライベートクラス)はBnSurfaceの派生クラスです。SurfaceBufferはSurfaceBufferの派生タイプです。ISurfaceComponeserは、クライアントとserver端末の相互作用のための基本的なインターフェースを定義しています。BpSurfaceComponeserは派生タイプで、serverがクライアント機能を起動するためにインタフェースを提供します。BnSurfaceComponeserは別の派生タイプで、クライアントがserver機能を起動するためにインタフェースを提供します。クラスSurfaceFlingはBnSurfaceComponeserから派生しています。SurfaceCompserClientはクライアントに直接使用され、ISurface(BnSurface)とISurfaceCompser(BnSurfaceComponeser)とISurfaceFlinerCientインターフェースを呼び出して、serverと相互作用します。BlientはISurfaceFlinerCientから派生して、serverのcreateSurfaceを呼び出して、本当にsurfaceを作ります。各surfaceは一つのlayer.egl_に対応しています。native_windowtはローカルwindowクラスを定義しています。このクラスは、ローカルwindowのすべての説明とegl(openglとローカルグラフィックスシステムとのインターフェース)のためのローカルwindwoを操作するすべての方法を提供する。EGLANativeSurfaceはegl_です。native_windowtの派生クラス。EGL DisplaySurfaceはEGLANativeSurfaceの派生タイプです。EGLODisplaySurfaceは非常に重要なクラスです。このクラスでは本当にframe buffer設備を開けて、この設備をEGLODisplay Surfaceの形式でserverに使用します。関数のmapFrame eBufferはframe ebufferを開いて二つのバッファを作成します。関数swapBuresはback bufferの内容をfront bufferにコピーします。DisplayHardwareクラスでは、eglシステムを初期化し、ローカルウィンドウのオブジェクトEGLODisplaySurfaceに対応するEGLOSurfaceオブジェクトを作成しました。surfaceflingerはDisplayHardwareを使って地元の窓口と交流します。五、下記のカタログのコードの一部は7、frame eworks/base/core/jni/android/graphics 8、frame ew orks/base/core/jni/android/opengl 9、framworks/base/core/jni/androidview*.これらのディレクトリのコードは、Java層のgraphicsコンポーネントとnative(c++)コンポーネントとの間で接続され、java層の機能呼び出しを対応するローカル呼び出しに変換する。hardware/libhardwareはHAL層を実現しました。copybit deviceはその中の一つです。