opengl fbo离屏渲染,处理Android截屏卡顿太久。

时间:2021-11-13 19:42:28

1.首先说明一下,只做参考。项目记录。由于项目需求,涉及到摄像头截图。当然了是GLSurfaceView了。

2.自己定义一个Renderer实现GLSurfaceView.Renderer,在onDrawFrame函数里面操作。

相信大部分人都是在这里面开启异步进行截图。使用这个函数,或者其他

GLES20.glReadPixels(0, 0,width_surface, height_surface,GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, intBuffer);

在此之前,楼主也是这样操作,发现截图会卡顿,每个机子卡顿时间不一样。但大多数要300多ms。或更久。

3.不想啰嗦了,上代码。

4.定义两对象。

 private int[] fFrame = new int[1];
 private int[] fTexture = new int[1];
5.开启的函数,这里是用GLES20。

 private void bindfbo() {
        GLES20.glGenFramebuffers(1, fFrame, 0);

        GLES20.glGenTextures(1, fTexture, 0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, fTexture[0]);
        GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width_surface, height_surface,0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);

        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

        GLES20.glBindFramebuffer(GL_FRAMEBUFFER, fFrame[0]);
        GLES20.glFramebufferTexture2D(GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,GLES20.GL_TEXTURE_2D, fTexture[0], 0);

        int status= GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
        if(status !=GLES20.GL_FRAMEBUFFER_COMPLETE) {
            throw new RuntimeException("status:"+status+", hex:"+Integer.toHexString(status));
        }
}
6.每一次开启后要解绑

private void unbindfbo() {
        GLES20.glBindFramebuffer(GL_FRAMEBUFFER, 0);
        GLES20.glDeleteTextures(1, fTexture, 0);
        GLES20.glDeleteFramebuffers(1, fFrame, 0);
    }
7.注意事项:

不要每一次都开启。用按钮写个接口或者布尔值控制,点击就截图。然后解绑。

来张截图吧。

opengl fbo离屏渲染,处理Android截屏卡顿太久。