天天看點

Skia深入分析8——Skia的GPU繪圖Skia的GPU繪圖

在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适配,這樣平台相關的代碼就集中在此層級。

繼續閱讀