Opengl 2D性能提示

时间:2012-03-26 17:01:10

标签: c++ opengl

我正在开发一种东方风格的子弹地狱射击游戏。屏幕将完全充满子弹(所以实例化是我想要的),但我希望这可以在较旧的硬件上工作,所以我现在正在做一些事情,没有颜色,纹理,直到我弄清楚这一点。

glVertexPointer(3, GL_FLOAT, 0, SQUARE_VERTICES);
for (int i = 0; i < info.centers.size(); i += 3) {
    glPushMatrix();
    glTranslatef(info.centers.get(i), info.centers.get(i + 1), info.centers.get(i + 2));
    glScalef(info.sizes.get(i), info.sizes.get(i + 1), info.sizes.get(i + 2));
    glDrawElements(GL_QUADS, 4, GL_UNSIGNED_SHORT, SQUARE_INDICES);
    glPopMatrix();
}

因为我希望这可以在旧硬件上工作,所以我试图避免使用着色器等等。那里的设置让我失去了大约80个多边形。我希望从中得到至少几百个。 info是一个结构,它具有渲染的所有好处,除了一些向量之外没有什么东西。

我对OpenGL很陌生,但我至少听过并尝试过所有可以做到的事情,而不是说我对它很好。这个游戏是一个2D游戏,我从SDL切换到Opengl,因为它可以让一些更好的效果更容易。显然,SDL的工作方式不同,但我从未遇到过这个问题。

归结为此,我显然在这里做错了,那么如何才能正确实现旧硬件(OpenGL 1.x)的实例化呢?另外,请给我任何提高性能的提示。

1 个答案:

答案 0 :(得分:9)

  

另外,请给我提高性能的提示。

如果您打算使用精灵 ....

  1. 将所有精灵加载到单个巨大纹理中。如果它们不合适,请使用多个纹理,但保持纹理数量较少 - 以避免纹理切换。
  2. 切换纹理并尽可能不频繁地更改OpenGL状态。理想情况下,您应该设置一次纹理,并使用它绘制所有内容。
  3. 将纹理字体用于文本。 FTGL字体可能看起来不错,但是使用复杂的字体可能会很难达到性能。
  4. 尽可能避免使用alpha混合并使用alpha测试。
  5. 进行Alpha混合时,请始终使用alpha测试来减少绘制的像素数。当你的纹理有很多alpha == 0的像素时,用alpha-test将它们剪掉。
  6. 减少非常大的精灵数量。即使在非常好的硬件上,巨大的屏幕对齐/像素aligne精灵(1024 * 1024)也会降低FPS。
  7. 不要使用非2次幂大小的纹理。他们(曾经)在某些ATI卡上产生巨大的性能下降。
  8.   

    的glTranslatef

    对于2D 基于精灵的(重要的)游戏,您可以完全避免使用矩阵(可能除了相机/投影矩阵)。我认为矩阵不会对2D游戏产生很大的好处。

    使用2D游戏,您的主要瓶颈将是GPU内存传输速度 - 将数据从纹理传输到屏幕。因此,“使用少量绘制调用”和“将所有内容放入VA”对您无济于事 - 您可以使用一个精灵来消除性能。

    然而,如果您要使用矢量图片(请参阅area2048youtube)或rez),不使用纹理,那么上面的大多数建议将不适用,并且这种游戏与3D游戏不会有很大不同。在这种情况下,使用顶点数组,顶点缓冲区对象或显示列表(取决于可用的内容)并利用矩阵函数是合理的 - 因为您的瓶颈将是顶点处理。您仍然需要最小化状态切换次数。