Android OpenGL ES通过NDK: jpg解压和绑定到纹理的位置



这个问题有点主观,但不完全是:我希望听到别人的经验(或者也应该有合理的答案)。

我正在写一个Android OpenGL ES 1.1应用程序。它使用NDK:核心OpenGL渲染是在本机代码中,很像洛杉矶的OpenGL样本,自带NDK。我使用的是OpenGL纹理,读取到应用程序作为jpg。我知道这是怎么做的,但我想知道最有效的地方是什么(我说的有效是指快速执行)。

为了说明这一点,下面是我的项目中基于输入jpg绑定OpenGL纹理的几个场景:

1) Java代码从JPG生成位图(即解压缩它),并使用Java OpenGL绑定绑定和加载纹理。纹理id通过NDK传递给本机代码,以便本机代码可以使用它们进行纹理映射。

2) Java代码从JPG中生成位图(即解压缩它),并通过NDK将原始图像数据传递给本机代码,然后本机代码绑定并加载原始图像数据中的纹理。

3) Java代码通过NDK将JPG数据(压缩)传递给本机代码,本机代码解压缩位图,然后绑定和加载纹理。

我使用NDK和本地代码不是出于速度原因,而是出于可移植性原因——我希望我的核心OpenGL代码能够在iPhone和Android上运行,就像在洛杉矶的OpenGL样本中一样。我知道原生代码并不一定比Java代码快。

**如果使用相同的算法,jpeg的本机解压缩将比Java实现更快。然而,这种差异不会很大。* *

为了可移植性,我尽量保持原生代码。这样,当我在不同平台间移动时,我就很少需要做移植工作了。我使用SOIL在本机代码中解压缩JPG文件,我发现其性能与运行相同代码的iOS版本相当。当然,安卓似乎并不慢。

关于资产,我发现ZIP解压缩确实非常慢。将资产扩展名更改为MP3大大加快了加载速度。谢天谢地,MP3不会被压缩。当制作Android包时,assets文件夹中的所有文件都被放入APK中。APK是一个包含应用程序、资源和资产的zip文件。当制作包时,一些文件被添加到zip文件中而不进行压缩。其中之一就是MP3。通过将文件重命名为MP3,它们被添加为未压缩的,因此加载速度快得多。

我对你问题的主观回答是

4)在原生代码中使用与iOS相同的代码进行所有纹理加载和资产管理。要解压jpeg文件,请使用libjpeg-turbo或SOIL, SOIL更简单,libjpeg-turbo非常快。通过使用libzip和libz访问您的资产,确保在每个文件上添加MP3扩展名,以防止zip压缩。

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

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

LIBZ在NDK中可用

libjpeg-turbo http://git.linaro.org/gitweb?p=people/tomgall/libjpeg-turbo/libjpeg-turbo.git; =总结

最新更新