在Android中加载位图和制作纹理的快速方法

在Android中加载位图和制作纹理的快速方法,android,opengl-es,bitmap,Android,Opengl Es,Bitmap,我正在尝试用Android中的OpenGL ES制作一种照片查看器 在我的应用程序中,基本上当我点击一个按钮,然后在sdcard中获取整个照片路径列表时,从一张照片制作一个位图,并将纹理设置为该位图,然后将其绘制为简单的四边形。但这相当缓慢,甚至GL视图在工作时也会冻结 制作纹理应该在GLthread中工作,所以我设置了Listener并使用queueEvent() 代码片段如下所示: public void setTexture(Context context, final String st

我正在尝试用Android中的OpenGL ES制作一种照片查看器

在我的应用程序中,基本上当我点击一个按钮,然后在sdcard中获取整个照片路径列表时,从一张照片制作一个位图,并将纹理设置为该位图,然后将其绘制为简单的四边形。但这相当缓慢,甚至GL视图在工作时也会冻结

制作纹理应该在GLthread中工作,所以我设置了Listener并使用
queueEvent()

代码片段如下所示:

public void setTexture(Context context, final String string) {
Bitmap bitmap = null; 
try {
    Uri uri = Uri.fromFile(new File(string));
    bitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri));
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
// upload texture by bitmap
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
}


queueEvent(new Runnable() {
               @Override
               public void run() {
                   for (int i = 1; i < photos.size() - 1; i++) {
                       try {
                           exifInterface = new ExifInterface(photoList.get(i));
                               } catch (IOException e) {
                                   e.printStackTrace();
                               }
                               String orientation = exifInterface.getAttribute(ExifInterface.TAG_ORIENTATION);
                               Log.d(TAG, "photoOrientation: " + orientation);
                               photos.get(i).setOrientation(Integer.parseInt(orientation));
                               photos.get(i).setTexture(mContext, photoList.get(i));
                           }
                       }
                   });
public void setTexture(上下文,最终字符串){
位图=空;
试一试{
Uri=Uri.fromFile(新文件(字符串));
位图=BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri));
}catch(filenotfounde异常){
e、 printStackTrace();
}
//通过位图上传纹理
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,纹理);
GLUtils.texImage2D(GLES20.GL_纹理_2D,0,位图,0);
bitmap.recycle();
}
queueEvent(新的可运行(){
@凌驾
公开募捐{
对于(int i=1;i

当我检查时间时,最耗时的工作是
decodeStream()
,因此如何改进它?有没有更有效的方法将位图上传到纹理?或者至少我如何避免冻结GLView?

尝试使用
BitmapFactory.decodeFile()
而不是
BitmapFactory.decodeStream()
我刚刚更改了加载GL线程的部分。然后它停止冻结

我还提到了如何高效加载位图