Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

glReadPixels too slow to use

I am using glReadPixels to take a snapshot at regular intervals in drawFrame method of GLSurfaceView.Renderer. I need to take this snapshot at regular intervals to keep saving my data as per my app requirements.

However glReadPixels performance is really slow and shows a lag. Here's how I use the method:

gl.glReadPixels(0, 0, 1280, 752, GL10.GL_RGBA,GL10.GL_UNSIGNED_BYTE, bb);

Is there a alternative to use glReadPixels? How can I save the image without causing a lag?

like image 967
random Avatar asked Nov 22 '11 05:11

random


People also ask

Is glReadPixels slow?

Yes, glReadPixels() is a VERY slow.

What is PBO OpenGL?

In particular, PBOs are a way to improve asynchronous behavior between the application and OpenGL. Therefore, the first thing that you need to do in order to properly take advantage of them is to actually have something to do while you are waiting for the transfer to complete.


1 Answers

I don't know if that is available on android, but maybe PBOs (Pixel buffer objects) will give a performance boost. See this OpenGL.org thread.

However, don't expect miracles! With a 1280*752 RGBA image, you are transfering 3.67 MB of data each frame. I don't know the figures for Android, but I would bet you are facing a memory bandwidth or hard drive write bottleneck. If you reduce the size of your readPixel and get much better performance, you know that's the problem.

Also, do you need the "A" component? Maybe reading back RGB is faster. Try reading back in different formats. Some are way faster than others because they map better to the OpenGL memory representation. For example, BGRA might be faster than RGBA. When the you request a format that doesn't match what OpenGL has, each pixel must be converted during the operation.

like image 75
bernie Avatar answered Sep 17 '22 01:09

bernie