我刚开始在Android中使用OpenGL ES,但我想这也适用于使用OpenGL ES的其他移动平台。我已经完成了一些教程,让我开始,但我觉得我有很多不足之处。
例如,让对象单独绘制它们是一种好习惯吗?我有一个绘制自己的立方体对象,然后我有一个“面板”对象,它是一个10x10立方体的数组,最后是另一个由面板组成的对象,用于创建像对象一样的立方体。我需要绘制7500个立方体,尽管每个立方体都非常“小”。这是绘图函数的样子:
public void draw(GL10 gl) {
gl.glFrontFace(GL10.GL_CCW);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glCullFace(GL10.GL_BACK);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer);
gl.glColor4f(rgba[0], rgba[1], rgba[2], rgba[3]);
gl.glTranslatef(x, y, z);
gl.glRotatef(rx, 1, 0, 0);
gl.glRotatef(ry, 0, 1, 0);
gl.glRotatef(rz, 0, 0, 1);
gl.glDrawElements(GL10.GL_TRIANGLES, numOfIndices,
GL10.GL_UNSIGNED_SHORT, indicesBuffer);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisable(GL10.GL_CULL_FACE);
}
在处理OpenGL ES时,还有其他一些应该避免的事情吗?
编辑:我一直在想的另一件事是,减少对某些方法的调用量是一种好习惯,例如
gl.glFrontFace(GL10.GL_CCW);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glCullFace(GL10.GL_BACK);
gl.glDisable(GL10.GL_CULL_FACE);
这是在绘制时为每个对象调用的,是必需的还是可以在我最上面的对象中调用一次?
此外:
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
我意识到根据情况可能需要启用和禁用,但如果可以避免,这是否会对任何事情产生不利影响?
答案 0 :(得分:1)
您可以使用批处理器将所有顶点批处理为一个数组,然后绘制,因此只使用一个绘制调用。
编辑:这是我项目的一个例子。我有几个NPC需要单独绘制和更新,以便它们彼此独立移动。
// update
for (int i = 0; i < npcs.length; i++) {
npcs[i].update(touchEvents);
}
// draw
npcBatcher.beginBatch(Assets.atlas);
for (int i = 0; i < npcs.length; i++) {
npcs[i].draw(npcBatcher);
}
npcBatcher.endBatch();
在我的绘制方法中,我开始批处理,添加到批处理,最后结束批处理(实际绘制)。在更新方法中,我遍历每个NPC对象并更新EACH NPC。在NPC对象的更新方法中,我随机生成一些数字并根据随机数移动它们(做所有使它们表现不同的逻辑)。由于每个NPC都有自己的随机生成数字更新,因此它们的行为都不同。所有的绘图都是立刻完成的。所有的绘图都无关紧要,重要的是每个对象的更新,并且是您正在寻找的。 p>
答案 1 :(得分:1)
你的操作性能在很大程度上取决于你的gl调用次数, 所以尽量减少gl调用。 如果它是你唯一的绘图位置,则不需要每次都禁用cullface和vertex数组,只在初始化方法中启用cull face的启用调用,以便它只启用一次。