Android上的GL10和GLES10之间的区别

时间:2010-05-03 17:00:00

标签: android opengl-es

Android SDK的GLSurfaceView.Renderer界面为我提供了一个GL接口作为参数,其类型为GL10。此接口由一些私有内部jni包装类实现。但是也有类GLES10,其中所有GL方法都可用作静态方法。它们之间有重要区别吗?那么,如果我忽略onDrawFrame的gl参数,而是在任何地方使用GLES10的静态方法呢?

这是一个例子。而不是这样做:

void onDrawFrame(GL10 gl)
{
    drawSomething(gl);
}

void drawSomething(GL10 gl)
{
    gl.glLoadIdentity();
    ...
}

我可以这样做:

void onDrawFrame(GL10 gl)
{
    drawSomething();
}

void drawSomething()
{
    GLES10.glLoadIdentity();
    ...
}

优点是我不必将GL上下文传递给所有被调用的方法。但即便它起作用(并且它有效,我尝试过)我想知道是否有任何缺点和理由不这样做。

1 个答案:

答案 0 :(得分:6)

我一直在寻找回答这个问题的源代码。据我所知,调用OpenGL实现的两种方式都转到相同的本机函数调用。但是,我的理解是,通过静态方法而不是通过虚拟方法分派,Java端访问速度更快(参见http://developer.android.com/guide/practices/design/performance.html#prefer_static)。

权衡是,在访问仅在更高版本的OpenGL中可用的调用时,您会牺牲一定数量的类型检查。当您通过对象访问调用时,必须先进行强制转换,如果您使用的GL版本不支持该界面,则该强制转换将失败。当通过静态方法访问调用时,我认为将会设置OpenGL错误状态,除非您在GLSurfaceView上设置调试模式,否则可能难以检测。

现在我正在通过静态方法访问所有内容,并且我将在GLSurfaceView中保持调试模式,直到代码稳定,此时我将其关闭。

  • 克里斯