2017-05-22 8 views
0

낡은 질문이지만 코드에 대한 답장을 보내고 싶습니다.GLES20.glReadPixel too slow

다음은 실시간으로보기에는 너무 느립니다. 나중에 OpenTOK 화면 공유와 함께 사용하려고합니다. 어떤 빠른 대용품?

ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4); 
bb.order(ByteOrder.nativeOrder()); 
GLES20.glReadPixels(0, 0, width, height, GL_RGBA, 
     GL10.GL_UNSIGNED_BYTE, bb); 

int pixelsBuffer[] = new int[screenshotSize]; 
bb.asIntBuffer().get(pixelsBuffer); 
final Bitmap bitmap = Bitmap.createBitmap(width, height, 
     Bitmap.Config.RGB_565); 
bitmap.setPixels(pixelsBuffer, screenshotSize - width, -width, 
     0, 0, width, height); 
pixelsBuffer = null; 

short sBuffer[] = new short[screenshotSize]; 
ShortBuffer sb = ShortBuffer.wrap(sBuffer); 
bitmap.copyPixelsToBuffer(sb); 

for (int i = 0; i < screenshotSize; ++i) { 
    short v = sBuffer[i]; 
    sBuffer[i] = (short) (((v & 0x1f) << 11) | (v & 0x7e0) | ((v & 0xf800) >> 11)); 
} 
sb.rewind(); 
bitmap.copyPixelsFromBuffer(sb); 

PS : 나는 이미 GL_RGB 및 GL_BGRA을 시도했지만 여전히 느리고 난 단지 검은 화면을 얻을.

+0

[OpenGL에서 glReadPixels보다 빠른 픽셀 읽기] 가능한 복제본 (https://stackoverflow.com/questions/25127751/opengl-read-pixels-father-than-glreadpixels) – yakobom

답변

0

우선 glReadPixels가 코드 속도를 늦추는 원인이 아닙니다. 모든 버퍼를 할당하고 이미지를 다른 형식으로 변환합니다.

재사용 버퍼. 그들을 한 번 할당하고 그들을 재사용하십시오.

ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4); 
bb.order(ByteOrder.nativeOrder()); 

이 비트에는 아무런 문제가 없습니다.

GLES20.glReadPixels(0, 0, width, height, GL_RGBA, 
     GL10.GL_UNSIGNED_BYTE, bb); 

이제 오버 헤드가 많은 다른 형식으로 변환하려고합니다. 귀하가받는 형식을 고수하십시오. 그리고 다시, 재사용하지 않고 버퍼를 할당하고 있습니다.

그러나 비트 맵을 한 번 할당하고 다시 사용할 수 있습니다.

int pixelsBuffer[] = new int[screenshotSize]; 
bb.asIntBuffer().get(pixelsBuffer); 
final Bitmap bitmap = Bitmap.createBitmap(width, height, 
     Bitmap.Config.RGB_565); 
bitmap.setPixels(pixelsBuffer, screenshotSize - width, -width, 
     0, 0, width, height); 
pixelsBuffer = null; 

short sBuffer[] = new short[screenshotSize]; 
ShortBuffer sb = ShortBuffer.wrap(sBuffer); 
bitmap.copyPixelsToBuffer(sb); 

그러면 불필요한 변환이 필요하지 않습니다.

for (int i = 0; i < screenshotSize; ++i) { 
    short v = sBuffer[i]; 
    sBuffer[i] = (short) (((v & 0x1f) << 11) | (v & 0x7e0) | ((v & 0xf800) >> 11)); 
} 

CopyPixelsFromBuffer()는 Bitmap이 동일한 형식이면 사용할 수 있습니다.

bitmap.copyPixelsFromBuffer(bb); 

는 일반적으로 안드로이드 비트 맵 GL_RGBA와 같은 형식, 그래서 당신이 변환해야합니다 확률이 낮다. 위의 내용은 모든 것을 읽기 및 복사로 줄입니다.