在android4.2到android5.0的過程中,skia中開發較頻繁的部分莫過于gpu加速部分和延遲渲染機制,盡管目前來看幾乎沒有用到,但後續很可能會在frameworks層引入。
在android上面,隻可能使用opengl,是以作為使用opengl的繪圖引擎,關注如下要點即可:
1、opengl上下文如何建立(關系到如何顯示繪制結果)
2、頂點如何生成
3、着色器如何管理,特效怎麼設定
4、紋理、vbo、字型cache等緩存管理機制
由于opengl程式設計本身很複雜,東西也很多,這裡隻是介紹一下用法和流程架構,有興趣研究的可按上述問題細看。
skia建立gpu上下文時,其surface并不關聯android裡面的顯示系統,是以是無法直接渲染上屏的,在繪制完成之後需要額外的一次readpixels,也即記憶體拷貝,這使其不适合做實時渲染。隻是在做比較複雜的效果,如bicubic插值、光照、模糊時,可以用一用。
關于 skia的特效,可以看 include/effects 和 src/effects 目錄下面的代碼,這裡面是cpu方式實作的。由于很少見用到,之前并沒有介紹。
對應的gpu特效實作見 include/gpu 和 src/gpu/effects目錄下的代碼。
skgpu的一次繪制基本流程如下:
created with raphaël 2.1.2skcanvasskgpudevicegrcontextgrdrawtargetgrgpugrglinterface
skcanvas:如之前章節所述,下發指令,保留layer
skgpudevice:處理退化情況,将skpaint轉化為grpaint
grcontext:建構形(頂點vertex)且處理抗鋸齒,描述色(grdrawstate)
grdrawtarget:描述繪圖目标,起接口作用,将材料打包為drawinfo,由子類執行 ondraw方法。
grgpu:設定shader、設定頂點,調用opengl接口渲染
grglinterface:由于各個廠商支援的opengl标準版本有所不同,且一些廠商會增加一些接口,這一層做一個api适配,這樣平台相關的代碼就集中在此層級。