論文第2章:相關技術介紹

張雲貴發表於2013-07-31

面向移動裝置的向量繪圖平臺設計與實現

Design and Implementation of Mobile Device-oriented Vector Drawing Platform

引用本論文: 張雲貴. 面向移動裝置的向量繪圖平臺設計與實現[D]. 北京:北京理工大學軟體學院, 2013.

本論文的相似度為0%,是源創論文。歡迎評閱討論,請勿抄襲,如需更多資料請在部落格留言。

如果在研究或論文中使用到,歡迎回復或私信你的學校、姓名、研究領域,並在論文中新增引用或致謝。感謝你對開放成果的尊重和鼓勵。

 

本章描述在移動裝置上繪圖所涉及的關鍵技術,後續章節將用到這些技術。

2.1 iOS相關技術

2.1.1 裝置引數

表2‑1列出了iOS裝置的引數[1]。可見其CPU和GPU的配置相當高。考慮到Retina高清屏在UIKit中每點對應兩個畫素,可知iOS裝置具有較單一的解析度、顯示精度高:iPad系列的DPI為132,iPhone/ iPod Touch/ iPad Mini系列的DPI為163,iPad/iPad Mini系列按點計算的解析度都為1024×768。

表2‑1 iOS裝置列表

注:今天發現一個更全的表格:Blake's iOS Device Specifications Grid (2014-2-20)

裝置

記憶體

螢幕、解析度、PPI

CPU

PowerVR GPU

iPad 1

256MB

9.7" 1024×768 132

A4單核 1GHz

SGX535

iPad 2

512MB

9.7" 1024×768 132

A5雙核 1GHz

SGX543雙核

iPad 3

1GB

9.7" 2048×1536 264

A5X雙核 1GHz

SGX543四核

iPad 4

1GB

9.7" 2048×1536 264

A6X雙核 1.4GHz

SGX554四核

iPad Mini

512MB

7.9" 1024×768 163

A5雙核 1GHz

SGX543雙核

iPhone 3GS

256MB

3.5" 480×320 163

Cortex-A8 600MHz

SGX535

iPhone 4

512MB

3.5" 960×640 326

A4單核 1GHz

SGX535

iPod Touch 4

256MB

3.5" 960×540 326

A4單核 1GHz

SGX535

iPhone 4S

512MB

3.5" 960×640 326

A5雙核 1GHz

SGX543雙核

iPhone 5

1GB

4" 1136×640 326

A6雙核 1.3GHz

SGX543三核

iPod Touch 5

512MB

4" 1136×640 326

A5雙核 1GHz

SGX543雙核

2.1.2 iOS繪圖相關框架

iOS上繪圖相關框架有UIKit、Quartz 2D、OpenGL ES,其關係如圖2‑1所示。UIKit介面框架包含UIView、UIImageView、UIScrollView等檢視類,基於CoreAnimation框架實現圖形渲染。CoreAnimation動畫框架使用OpenGL ES框架進行動畫顯示和硬體加速,包含CALayer層類。每個檢視都有一個CALayer物件(實質是矩形紋理),用於快取繪圖內容和供GPU加速顯示。

Quartz 2D二維圖形庫用於繪製介面大多數內容,是Core Graphics框架的一部分。後者還包含Quartz Compositor層合成模組,用於對各個層基於GPU進行紋理合成。OpenGL ES是2D/3D圖形框架,可以直接在矩形紋理上使用GPU硬體加速渲染。Quartz 2D在用於螢幕顯示時自動使用OpenGL ES在CALayer上顯示(由CoreAnimation在初始化CGContext時啟用)。此時沒有使用GPU的加速能力[2]。在點陣圖等其他目標上繪圖時基於CPU進行渲染,沒有硬體加速能力。

215

圖2‑1 iOS圖形框架的關係

2.1.3 Quartz 2D圖形庫和顯示原理

Quartz 2D以裝置上下文(CGContext)的畫布模型提供繪圖介面,可以在螢幕檢視、層、點陣圖、PDF等目標上繪圖,只有在螢幕檢視和層上繪圖時能基於GPU加速繪圖,在點陣圖和PDF上繪圖時不自動使用OpenGL ES渲染。對於離屏渲染,蘋果官方不建議在點陣圖上繪製圖形,建議在層上繪製圖形提高效能。

Quartz 2D使用繪製模型進行描繪,所有基於路徑的向量圖形、影象和文字內容都疊加描繪到一個虛擬的畫布上。

UIKit的座標系預設是ULO型別,原點在檢視左上角,單位為點。Quartz 2D的預設座標系是LLO型別,原點在繪圖目標的左下角,單位是畫素。視窗顯示時由UIKit自動設定Quartz 2D的座標系為ULO型別,其他繪圖目標需要單獨設定座標系(設定當前變換矩陣),否則就是預設的LLO型別座標系。使用UIKit的函式建立點陣圖或PDF上下文時,會自動設定座標變換矩陣。

在檢視顯示時,繪圖內容會快取在後備緩衝(CALayer物件)中。在檢視的drawRect函式中使用Quartz 2D等圖形引擎繪圖,或者直接指定內容到CALayer。可以指定影象(CGImageRef)到檢視的層,或者指定向量圖形路徑物件到CAShapeLayer,或者指定影象(UIImage)到影象檢視。

檢視的內容模式預設為自動撐滿模式,在旋轉螢幕或改變顯示屬性時自動將CALayer中已快取內容重新顯示到螢幕上,不會呼叫drawRect函式重新輸出圖形,這在圖形較複雜時能減少CPU的消耗量。如果檢視的內容模式為重繪模式,或者呼叫setNeedDisplay函式,檢視的drawRect函式將會再次被呼叫。通過呼叫setNeedDisplay函式可以讓檢視顯示新的圖形內容,實現互動式繪圖。互動式繪圖的另一種實現方式是使用離屏渲染技術,在單獨執行緒中預先將圖形渲染到影象或層物件中,將新的影象或層物件應用到檢視,實現快速顯示動態圖形的效果。

2.1.4 離屏渲染技術

離屏渲染技術又稱為預渲染技術,是移動裝置上常用的加速繪圖技術,其原理是線上程中繪製圖形到CALayer中,在介面顯示時由GPU合成到螢幕幀快取中。為了更快的顯示覆雜內容,可採用漸進式渲染技術,在使用者互動變慢或CPU空閒時在後臺執行緒中進行填充等更豐富的渲染操作。為了避免了點陣圖複製操作,可以使用透明檢視進行觸控響應和動態圖形顯示,在其下層採用影象檢視,在觸控結束後合併到影象檢視。

2.2 Android相關技術

2.2.1 SWIG的程式語言轉換

SWIG是支援C/C++與主流程式語言整合的工具。在SWIG介面檔案中指定要轉換的C++標頭檔案和轉換配置資訊,在編譯階段執行SWIG程式後,自動從C++標頭檔案生成其他程式語言可呼叫的程式碼檔案(對於Android就是JNI類)和C++封裝實現檔案,允許Java、C#、Python等程式碼使用相同程式語言呼叫C++的函式,在不同平臺複用已有的C++程式碼。

SWIG通過型別重定向(TypeMap)將C++中的資料結構和變數型別對映到目標語言中的型別,在目標語言中能使用熟悉的型別呼叫C++中的介面功能。

SWIG通過重定向機制(Director)為有虛擬函式的C++類分別生成C++子類和目標語言的類(假定為B),在C++子類的過載函式中呼叫目標語言的基類B,基類B的派生類的相應過載函式就能被執行。該機制是基於虛擬函式的回撥機制。

Android的Dalvik虛擬機器對JNI本地動態庫有特殊限制:(1)必須實現JNI_OnLoad()函式;(2)不能使用弱引用物件;(3)不能超過256個本地引用物件。在編寫SWIG介面檔案時需要注意這些限制,必要時修正SWIG所生成的封裝檔案。

2.2.2 Android開發方式

在Android平臺上主要使用Java及Android SDK開發應用程式,使用C/C++及Android NDK開發本地動態庫,本地動態庫和應用程式通過JNI銜接。可以使用SWIG自動生成JNI類,以重定向回撥機制在Android程式中擴充套件功能。

Android程式的開發工具通常是跨平臺的Eclipse整合開發環境和ADT(Android Development Tools)外掛,後者提供了除錯(DDMS)和日誌(LogCat)功能。Android本地庫的除錯配置工作較複雜,可使用日誌輔助除錯,2013年釋出的ADT Bundle套件(含ADT 21.1)針對本地庫提供了簡易的整合除錯功能,能避免繁瑣的配置工作。

2.2.3 Android繪圖相關框架

在Android上,常見的繪圖框架及其關係如圖2‑2所示。

22_thumb6

圖2‑2 Android圖形元件的關係

繪圖檢視主要有三種型別:(1)SurfaceView類,有獨立的Surface(會佔用較多顯示記憶體),可線上程中獲取畫布進行繪圖,實現快速動態繪圖。該類基於CPU繪圖,沒有硬體加速能力。(2)基於OpenGL ES的GLSurfaceView類,是特殊的SurfaceView類,可直接在Surface上硬體加速渲染圖形,高幀率顯示圖形。(3)其他檢視類,如普通檢視(View)、影象檢視(ImageView)。這些檢視共同在一個Surface上繪圖,由根檢視遍歷呼叫所有子檢視的顯示函式實現Surface渲染。從Android 3.0起HWUI元件允許這些檢視使用GPU的硬體加速能力,先在檢視的顯示列表中自動快取繪圖指令,然後使用OpenGL ES 2.0對繪圖指令進行渲染。

Canvas畫布類提供了二維圖形、影象和文字的繪製介面,在沒有硬體加速的條件下使用Skia圖形庫實現繪圖介面,在具備硬體加速的條件下使用OpenGL ES 2.0實現繪圖介面。僅在檢視顯示(由HWUI元件啟用加速)和層顯示時才能使用GPU硬體加速能力,在點陣圖上繪圖是採用軟體渲染方式。

Surface對應於顯示記憶體區域(即SurfaceFlinger程式中的Layer物件,通常有兩個緩衝區,前臺緩衝區用於合成顯示,後臺緩衝區用於圖形渲染),OpenGL ES或Skia在其上渲染圖形。Surface快取了顯示內容,由GPU對其進行合成和動畫渲染。

普通檢視預設沒有層,多個檢視在同一個surface上渲染。Android 3.0以後可以設定檢視的層型別,其渲染方式見表2‑2,繪製速度由快到慢依次是硬體層、預設的顯示列表方式、軟體層。

表2‑2 Android檢視的層型別的渲染方式

層型別

檢視啟用加速

檢視不硬體加速

無(預設)

在surface上加速顯示

在surface上軟體渲染

硬體層

在GPU紋理上加速渲染

在點陣圖上軟體渲染

軟體層

在點陣圖上渲染,不加速

在點陣圖上軟體渲染

2.3 本章小結

本章分析了iOS繪圖相關框架及其關係,總結了要實現高效能互動式繪圖的方法:充分利用CALayer的圖形快取和圖形處理器的硬體加速能力,結合離屏渲染技術提高互動式繪圖的顯示幀率。

對於Android,本章給出了SWIG的核心功能和注意點,結論是SWIG用於本地動態庫的開發中是可行的。分析了Android繪圖相關框架的關係和特點,總結了普通檢視和SurfaceView在繪圖速度和記憶體佔用上的差異,為合理選擇檢視型別和離屏渲染技術提供了設計依據。

在後續章節將根據本章的分析結論設計繪圖方案,在iOS和Android上實現高效能的互動式向量繪圖平臺。


[1] http://en.wikipedia.org/wiki/List_of_iOS_devices

[2] http://robots.thoughtbot.com/post/36591648724/designing-for-ios-graphics-performance

相關文章