Android編程方法大PK:NDK vs. RenderScript
譯文【51CTO獨(dú)家譯文】Android平臺為應(yīng)用程序在傳統(tǒng)的Android應(yīng)用邊界外面運(yùn)行提供了兩種方法。***種、也是應(yīng)用最廣泛的方法是使用原生開發(fā)工具包(NDK)。第二種方法是使用RenderScript(RS),這是一種低級的高性能編程語言。這兩種機(jī)制都適用于3D渲染和處理器密集型計(jì)算。
我們在本文中將比較NDK和RS,幫助你決定何時(shí)使用其中一種方法。
NDK vs. RenderScript:編程語言和可移植性
NDK讓開發(fā)人員可以用C或C++編程,并通過Java原生接口(JNI)機(jī)制與Android應(yīng)用程序進(jìn)行聯(lián)系??捎玫膸焓菢?biāo)準(zhǔn)庫,基本上不需要變更,就可以常常移植現(xiàn)有的C/C++代碼。此外,C++與Java區(qū)別不是很大,許多開發(fā)人員同時(shí)精通這兩種語言。
RenderScript則采取了不同的方法,它使用C99語法(標(biāo)準(zhǔn)C來自1999年,***標(biāo)準(zhǔn)是C11,來自2011年),新的應(yīng)用編程接口(API)最終編譯成原生代碼。雖然這種語法廣為人知,但是使用這套系統(tǒng)面臨一個(gè)學(xué)習(xí)過程,因?yàn)槠銩PI并非廣為人知。
最終的可移植性體現(xiàn)在有沒有在種類最廣泛的設(shè)備和平臺上使用的庫。NDK讓你可以利用現(xiàn)有的C/C++庫,你可能已經(jīng)在其他平臺上使用這些庫。RenderScript無法從其他C應(yīng)用程序移植過來,不過它在Android設(shè)備上比NDK更為常見。比如說,RenderScript可在谷歌電視(Google TV)設(shè)備上運(yùn)行,但是目前NDK還缺少對谷歌電視平臺的支持,即使它運(yùn)行Android。
NDK vs. RenderScript:編譯和調(diào)試
用NDK編寫的代碼必須事先針對每一個(gè)目標(biāo)原生平臺來編譯。如果應(yīng)用程序在架構(gòu)未得到支持的平臺上運(yùn)行,應(yīng)用程序的NDK代碼部分就無法正常運(yùn)行。RenderScript在你的開發(fā)機(jī)器上進(jìn)行***遍編譯,然后在目標(biāo)設(shè)備上進(jìn)行***一遍編譯,因而帶來了更高效的原生二進(jìn)制代碼。這意味著,凡是支持RenderScript的設(shè)備都可以運(yùn)行你的代碼,不管采用什么架構(gòu)。
目前,RenderScript帶來的代碼只能在主處理器上運(yùn)行,它會自動生成可以利用多個(gè)核心的代碼——如果目標(biāo)設(shè)備上有多個(gè)核心。不過在將來,有計(jì)劃讓RenderScript代碼在圖形處理器(GPU)上也可以運(yùn)行。這類似CUDA或OpenCL平臺。
采用NDK的應(yīng)用程序可以使用gdb進(jìn)行行級調(diào)試。另一方面,RenderScript應(yīng)用程序在運(yùn)行時(shí)無法調(diào)試??紤]到RenderScript具有的性質(zhì)及其處理多個(gè)核心的方式,這沒什么好大驚小怪的,不過這也加大了查找和消除代碼錯(cuò)誤的難度。
NDK vs. RenderScript:性能
NDK和RenderScript都未能在性能方面提供***方案。兩者都增加了項(xiàng)目的復(fù)雜性,降低了可移植性,提高了測試需求,加大了調(diào)試難度,還給項(xiàng)目增加了維護(hù)負(fù)擔(dān)。如果你的項(xiàng)目不需要進(jìn)行大量計(jì)算,只使用OpenGL的基本圖像功能,或者已經(jīng)在足夠快速地運(yùn)行,那么NDK和RenderScript都不太可能給項(xiàng)目帶來足夠明顯的好處。
如果純粹是用于計(jì)算,RenderScript的設(shè)置和配置很容易,最終的運(yùn)行速度實(shí)際上可能勝過使用NDK的類似實(shí)現(xiàn)方法,需要編寫的代碼比較少。RenderScript最適合處理3D用戶界面或高性能計(jì)算任務(wù)。另一方面,NDK比較適合高性能OpenGL應(yīng)用程序或需要訪問圖形軟件開發(fā)工具包(SDK)更多功能或訪問第三方庫的游戲。
簡單的OpenGL任務(wù)或不受制于處理器的計(jì)算任務(wù)***別去管它。Java編譯器和Dalvik VM的性能總是在不斷提升。就讓你的代碼繼續(xù)使用Java,這讓你編寫的應(yīng)用程序可以充分利用這些性能上的提升,在將來的SDK版本或設(shè)備上可以更好地運(yùn)行。
隨著***一個(gè)編譯步驟得到改進(jìn),為GPU添加更多的硬件支持和計(jì)算支持,RenderScript代碼在將來可能會有所改進(jìn)。另一方面,除了通過硬件改動獲得的性能提升外,通過NDK編寫的本地代碼不太可能出現(xiàn)性能提升。因此,NDK代碼從高效的算法和代碼得到的好處***。
結(jié)束語
***,選擇使用NDK、RenderScript還是繼續(xù)使用Java,完全取決于開發(fā)人員。應(yīng)用程序設(shè)計(jì)方面的這個(gè)決定具有重大影響:它影響著你使用什么編程語言、編寫的應(yīng)用程序可以在什么設(shè)備上運(yùn)行,以及從維護(hù)的角度來看你的軟件項(xiàng)目有多復(fù)雜。
你已經(jīng)了解了NDK和RenderScript的諸多優(yōu)缺點(diǎn)。它們未必可以換著使用,但在許多情況下,可以用這兩種技術(shù)開發(fā)出相似的解決方案。了解NDK和RenderScript的工作機(jī)理,可以幫助你作出更明智的決定,決定在具體開展某個(gè)項(xiàng)目時(shí)使用哪一種方法。不管怎樣,目前有工具可以幫助你讓自己編寫的應(yīng)用程序在盡可能多的設(shè)備上盡可能快速地運(yùn)行。