解決android opengl glReadPixels 慢的問題 二

解決android opengl glReadPixels 慢的問題 二

上篇講到使用pbo解決glreadpix慢的問題,但是效果不太理想,後來參考鏈接:OpenGL Pixel Buffer Object (PBO)中介紹的2個PBO組成一個隊列進行處理。效果會大大加強


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毫秒左右,這樣會大大節省你錄製視頻的時間


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章