我试图在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));
}
}
});
当我检查时间时,最耗时的工作是decodeStream()
那么我该如何改进呢?有没有更有效的方法将位图上传到纹理?或者至少如何避免冻结GLView?
答案 0 :(得分:0)
尝试使用BitmapFactory.decodeFile()
代替BitmapFactory.decodeStream()
答案 1 :(得分:0)
好吧,我刚刚更改了装载部分GL GL。然后它停止冻结。
我还提到了a good training example有效的位图加载