c++ - Opengl 2D 性能提示

标签 c++ opengl

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

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 是一个结构,它具有用于渲染的所有好处,除了一些 vector 之外没有什么特别之处。

我是 OpenGL 的新手,但我至少听说过并尝试了所有可以做的事情,但并不是说我很擅长。这个游戏是一个 2D 游戏,我从 SDL 切换到 Opengl,因为它可以更容易地制作一些更漂亮的效果。显然 SDL 的工作方式不同,但我在使用它时从未遇到过这个问题。

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

最佳答案

Also, give me any tips for increasing performance.

如果你要使用 Sprite ....

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

glTranslatef

对于 2D 基于 sprite 的(这很重要)游戏,您可以完全避免使用矩阵(也许相机/投影矩阵除外)。我认为矩阵不会对 2D 游戏有很大帮助。

对于 2d 游戏,您的主要瓶颈将是 GPU 内存传输速度 - 将数据从纹理传输到屏幕。所以“尽可能少地使用绘图调用”和“将所有内容都放在 VA 中”对你没有帮助——你可以用一个 Sprite 来扼杀性能。

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

关于c++ - Opengl 2D 性能提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9876448/

相关文章:

c++ - 使用 glutDisplayFunc 绘图 (opengl)

c++ - Opengl - 实例化属性

c++ - 构造函数的快捷方式

c++ - 多行注释和换行

c++ - C++结构到Delphi Record dll调用

c++ - 是否需要删除渲染上下文并销毁设备上下文?

qt - 带有 GLFW 和 Qt 的 OpenGL 游戏引擎?

c++ - 有没有办法在使用宏定义的 Boost 测试框架中忽略 SIGCHLD?

c++ - 如何将 Parameter Pack 转换为 std::tuple 之外的其他内容?

c++ - 移动立方体、体素,需要一些建议