У меня есть приложение, в котором я хочу обработать каждый данный кадр с камеры, чтобы сделать кое-что из ARCore.Итак, у меня есть класс, реализующий GLSurfaceView.Renderer
, и в этом классе у меня есть метод onDrawFrame(GL10 gl)
.В этом методе я хочу работать с растровым изображением Android, поэтому я вызываю этот код для получения растрового изображения из текущего кадра:
private Bitmap getTargetImageBitmapOpenGL(int cx, int cy, int w, int h) {
try {
if (currentTargetImageBitmap == null) {
currentTargetImageBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
byteBuffer = ByteBuffer.allocateDirect(w * h * 4);
byteBuffer.order(ByteOrder.nativeOrder());
}
// cy = height - cy;
if ((cx + w / 2) > width) {
Log.e(TAG, "TargetImage CenterPoint invalid A: " + cx + " " + cy);
cx = width - w / 2;
}
if ((cx - w / 2) < 0) {
Log.e(TAG, "TargetImage CenterPoint invalid B: " + cx + " " + cy);
cx = w / 2;
}
if ((cy + h / 2) > height) {
Log.e(TAG, "TargetImage CenterPoint invalid C: " + cx + " " + cy);
cy = height - h / 2;
}
if ((cy - h / 2) < 0) {
Log.e(TAG, "TargetImage CenterPoint invalid D: " + cx + " " + cy);
cy = h / 2;
}
int x = cx - w / 2;
int y = cy - h / 2;
GLES20.glReadPixels(x, y, w, h, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE,
byteBuffer);
IntBuffer currentTargetImagebuffer = byteBuffer.asIntBuffer();
currentTargetImagebuffer.rewind();
currentTargetImageBitmap.copyPixelsFromBuffer(currentTargetImagebuffer);
return currentTargetImageBitmap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
Этот метод занимает около 90 мс, что, безусловно, слишком медленно для обработкикаждый входящий кадр в реальном времени, что мне нужно сделать, потому что метод onDrawFrame(GL10 gl)
также рисует этот кадр в виде поверхности.Есть идеи, почему это так медленно?Также было бы достаточно, если бы я мог только читать пиксели каждого другого кадра, но рисовать каждый кадр в моем SurfaceView.Я попытался вызвать показанный метод в AsyncTask.execute()
, но другой поток не может прочитать через метод GLES20.glReadPixels()
, так как это не поток GL.