王 園 園
(淮北職業(yè)技術(shù)學院, 安徽 淮北 235000)
手機Android系統(tǒng)具有良好的開放性,程序可擴展性強,應(yīng)用廣泛。由于手機硬件的不斷升級更新,用戶對手機的畫面品質(zhì)要求也不斷提高。越來越多的三維應(yīng)用軟件不斷推出,3D模型的顯示效果就成了手機的重要性能之一。本次研究將在Android框架中引入OpenGLES圖形接口開發(fā)三維模型應(yīng)用,給出解析模型并加載應(yīng)用的優(yōu)化處理方式。
Android操作系統(tǒng)是全球最大的智能手機操作系統(tǒng)。系統(tǒng)架構(gòu)分為4層,從上到下依次是應(yīng)用程序?qū)印?yīng)用程序框架層、系統(tǒng)運行庫層、Linux內(nèi)核層。
不同于其他手機操作系統(tǒng),Android操作系統(tǒng)中的一些應(yīng)用程序可以被第三方應(yīng)用程序替換,可由開發(fā)者和使用者進行個性化修改。
從應(yīng)用程序框架層開始,直接使用該層提供的組件來進行開發(fā),以避免部分組件被重復使用。
系統(tǒng)運行庫層分為系統(tǒng)庫和Android運行2部分。系統(tǒng)庫主要用來支撐應(yīng)用程序框架,它能夠?qū)?yīng)用程序框架層與Linux內(nèi)核層連接在一起; Android運行中使用Java編寫應(yīng)用程序并予以執(zhí)行。在運行過程中,可以將系統(tǒng)運行部分分為核心庫和Dalvik虛擬機:核心庫能夠提供大多數(shù)API,且很多功能是用Java語言來編寫,同時也包含了部分如android.os、android.NET、android.media等非常重要的Android核心API; Dalvik虛擬機內(nèi)Android的應(yīng)用程序不是由多個程序運行,而是每個應(yīng)用程序都擁有一個專屬進程,應(yīng)用程序在其專屬進程中都有一個Dalvik虛擬機與之對應(yīng),并在其中被執(zhí)行。與一般的虛擬機不同的是,Dalvik虛擬機并非使用棧來暫時存放數(shù)據(jù),而是通過寄存器來暫存數(shù)據(jù),能夠支撐多個虛擬機并將內(nèi)存資源合理優(yōu)化。尤其是,Android應(yīng)用程序在虛擬機中執(zhí)行的是,轉(zhuǎn)換工具dx轉(zhuǎn)換Java字節(jié)碼而生成dex格式的中間碼,執(zhí)行的并非編譯后的字節(jié)碼。
最底層是Linux內(nèi)核層,其核心系統(tǒng)服務(wù)如安全性管理、內(nèi)存管理、進程管理、網(wǎng)路協(xié)議及驅(qū)動模型都依賴于Linux內(nèi)核。由于Android系統(tǒng)的應(yīng)用基于Linux 2.6內(nèi)核,所以這一層為Android系統(tǒng)的正常運行提供了底層支持。
Android系統(tǒng)的管理,是通過Activity實現(xiàn)進棧管理。當來到一個新的Activity后,此Activity即被加入到Activity棧頂,之前的Activity位于此Activity底部。Acitivity通常存在4種可能的狀態(tài):運行狀態(tài)、中斷狀態(tài)、停止狀態(tài)、消滅狀態(tài)。
OpenGLES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集,是專門針對嵌入式設(shè)備而設(shè)計,其繪制模式包括:glBegin(開始)、glEnd(結(jié)束)、GL_QUADS(四邊形)、GL_POLYGONS(多邊形)等。
在OpenGLES中,只允許采用三角形來搭建物體。在OpenGLES中,坐標系統(tǒng)采用的是三維笛卡爾坐標系及左手標架坐標系。初始情況下,y軸平行于屏幕的豎邊,x軸平行于屏幕的橫邊,z軸垂直于屏幕的平面。
OpenGLES著色語言是一種高級的圖形編程語言,源于應(yīng)用廣泛的C語言,具有RenderMan及其他著色語言的一些優(yōu)良特性,易于學習掌握。與傳統(tǒng)通用編程語言不同的是,OpenGLES著色語言提供了更加豐富的原生類型,如向量、矩陣等。
OpenGLES著色語言具有以下特性:(1) OpenGLES著色語言是一種高級的過程語言(非面向?qū)ο?;(2) 對頂點著色器、片元著色器使用同樣的語言;(3) 基于CC++的語法及流程控制;(4) 完美支持向量與矩陣的各種操作;(5) 通過類型限定符管理輸入與輸出;(6) 擁有大量的內(nèi)置函數(shù),可提供豐富的功能。
OpenGLES著色語言中同時也提供了很多的內(nèi)置函數(shù),這些內(nèi)置函數(shù)通常都是以最優(yōu)的方式來實現(xiàn)。它們大部分都同時適用于頂點著色器和片元著色器,但也有少部分只適用于頂點著色器或者片元著色器。
stl文件是計算機圖形應(yīng)用系統(tǒng)中表示三角形網(wǎng)格的一種文件格式,將模型文件中的三角形頂點信息提取出來即可讀取得到模型中所有點的信息。但是,對于3D模型的顯示與編輯,因其位置、大小、方向都是隨機的,所以需要獲得一個模型的邊界信息(模型分別在x、y、z方向的最大值和最小值),使模型可以在GLSurfaceView上以近似大小居中顯示。
首先,定義Model類來表示一個模型對象(包含三角面?zhèn)€數(shù)、頂點坐標數(shù)組、每個頂點對應(yīng)的法向量數(shù)組、三角面的屬性信息),然后將stl模型文件轉(zhuǎn)化為Model對象。這里,先定義一個STLReader類,讀入文件,然后再進行文件的解析。
依據(jù)以上理論,開發(fā)出的安卓3D模型應(yīng)用具備以下功能:
(1) 點擊模型1次會獲得控制權(quán),再次點擊就會失去控制權(quán);
(2) 連續(xù)點擊2次屏幕,屏幕會在移動和旋轉(zhuǎn)模式之間切換;
(3) 選擇旋轉(zhuǎn)的時候,滑動屏幕會使模型以一定的初速度旋轉(zhuǎn);
(4) 在編輯框輸入模型名字,點擊確定,更換模型;
(5) 通過星型按鈕切換光照和模型的控制方式;
(6) 通過滑塊條進行縮放;
(7) 多點觸碰屏幕隱藏或顯示控件界面。
所有復雜幾何圖形由一個或多個三角形列表組成,每個頂點位置、頂點法線及其他類型的數(shù)據(jù)基本都由一個或多個三角形所共享。所創(chuàng)建的是來自索引緩存且具有唯一頂點數(shù)據(jù)的數(shù)組(沒有重復的數(shù)據(jù)),該數(shù)組可用作表示幾何圖形的最小數(shù)組。為了正確繪制模型,必須使用合適的索引組來表示頂點數(shù)據(jù)數(shù)組中的每個三角形,然后使用該索引數(shù)組繪制幾何圖形。此索引數(shù)組非常小且受到GLES的默認限制,因而必須將該數(shù)組指定為unsignedshort。
將索引數(shù)組發(fā)送到相關(guān)聯(lián)的GLES繪圖指令(glDrawElements),避免反復發(fā)送該索引數(shù)組。據(jù)此,構(gòu)建并使用優(yōu)化的頂點數(shù)據(jù)VBO(VertexBufferObject)和VAO(VertexArrayObject)來處理頂點數(shù)據(jù)屬性。
接下來要優(yōu)化三角形索引,從而大幅減少繪制三角形所需的索引數(shù)量。OpenGLES提供了一種更優(yōu)化的繪制三角形替代方法 —— GL_TRIANGLE_STRIP。使用該模式可以重復使用三角形最后2個索引,只需另指定1個索引就可以創(chuàng)建新的三角形。繪制一個四邊形,以前需要發(fā)送6個索引,現(xiàn)在只需發(fā)送4個索引。
在理想情況下,所有三角形及其邊緣都以一種易于構(gòu)建單個三角形帶的方式對齊;但是在實際幾何圖形中這種情況很少出現(xiàn),反而有時三角形帶構(gòu)建過程被停止,然后需重新創(chuàng)建另一個退化三角形,該過程稱為stitching(拼接)。
在少數(shù)情況下,使用三角形帶可能會比使用三角形產(chǎn)生更多的索引。在這種情況下,可以繼續(xù)使用三角形,不用三角形帶。指定的頂點緩存越大,最后的索引數(shù)組也就越小。在移動設(shè)備GPU上,頂點緩存不存在;所以,索引數(shù)量越少,幾何圖形的繪制速度就越快,即使使用默認頂點緩存也可以優(yōu)化索引(優(yōu)化應(yīng)該在使用定制的命令行工具導出對象時脫機完成)。優(yōu)化較大頂點的緩存之后,可以進一步優(yōu)化最終索引。當然,如果一味地增加緩存,將會更加費時,或得不償失。
與桌面PC的顯卡相比,便攜式設(shè)備GPU在視頻內(nèi)存應(yīng)用上受到很大的限制,所以應(yīng)盡可能使紋理分辨率最小,以便最大限度地節(jié)約內(nèi)存。
紋理越大,用來拾取和插入像素的提取操作就越慢。優(yōu)化其內(nèi)存空間的最佳解決方案是,首先調(diào)整紋理的大小,然后將其轉(zhuǎn)換為16位的數(shù)據(jù)。對于不同的紋理類型,必須選擇最適合的像素類型,使每個顏色分量都盡可能多地保存顏色分辨率。
雖然將24位、32位的紋理轉(zhuǎn)換為16位的紋理,會使紋理質(zhì)量有所損失,但是通常損失不顯著,且所需的內(nèi)存空間減為原來的一半,這些損失可以接受。
目前所開發(fā)的安卓三維模型應(yīng)用仍比較粗糙,但可塑性很強。在后續(xù)開發(fā)中將逐步完善以下功能:(1) 繼續(xù)嘗試解析更多格式的模型;(2) 在各個模型格式間自由轉(zhuǎn)換;(3) 添加更多強大的模型編輯功能;(4) 可自制簡單模型;(5) 加快模型讀取的速度;(6) 實現(xiàn)跨平臺使用。
3D模型應(yīng)用的未來發(fā)展前景非常廣闊。目前在虛擬現(xiàn)實的蓬勃發(fā)展和智能手機的快速成長之下,手機上的AR、VR應(yīng)用應(yīng)運而生,而讓用戶身臨其境的體驗離不開高質(zhì)量的模型顯示。手機具有便于攜帶和功能強大的特點,伴隨著硬件與軟件技術(shù)的革新,開發(fā)者需要提高程序的讀取效率并降低內(nèi)存。這些來自用戶和開發(fā)者的需求會促使這個領(lǐng)域不斷地產(chǎn)生新的技術(shù)。
[1] 王菲飛.基于Android平臺的手機惡意代碼檢測與防護技術(shù)研究[D].北京:北京交通大學,2012:12-16.
[2] 童振飛.Android惡意軟件靜態(tài)檢測方案的研究[D].南京:南京郵電大學,2012:8-12 .
[3] 吳想想.基于Android平臺軟件開發(fā)方法的研究與應(yīng)用[D].北京:北京郵電大學,2011:6-10.
[4] 黨李成.基于Google Android智能手機平臺的研究與應(yīng)用[D].合肥:安徽大學,2010:12-14.
[5] 廖明華,鄭力明.Android安全機制分析與解決方案初探[J].科學技術(shù)與工程, 2011(26) :6350-6355.
[6] 張繼永.淺析Android系統(tǒng)的軟件安全設(shè)計[J].硅谷, 2010(23):38-38.
[7] 劉昌平,范明鈺,王光衛(wèi),等.Android手機的輕量級訪問控制[J].計算機應(yīng)用研究, 2010(7):2611-2613.
[8] 宋杰,黨李成,郭振朝,等.Android OS手機平臺的安全機制分析和應(yīng)用研究[J].計算機技術(shù)與發(fā)展, 2010(6):152-155.
[9] 周毅敏,陳榕.Dalvik虛擬機進程模型分析[J].計算機技術(shù)與發(fā)展,2010(2):83-86.
[10] 林清,董占球.XML與HTML在Web環(huán)境中的應(yīng)用分析[J].計算機應(yīng)用, 2001(增刊1):67-68.