解决android opengl glReadPixels 慢的问题 二

解决android opengl glReadPixels 慢的问题 二

上篇讲到使用pbo解决glreadpix慢的问题,但是效果不太理想,后来参考链接: OpenGL Pixel Buffer Object (PBO)中介绍的2个PBO组成一个队列进行处理。效果会大大加强
解决android opengl glReadPixels 慢的问题 二_第1张图片

1, 如上图所示,要创建2个PBO

GLES30.glGenBuffers(2, pbo);
			GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, pbo.get(0));
			GLES30.glBufferData(GLES30.GL_PIXEL_PACK_BUFFER, oWidth * oHeight * 4, null, GLES30.GL_DYNAMIC_READ);
			GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, pbo.get(1));
			GLES30.glBufferData(GLES30.GL_PIXEL_PACK_BUFFER, oWidth * oHeight * 4, null, GLES30.GL_DYNAMIC_READ);
			GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, 0);


2, 使用 pbo进行操作

GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, pbo.get(nextIndex));
		Buffer buf = GLES30.glMapBufferRange(GLES30.GL_PIXEL_PACK_BUFFER, 0, 4 * mWidth * mHeight, GLES30.GL_MAP_READ_BIT);
		ByteBuffer bytebuffer = ((ByteBuffer) buf).order(ByteOrder.nativeOrder());
		bb.put(bytebuffer);
		//tool.fwrite("/sdcard/src.rgba", bb.array(), bb.array().length, 0);
		video.RecordVideoAddFrame(bb.array(), mWidth, mHeight, 1, 1);
		GLES30.glUnmapBuffer(GLES30.GL_PIXEL_PACK_BUFFER);
		long end = System.currentTimeMillis();
		Log.d("jni", "time = " + (end - start));

3,可以把读取的保存成视频进行处理

使用2个pbo过后,再我的手机上测试情况下,1080x1080的图片大概平均耗时10毫秒左右,有了质的提高, 这也满足了我们一般拍摄录制的需求,但是要求需要降低更

多,显示这种方式还不没达到我们最低的要求,请参照下篇介绍,把处理一桢的时间耗时2毫秒左右,这样会大大节省你录制视频的时间


你可能感兴趣的:(android)