作為圖形渲染引擎,效能上是非常重要的,按通常android手機60幀的重新整理率,繪製一幀的總時間只有16ms,可謂是毫釐必爭。提公升效能到最後,就必然跟不同cpu的特性打交道,畢竟乙個simd下去,好做的提公升5、6倍,不那麼好做的也達到2、3倍,收益極其可觀。
simd,在intel上是sse,在arm上是neon,在mips上則是其dsp功能。使用simd,需要**架構是滿足記憶體連續性要求的,否則需要重構,skia作為正常的圖形渲染引擎,採用行渲染方式,易於實現simd。在充分優化的場景,其速度與gpu渲染不相上下。
總體而言,skia庫的渲染架構是遵循連續性,易於優化的。目前skia中的高頻使用函式基本上都進行了優化,並且由於軟體渲染使用頻率的降低,進一步優化的價值不大。但從**層面來看覆蓋率並不是特別高,遇到特定場景卡頓了,還是可以挖出幾個函式優化下的。
從演算法來看,skia裡面的圖形繪製演算法基本上都達到了最優,沒有什麼多餘的步驟。編譯碼方面,存在一些多餘的記憶體拷貝、取樣縮放等。
這裡面的行填充包括一行畫素的透明度混合、顏色格式轉換、抖動處理。在skblitter構建時,根據源、目標畫素格式和paint屬性挑選。
neon優化的相關**見 src/opts/skblitrow_opts_arm_neon.cpp
主要通過 platformproc的轉換而得。
大部分行填充的型別是做了neon優化的,這些也是用得很頻繁的函式。
sprite流程
在前面有講述,將用來繪製的影象預先旋轉縮放好,使之和目標區域一樣大,並且座標沒有小數字,可以走進sprite流程。但目前有不少限制,這些不支援的情況並不是原理不允許,而是沒有做,有需要的話可以補上。
詳細見
skspriteblitter::choosed16
skspriteblitter::choosed32
取樣在僅縮放的插值情況,由於一行的畫素是相鄰的,插值計算以行為單位處理會比較效率。
高階插值似乎是沒有做優化,用得也少,這個還是靠gpu優化好些。
文字繪製中,skia很關鍵的優化方法是建立了字形mask快取機制,blitmask過程和blitrect的過程相似,也是用的加速過的行渲染函式。這樣在繪製文字固定時只是第一次解析字型構建快取慢。
不過在生成字型mask快取的流程中,generateimage函式並沒有充分優化。
mask需要占用一定量的記憶體,skia中可以設定其上限(預設8m),這個是每個應用都佔這麼多,整個系統加起來其實就很大了。應用如果經常變字形,改效果,這個記憶體很快就會到上限,然後就經常找不到cache從而效能下降。
在一些情況下無法建mask快取,只能存路徑skpath,這時的效能也會差一些。
路徑繪製裡計算邊界的過程基本上沒有什麼好方法優化,填充時也是利用行渲染函式和取樣演算法。
解碼速度在系統中還是比較重要的,關係到應用開啟的速度。
google對其優化主要在對應的編譯碼庫中實現,skia裡面只是配置引數。
而skia本身的一些處理如顏色轉換、下取樣等可能被認為相對解碼本身而言較短,並沒有做優化。但做一下估計還可以提公升5%左右。
製作soc的廠商可能會修改這一部分**,使之用特定dsp等硬體實現。不過考慮到硬體編譯碼的一些限制,還是會有不少場景不得不回歸軟體編譯碼。
區域解碼基本上是用硬體優化不了或優化不好的,如果記憶體足夠,使用硬解碼後原理上也不需要區域解碼這種方式提高速度。
特效主要是skmask,裡面有高斯模糊、光照效果等的實現。
其優化的**也在 src/opts/目錄下。
在cpu上做這種**的優化,需要把浮點轉成近似整數,會有一定的精度誤差。還是走gpu加速的方案好些。
skia-gpu在當前的方式下,需要將繪製結果拷貝出來,因而不好用做渲染。
但如果修改一下,允許外界輸入 egl-image來建立sksu***ce,對映為輸出的紋理和fbo,便可以將這次拷貝避免。不過,不走視窗系統,僅僅只是輸出到乙個紋理是否會對gpu效能有影響,很難說。
skia-gpu流程的快取的管理感覺不如硬體加速引擎hwui那一套好。
skia目錄下面有個 benc**件夾,裡面是測試各項效能的**。
資料庫事務深入分析
1 原子性 atomic 2 一致性 consistent 一致性要求事務執行完成後,將資料庫從乙個狀態轉變為另乙個狀態,他是一種以一致性規則為基礎的邏輯屬性,例如在轉賬操作中,個賬戶金額必須平衡 3 隔離性 insulation 乙個事務的執行不能被其他事務所干擾。即乙個事務內部的操作及使用的資料...
熱門威脅情報庫深入分析
本文主要圍繞了現有的幾個熱門情報庫進行了部分分析,包括virustotal,threatcrowd,ibmx force,virusbook以及virusminer。分析點包括資料 分析,提供的功能及服務,以及情報質量。廢話不多說,直接上乾貨 一 virustotal virustotal 共有 5...
深入分析資料庫儲存引擎
儲存引擎 1 概述 1 表處理器 mysql提過了乙個抽象層,允許不同的儲存引擎使用相同的api對錶進行訪問,這一介面稱之為表處理器,該介面通過handler的抽象類來實現,該處理器提供了一些課實現基本儲存的方法,如開啟關閉表,按照鍵進行檢索,儲存記錄及刪除記錄,2 儲存引擎 1 最近引進儲存引擎這...