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侧访问通过静态方法更快,而不是通过虚拟方法调度(参见http://developer.android.com/guide/practices/design/performance.html#prefer_static)。
折衷的办法是,当访问仅在较新版本的opengl中可用的调用时,您将牺牲一定数量的类型检查。当您通过对象访问调用时,必须先进行转换,如果您使用的gl版本不支持该接口,则转换将失败。当通过静态方法访问调用时,我认为会发生的情况是opengl错误状态将被设置,除非您在glsurfaceview上设置了调试模式,否则很难检测到。
目前,我通过静态方法访问所有内容,并且在glsurfaceview中将调试模式保持为打开状态,直到代码稳定,此时我将关闭它。
克里斯