Opengl 2D性能提示

Spa*_*ace 3 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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sig*_*erm 9

另外,给我任何提高性能的提示.

如果你要使用精灵 ....

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

的glTranslatef

对于基于 2D 精灵(这是重要的)游戏,您可以完全避免使用矩阵(可能除了相机/投影矩阵).我不认为矩阵会对2D游戏有很大帮助.

在2D游戏中,你的主要瓶颈将是GPU内存传输速度 - 将数据从纹理传输到屏幕.所以"使用少量绘制调用"和"将所有内容放入VA"对你没有帮助 - 你可以用一个精灵来杀死性能.

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