Opengl 2D性能提示

Opengl 2D performance tips

本文关键字:提示 性能 2D Opengl      更新时间:2023-10-16

我目前正在开发一款头侯式的子弹地狱射击游戏。屏幕上绝对会充满子弹(所以实例化是我想要的),但我希望它能在旧的硬件上运行,所以我现在正在做一些类似的事情,在我弄清楚之前,还没有颜色、纹理等。

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

glTranslatef

对于基于2D精灵的(这很重要)游戏,您可以完全避免矩阵(也许相机/投影矩阵除外)。我不认为矩阵对2D游戏有多大好处。

对于2d游戏,你的主要瓶颈将是GPU内存传输速度——将数据从纹理传输到屏幕。所以"像小抽奖一样使用"answers"把所有东西都放在VA"对你没有帮助——你可以用一个精灵来扼杀性能。

但是,如果你要使用不使用纹理的矢量图形(请参阅area2048(youtube)或rez),那么上面的大多数建议都不适用,这样的游戏与3d游戏没有太大区别。在这种情况下,使用顶点数组、顶点缓冲区对象或显示列表(取决于可用的内容)并使用矩阵函数是合理的,因为瓶颈将是顶点处理。您仍然需要尽量减少状态开关的数量。