Android OpenGL ES - 使用glTranslatef或直接更新顶点

时间:2012-04-30 09:28:07

标签: android opengl-es

如果我的应用是修改对象顶点而不是使用glTranslatef,会有性能提升吗?

NPC对象的顶点设置如下:由于先前调用了gl.glScalef()

,因此它们允许它们是屏幕宽度的十分之一
protected float[] vertices = {
    0f, 0f, -1f,    //Bottom Left
    1f, 0f, -1f,    //Bottom Right
    0f, 1f, -1f,    //Top Left
    1f, 1f, -1f     //Top Right
};

目前我有一组NPC对象在屏幕上绘制,当它们移动时,X和Y值会更新,我的onDraw访问这些值以在正确的位置绘制NPC。

onDraw(GL10 gl){
    for(int i=0; i<npcs.size(); i++){
        NPC npc = npcs.get(i);
        npc.move();
        translate(npc.x, npc.y);
        npc.draw(gl);
    }
}

translate(x,y) - 在调用方法gl.glTranslatef()时按下并弹出矩阵,进行与屏幕大小和比率相关的计算

npc.draw(gl) - 启用客户端状态并绘制数组

如果移动函数改变了顶点和NPC对象,性能是否会提高?例如;

move(){
    // ... do normal movement calculations
    float[] vewVertices = {
    x, y, 0f,
    x+npc.width, y, z,
    x, y+npc.height, z,
    x+npc.width, y+npc.height, z
    }
    vertexBuffer.put(newVertices);
    vertexBuffer.position(0);
}

我即将创建一个简短的测试,以确定我是否可以看到任何性能提升,但我想问一下是否有人之前有过这方面的经验。

3 个答案:

答案 0 :(得分:2)

最好的方法是简单地使用translate函数,因为在平移过程中模型视图矩阵的变换包括3个浮点值的操作,而顶点信息的变化与你拥有的顶点数量成正比。

在充分尊重的情况下,你提出的方式非常不方便,你应该坚持使用矩阵操作代替顶点操作。

您可以参考此文档以获取有关翻译操作期间矩阵更改的更多信息:

http://www.songho.ca/opengl/gl_transform.html

干杯 莫里吉奥

答案 1 :(得分:0)

在我当前的Open GL应用程序中创建测试状态后,使用gl.glTranslatef()

直接更改顶点时似乎没有性能提升

答案 2 :(得分:0)

就像Maurizio Benedetti指出的那样,只有当您的顶点数量足够大时,您才会看到差异。