原文:How much Skia GPU can accelerate WebKit rendering on Android
http://www.dorothybrowser.com/41/
翻譯:農步祥
背景介紹:Skia是一個2D圖形顯示引擎,2005年被谷歌收購,Skia也成為了Android系統的2D渲染顯示核心。谷歌在官方網站明确說明Android并不支援所有2D特性的GPU加速。這篇文章的作者就針對Skia進行一些測試以驗證其對GPU加速的支援程度。
在Android的系統設定 - 調試選項中,有一個“強制進行GPU渲染”選項,為何使用者打開後并不會得到預期的效果,還容易導緻系統不穩定?為什麼Android系統的流暢性更依賴處理器性能?這篇文章能從技術角度帶來一些參考。
GPU加速Webkit渲染有何意義?
從Honeycomb[3.x]版本起,Andorid便支援GPU加速,但目前Android并沒有使用Skia GPU進行Webkit渲染。Skia GPU使用OpenGL進行背景加速渲染,未來也許會代替Skia。
很多人覺得,即使Android成功使用了GPU加速Webkit渲染,在通路浏覽如雅虎等一般的網站時,使用者也感覺不到太大的差異。因為Webkit的資源大多數消耗在了Javascript腳本和布局定位上。
我們覺得Webkit使用GPU加速渲染的最大意義無非是HTML5 Canvas[HTML5的動态繪圖效果]。Android渲染Canvas動畫實在太慢,導緻Web開發者根本無法在Android上用Canvas開發網頁遊戲[要注意的是,目前很多手機和平闆的應用程式以HTML5做為界面,并使用Webkit工作,這也是很多應用在Android系統上感覺“不流暢”的重要因素。譯者注]。
Android Webkit開發平台[NDK]使用Skia GPU加速測試
我們對Android系統使用Skia GPU加速的Webkit進行了測試。我們手上已經有Android Webkit NDK的WAC2.0版本,我使用了某個送出版本的Skia源碼,并開啟Skia GPU加速将其編譯進NDK中。
我并沒有使用Canvas加速,因為這還要增加修改GraphicsContextSkia API的工作,是以并未測試Canvas渲染的性能。
為了使用Skia GPU加速,我做了以下兩點:
1,新增了一個使用GLSurfaceView的eglContext内容。
2,在WebView.cpp中使用SkGpuCanvas代替SkCanvas。
我在系統版本為2.3.2的Nexus S上測試,并禁用了螢幕合成加速和Webkit後備緩存,結果出乎意料,Skia GPU反而降低了繪圖性能,比Skia使用CPU渲染的時候慢了兩倍以上。
當使用者滾動雅虎網站頁面的時候,每一幀都會使Webkit對頁面元素進行重繪。頁面元素包括70%的文本,15%的矩形和15%的圖像,Skia GPU“加速”渲染時候反而慢了五倍。
你看到圖表後也許會覺得Skia GPU渲染SVG動畫時是要比CPU快那麼一丁點了。不過Webkit在渲染SVG動畫的時候出了一些問題,它絕大多數時間花在了定位布局SVG元素上,而不是渲染SVG元素。是以我不敢确定Skia使用GPU加速時是不是真的變快了。
Skia在栅格化文本的時候使用的是CPU而不是GPU,它将文本緩存為材質貼圖。是以Skia GPU加速并不會增加滾動文本時的速度。
我一開始覺得Skia GPU加速會在繪制飛舞的浏覽器圖示時理應能速度更快了,畢竟那是位圖動畫,是GPU的強項。結果,Skia GPU渲染慢了10倍……由于還沒有得到詳細結果,是以我們需要做進一步的研究,以找到問題的原因。
當你建構Skia的時候,你會得到一個跑分程式,運作之後,你會看到使用CPU和GPU渲染時的性能差異。下面是一些測試得分中的重點項目。
The test environment.
Ubuntu 11.04
Intel Xeon CPU X5650 2.67GHz 6Core L2 Cache 12MB
Memory 12GB
NVIDIA Quadro 4000
CPU (msec)
GPU (msec)
bitmap_8888_A
4.15
1.47
path_stroke_small_long_curved
72.97
98.96
path_fill_small_long_curved
23.53
54.07
path_stroke_small_triangle
7.68
116.44
path_fill_small_triangle
2.64
97.35
text_48_pos
8.12
12.28
你能看到,除了位圖繪制,Skia GPU渲染慢了兩倍左右。
為什麼Skia GPU渲染會更慢?
在我使用gDEBugger[調試工具]和callgrind記錄之後,發現了一些問題:
1,glDrawSomething調用得太頻繁;
2,gl[圖形連結庫]狀态被調整得過多;
3,轉換到FBO[Frame Buffer Objects]的次數太頻繁。
這一切的禍根就是glDrawSomething用得太多,在Webkit調用SkCanvas::drawSomething的時候,每次都是Skia調用glDraw,改變GL狀态,并轉換為FBO的動作重複。而且即使Skia解決了這三個問題,我也無法确定Skia GPU在繪制文本動畫和小幾何圖形的時候能比CPU要快。因為實際上GPU在渲染1000個以上數量的小幾何圖形[小于10像素]的時候難以變得更迅速。而在這之前,Android開發人員就已經極大優化了線性渲染器。在Skia的跑分程式中也看出path_stroke_small_triangle要慢約15倍左右。
Skia GPU加速的前景
你也許會覺得在繪制2D矢量圖形的時候,使用GPU是不可能加速的,但請不要太早下結論,我寫了一個小程式來測試在使用GPU繪制貝賽爾曲線的時候能比CPU快多少。幸運的是,在Nexus S上測試的時候,Android的GPU繪制确實比CPU快了點。
繪制100個大圓的動畫,GPU渲染快了1.5倍。
繪制1000個小圓的動畫,GPU渲染速度和CPU接近。
Skia GPU很慢,不過谷歌隻花了一年去實作他,我認為谷歌可以像優化線性渲染器那樣去優化它。如果是這樣的話,我覺得Android使用者也許在一兩年内就能享受HTML5 Canvas的遊戲了[當然,結果是因為現在ARM的處理器性能越來越好,Skia GPU大概也許就這樣被遺忘了……譯者注]。
請評分
1
2
3
4
5
6
7
8
9
10