2011-12-10 46 views
1

這個問題是主觀的,但並不完全:我希望聽到別人的經驗(或者合理的答案應該也可以)。通過NDK的Android OpenGL ES:放置jpg解壓縮和綁定到紋理

我正在編寫Android OpenGL ES 1.1應用程序。它使用NDK:核心OpenGL渲染採用本機代碼,非常類似於NDK附帶的san-angeles OpenGL sample。我使用的OpenGL紋理可以作爲JPG格式讀入應用程序。我知道這是怎麼做的,但我想知道是最有效率的地方(通過高效率,我的意思是快速執行)。

爲了說明,這裏的幾個場景,基於我的項目中輸入的JPG文件結合OpenGL紋理:

1)中的Java代碼,使一個位圖從JPG(即其解壓縮),並綁定並加載使用Java OpenGL綁定的紋理。紋理ID通過NDK傳遞給本地代碼,以便本機代碼可以將它們用於紋理映射。

2)Java代碼從JPG製作位圖(即解壓縮它),並將原始圖像數據通過NDK傳遞給本地代碼,然後該代碼綁定並加載來自該原始圖像數據的紋理。

3)Java代碼通過NDK將壓縮後的JPG數據傳遞給本地代碼,該代碼解壓縮位圖,然後綁定和加載紋理。

我使用的NDK和本機代碼並非出於速度原因,而是出於可移植性的原因 - 我想讓我的核心OpenGL代碼在iPhone和Android上工作,就像NDK附帶的san-angeles OpenGL sample一樣。我知道,本地並不總是比Java代碼更快。

回答

3

**假設兩者都使用相同的算法,jpeg的本地解壓縮將比Java實現更快。但是,這種差異不會很大。 **

爲了便於攜帶,我保留儘可能多的原生代碼。這樣當我在平臺間移動時,我幾乎沒有什麼辦法來創建端口。我用SOIL在本地代碼中解壓JPG,我發現性能與運行相同代碼的iOS版本相當。當然,Android似乎並不慢。

關於資產,我發現ZIP解壓縮確實非常慢。將資產擴展更改爲MP3大幅度加載。 MP3感謝不要壓縮。 製作Android套件時,資產文件夾中的所有文件都將放入APK中。 APK是一個包含應用程序,資源和資產的zip文件。製作軟件包時,會將一些文件添加到壓縮文件而不進行壓縮。其中之一就是MP3。通過將文件重命名爲MP3文件,它們被添加爲未壓縮文件,因此加載速度更快。

我的主觀回答您的問題將是

4)是否所有使用您使用的是iOS相同的代碼你的紋理加載和資產管理在本地代碼。要解壓jpeg使用libjpeg-turbo或SOIL,SOIL比較容易,libjpeg-turbo速度非常快。使用libzip和libz訪問您的資產,確保您在每個文件上添加MP3擴展名以防止壓縮。

土壤http://www.lonesock.net/soil.html

LIBZIP http://www.nih.at/libzip/

LIBZ在NDK

的libjpeg渦輪增壓http://git.linaro.org/gitweb?p=people/tomgall/libjpeg-turbo/libjpeg-turbo.git;a=summary

+0

感謝這個可用。你能解釋一下命名mp3的意義嗎?什麼會自動壓縮它,否則? – MeinHeinlein

+0

爲什麼通過libzip訪問我的資產有幫助?如果你在答案中加入了任何額外的信息,而不是評論,這將會很有幫助,因爲這對其他人閱讀你的答案會更好。 – MeinHeinlein

+0

順便說一句,有時我的JPG數據通過網絡(HTTP)而不是從磁盤傳遞,但它也可能來自磁盤,因爲下載將被緩存在磁盤上。這如何影響你的策略? – MeinHeinlein