使用OpenGL ES在2D空间中定位元素

Rob*_*Rob 7 iphone 2d opengl-es

在业余时间,我喜欢用OpenGL ES在iPhone上玩游戏开发.我正在将一个小的2D侧卷轴演示放在一起,以获得乐趣,而且我对OpenGL相对较新,我希望得到一些更有经验的开发人员的建议.

所以这是我的问题:在模型空间中指定每个2D元素的顶点是否有意义,然后在每次绘制帧将每个元素转换为它的最终视图空间?

例如,假设我有一组块(正方形)构成我的侧卷轴的地面.每个方块定义为:

const GLfloat squareVertices[] = {
        -1.0, 1.0, -6.0,            // Top left
        -1.0, -1.0, -6.0,           // Bottom left
        1.0, -1.0, -6.0,            // Bottom right
        1.0, 1.0, -6.0              // Top right
    }
Run Code Online (Sandbox Code Playgroud)

假设我需要将这些正方形中的10个作为下一帧的基础绘制在一起.对于当前场景中可见的每个方格,我应该这样做吗?

glPushMatrix();
{
    glTranslatef(currentSquareX, currentSquareY, 0.0);
    glVertexPointer(3, GL_FLOAT, 0, squareVertices);
    glEnableClientState(GL_VERTEX_ARRAY);

    // Do the drawing
}
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)

在我看来,这样做对场景中的每个元素的2D,对于每一个帧,变得有点紧张,我会想象谁使用OpenGL比我更聪明的人可能有这样做的更好的方法.

这一切都这样说,我期待听到这个消息,我应该分析代码,看看任何瓶颈可能是:那些人,我说:我没有写此代码的任何然而,我只是在这个过程中把我的思绪缠绕在它周围,这样当我去写它时它会变得更顺畅.

关于剖析和优化的主题,我真的不想在这里过早地进行优化,我只是试图围绕如何设置2D场景并渲染它.就像我说的那样,我对OpenGL相对较新,我只是想了解事情是如何完成的.如果有人对更好的方法有任何建议,我很乐意听到你的想法.

请记住,我对3D不感兴趣,现在只是2D.谢谢!

And*_*son 6

当您拥有大量模型时,您担心将模型(在本例中为正方形)从模型坐标转换为世界坐标所需的开销.这似乎是静态模型的明显优化.

如果你在世界坐标中构建正方形的顶点,那么当然它会更快,因为每个正方形将避免这三个函数(glPushMatrix,glPopMatrix和glTranslatef)的额外成本,因为不需要从模型转换为世界渲染时的坐标.我不知道这会有多快,我怀疑它不会是一个巨大的优化,你失去了在模型坐标中保持方块的模块性:如果将来你决定你希望这些方块可以移动怎么办? ?如果你将它们的顶点保持在世界坐标中,那将会更加困难.

简而言之,这是一个权衡:

世界坐标

  • 更多内存 - 每个方块都需要自己的顶点集.
  • 减少计算 - 无需在渲染时为每个方块执行glPushMatrix,glPopMatrix或glTranslatef.
  • 灵活性较低 - 缺乏动态移动这些方块的支持(或复杂化)

模型坐标

  • 较少的内存 - 方块可以共享相同的顶点数据
  • 更多计算 - 每个方格必须在渲染时执行三个额外的功能.
  • 更灵活 - 通过操纵glTranslatef调用可以轻松移动方块.

我想知道什么是正确决定的唯一方法是做和分析.我知道你说你还没有写过这个,但是我怀疑你的方块是在模型还是世界坐标上它不会产生太大的影响 - 如果确实如此,我无法想象你能做到的建筑创建难以将正方形从模型切换到世界坐标的位置,反之亦然.

祝你好运,你在iPhone游戏开发中的冒险经历!