天天看點

android渲染是skia與egl,Huang_Dongsung

原文: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