天天看點

android渲染是skia與egl,Android_Gaphic_:_apk_and_SkiaOpenGLES.doc

Android_Gaphic_:_apk_and_SkiaOpenGLES

Android 畫圖簡介

Android apk 裡面的畫圖分為2D和3D兩種:2D是由Skia 來實作的,也就是我們在架構圖上看到的SGL,SGL也會調用部分opengl 的内容來實作簡單的3D效果;3D部分是由OpenGL|ES實作的,OpenGL|ES是Opengl的嵌入式版本,我們先了解一下Android apk的幾種畫圖方式,然後再來來看一看這一整套的圖形體系是怎麼建立的。

首先畫圖都是針對提供給應用 程式的一塊記憶體填充資料 , 沒去研究過一個Activity是否就對應着底層的一個surface,但是應該都是對這塊surface記憶體進行操作。是以說穿了就是我們要麼調用2D 的API畫圖,要麼調用3D的API畫圖,然後将畫下來的圖儲存在這個記憶體中,最後這個記憶體裡面的内容會被Opengl渲染以後變為可以在螢幕上的像素信 息。

一 、Apk應用主要關心的還是這些API的使用,在Android apk裡面畫圖有2種方式 [2D]:

1、Simple Graphics in View

就是直接使用Android已經實作的一些畫圖操作,比如說images,shapes,colors,pre-defined animation等等,這些簡單的畫圖操作實際上是由skia來提供的2D圖形操作。使用這些預定義好的操作,我們可以實作諸如貼一張背景圖啊,畫出簡 單地形狀阿,實作一些簡單的動畫之類的操作。這裡的簡單可以這麼了解,就是我們在這裡沒有一筆一畫地構造出一個圖形出來,我們隻是把我們的Graphic 資源放入View體系中,由系統 來将這些Graphic畫出來。舉個例子:我們現在在Activity裡面綁定一個ImageView,我們可以設定 這 個ImageView的内容是我們的picture,然後我們可以讓這個picture整體顔色上來點藍色調,然後我們還可以為這個ImageView加 入一個預定義動畫,這樣當系統要顯示這個View的時候就會顯示我們的picture,并且會有動畫,并帶有一個藍色調,我們并沒有自己去定義畫圖操作, 而是将這些内容放入View中,由系統來将這些内容畫出來。這種方式隻能畫靜态或者極為簡單的2D圖畫,對于實時性很強的動畫,高品質的遊戲都是沒法實作 的。

2、Canvas

首先我們要明白這個Canvas是一個2D的概念,是在Skia中定義的。也就是說在這個方式下還是說的畫2D圖形。我們可以把這個Canvas了解成系 統提供給我們的一塊記憶體區域(但實際上它隻是一套畫圖的API,真正的記憶體是下面的Bitmap),而且它還提供了一整套對這個記憶體區域進行操作的方法, 所有的這些操作都是畫圖API。也就是說在這種方式下我們已經能一筆一劃或者使用Graphic來畫我們所需要的東西了,要畫什麼要顯示什麼都由我們自己 控制。這種方式根據環境還分為兩種:一種就是使用普通View的canvas畫圖,還有一種就是使用專門的SurfaceView的canvas來畫圖。 兩種的主要是差別就是可以在SurfaceView中定義一個專門的線程來完成畫圖工作,應用程式不需要等待View的刷圖,提高性能。前面一種适合處理 量比較小,幀率比較小的動畫,比如說象棋遊戲之類的;而後一種主要用在遊戲,高品質動畫方面的畫圖。下面是這兩種方式的典型sequence :

2.1、View canvas

(1) 定義一個自己的View :class your_view extends View{} ;

(2) 重載View的onDraw方法:protected void onDraw(Canvas canvas){} ;

(3) 在onDraw方法中定義你自己的畫圖操作 ;

ps: 可以定義自己的Btimap:

Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);

Canvas c = new Canvas(b);

但是必須将這個Bitmap放入View的canvas中,畫的圖才能顯示出來:public void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint) ;

invalidate()這個函數被調用後,系統會在不久的将來重新調用onDraw()函數,這個時間很短但并不是可預知的,我曾經在onDraw() 中寫了一個if語句,利用validate讓系統死循環調用onDraw刷兩張圖,幾乎上這