在我的Android 4.3应用程序中,我想将纹理从本地png加载到TextureView上。我不知道OpenGL,我正在使用GLTextureActivity硬件加速测试中的代码。我在这里粘贴加载纹理部分:
private int loadTexture(int resource) {
int[] textures = new int[1];
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, textures, 0);
checkGlError();
int texture = textures[0];
glBindTexture(GL_TEXTURE_2D, texture);
checkGlError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Bitmap bitmap = BitmapFactory.decodeResource(mResources, resource);
GLUtils.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap, GL_UNSIGNED_BYTE, 0);
checkGlError();
bitmap.recycle();
return texture;
}
我在两个设备中运行代码: Nexus 7 和Galaxy Nexus手机,我注意到两者之间存在巨大的速度差异。对于 Nexus 7 ,绘图部分大约需要170毫秒,但对于 Galaxy Nexus ,它需要459毫秒。最耗时的操作是加载纹理,尤其是texImage2D
调用。我已经读过,有些设备的芯片在texImage2D
- texSubImage2D
函数上运行缓慢,但有人怎么能分辨出这些设备是什么?我怎样才能避免使用这些函数来实现相同的结果呢? / p>
提前谢谢。
//编辑:glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
电话似乎也明显慢于手机设备。为什么会这样?我怎么能避免它?
答案 0 :(得分:1)
您是否在每个帧重绘时加载纹理?那是不对的 - 你应该在主渲染循环之前只加载一次纹理。即使在最快的设备上也不会加载即时纹理 - 加载资源,从中解码位图然后将其加载到GPU。这需要一些时间。