2011-12-13 80 views
4

我正在为Android构建一个简单的动态壁纸。我使用下面的代码将所需的纹理上传到OpenGL ES 2.0中。我已将所有图像加载到大小为2048x2048的单个文件中。下面的代码需要大约900到1200毫秒来加载纹理。这是正常的时间还是我做错了,让它变慢?将纹理加载到OpenGL 2.0中

我也尝试每次在渲染器中调用onSurfaceCreated时,清除Opengl中的纹理列表。这是正确的做法,还是有办法简单检查以前加载的纹理是否已经在内存中,如果是的话,避免清理和重新加载?请让我知道你对此的评论。谢谢。

同样在屏幕方向改变OnSurfaceCreated被调用。所以纹理上传再次发生。这不是一个好主意。什么是工作?

public int addTexture(Bitmap texture) { 

    int bitmapFormat = texture.getConfig() == Config.ARGB_8888 ? GLES20.GL_RGBA : GLES20.GL_RGB; 

    int[] textures = new int[1]; 
    GLES20.glGenTextures(1, textures, 0); 
    int textureId = textures[0]; 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId); 

    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmapFormat, texture, 0); 
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_LINEAR); 
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT); 
    GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D); 
    return textureId; 
} 

回答

3

有几种方法可以提高性能。

  1. 不要在每次调用onSurfaceChanged时加载纹理。将您的textureId初始化为-1(在渲染器的构造函数/ surfaceCreated中),并在onSurfaceChanged的开头检查是否有不同的Id。当你拨打glGenTextures时,你会得到一个正数。
  2. 你需要Mipmaps吗?这可能是您的方法的关键点。尝试没有行GLES20.glGenerateMipMap(GLES20.GL_TEXTURE_2D);
  3. 2048x2048是巨大的。尤其对于纹理。你真的需要那么多细节吗?也许1024x1024是足够的。
  4. 避免使用RGB_888,请使用RGB_565:您将获得几乎相同尺寸的视觉质量。
+0

我的尺寸2048x2048是因为我已将我的应用程序中的许多项目的纹理合并到1个文件中。我可以很容易地将纹理分割为4个不同的1024x1024文件。但是我将不得不加载4个不同的文件。分裂这种方式会提高我的表现,还是会导致上传时间增加,因为我现在有4张图片需要上传? – Vinodtiru

+1

我想说,如果由于与其他函数调用相关的一些开销而分割文件,上传时间将会增加,但您可能需要尝试。 –

+0

谢谢。我也想知道在加载2048x2048大小的纹理时是否会有问题?我的意思是在任何运行2.2的旧款Android手机中,会不会有图像大小的限制? – Vinodtiru