OpenGL ES,onDrawFrame性能

时间:2014-12-17 16:22:07

标签: java android opengl-es surface

我有一个Activity,我使用GLSurfaceView.Renderer,  在渲染器中我使用onDrawFrame在每个触摸事件上使用glTexImage2D绘制新图像, 一切都很好,但在更改图像onDrawFrame时屏幕暂停约1/2秒 任何人都可以帮助解决这个问题吗?

活动:

onCreate(){..
    glSurfaceView.setRenderer(renderer);

...

private Renderer renderer = new Renderer() {

...

渲染器:

onSurfaceCreated(){..
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);

渲染器:

onDrawFrame(){..
if(mytoucheventFired){
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, anotherBitmap, 0);
}

1 个答案:

答案 0 :(得分:0)

您可能会受益于在本机代码中将图像加载到纹理中,即使用NDK,并调用glTexImage2D。 GLUtils.texImage2D可能正在进行额外的逐像素工作,将java Bitmap转换为OpenGL纹理,您可以在本机代码中避免或加速。

glTexImage2D传统上不是快速操作。这对你来说可能有些过分,但如果你愿意超越OpenGL领域,你可以通过获取底层纹理数据的地址并直接加载到其中来快速击败glTexImage2D。在Android上(再次在本机代码中),您可以使用名为EGL_KHR_image_base的EGL扩展来获取地址:

您需要的一些关键功能是:

EGLImageKHR eglCreateImageKHR(
                        EGLDisplay dpy,
                        EGLContext ctx,
                        EGLenum target,
                        EGLClientBuffer buffer,
                        const EGLint *attrib_list)

EGLBoolean eglDestroyImageKHR(
                        EGLDisplay dpy,
                        EGLImageKHR image)

void glEGLImageTargetTexture2DOES(
                        GLenum target,
                        GLeglImageOES image)