Android上GL10和GLES10的区别

Android上GL10和GLES10的区别,android,opengl-es,Android,Opengl Es,Android SDK的GLSurfaceView.Renderer接口为我提供了一个GL接口作为参数,其类型为GL10。这个接口是由一些私有的内部jni包装类实现的。但是还有一个类GLES10,其中所有的GL方法都可以作为静态方法使用。它们之间有重要区别吗?那么,如果我忽略onDrawFrame的gl参数,而到处使用GLES10的静态方法,会怎么样 这里有一个例子。而不是这样做: void onDrawFrame(GL10 gl) { drawSomething(gl); } voi

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上下文传递给所有被调用的方法。但是,即使它有效(而且有效,我试过了),我想知道不这样做是否有任何缺点和原因。

我一直在翻源代码,试图回答这个问题。据我所知,调用OpenGL实现的两种方法都使用相同的本机函数调用。然而,我的理解是,通过静态方法而不是通过虚拟方法调度,Java端访问速度更快(请参阅)

折衷的办法是,在访问仅在更高版本的OpenGL中可用的调用时,牺牲一定数量的类型检查。当您通过对象访问调用时,必须首先进行转换,如果您使用的GL版本不支持该接口,则转换将失败。当通过静态方法访问调用时,我认为将发生的是OpenGL错误状态将被设置,这可能更难检测,除非您在GLSURFACHEVIEW上设置了调试模式

因为现在我通过静态方法访问所有内容,我将在GLSURFACHEVIEW中保持调试模式打开,直到代码稳定,此时我将关闭它

  • 克里斯