【问题标题】:Using OpenGL to accelerate 2D graphics使用 OpenGL 加速 2D 图形
【发布时间】:2010-12-06 02:32:16
【问题描述】:

我和我的朋友正在尝试使用 OpenGL 加速 2D 游戏。视频芯片组是 Radeon X1250,它似乎功率不足,可以显示高达 80 1366x768 全帧/秒。鉴于我们在彼此之上绘制了许多 sprite,性能在我们的目标 60 FPS 下急剧下降。您能否提供使用 OpenGL 快速渲染 2D 的优化技巧?

编辑:一些澄清: 在 Linux 下使用 C++ 进行开发。我们使用 SDL 完成了它,但性能并不令人满意,因此我们决定切换到 OpenGL,它被证明要快得多,当然,随后推动实现更多功能,要求我们每帧重绘整个屏幕。

我们的测试程序在 1366x768 屏幕上呈现带纹理的 256x256 四边形图块。如果在缓冲区交换之前铺设单层瓷砖,则会产生 80 FPS,如果铺设两层,则帧率会下降到 60 FPS 以下。考虑到开发板需要同时解码和渲染一些小的 MPEG,这可能无法令人满意。

我只是认为我可以寻找由于游戏是 2D 的事实而产生的优化 - 我想到了,例如: 1) 如果可以禁用纹理缩放。 2) 直接渲染到帧缓冲区(尽管我们听说 glDrawPixels 应该很慢。

【问题讨论】:

  • 能否提供一些代码?
  • 如果你写下你在谈论多少精灵会有所帮助。是多少 100、1000、10000?那么可能更容易说出您是否做错了什么或如何优化。

标签: performance optimization opengl 2d


【解决方案1】:

听起来您正面临卡的最大填充率,再加上您正在进行混合,因此需要读取和写入。

如果您过度绘制了足够多的帧缓冲区(尤其是在高分辨率下),那么您最终会降低帧速率,因为卡的填充率受到限制。

尽管现代卡片可以进行很多操作,但它们可以推送的像素数量仍然有限。

为了减少这种情况,一些建议是:

  • 不要在每一帧都绘制所有内容 - 如果可能 - 将某些部分渲染到其他缓冲区,然后将它们混合 - 如果可能,以较低的分辨率进行
  • 如果没有必要,不要使用混合 - 混合比绘制不透明的东西要慢得多
  • 使用更便宜的片段着色器/片段程序 - 如果您使用的是可编程管道(注意:我不知道您如何真正知道它有多贵)
  • 尽可能多地使用剔除 - 避免绘制根本看不到的东西。如果一个精灵完全(或大部分)隐藏在其他精灵后面,则不需要绘制它。
  • 缩放/插值可能相对便宜 - 使用较低分辨率的纹理并缩放它们 - 特别是如果您的纹理一开始就“模糊”。

如果您这样做是为了获得一些时髦的烟雾/粒子效果,您可能无法使用所有或许多这些优化。

【讨论】:

  • 您能否详细说明“不要在每一帧都绘制所有内容”?
【解决方案2】:

与往常一样,如果您指定了目标 OpenGL 的版本,则更容易得出更准确的答案。似乎这是 StackOverflow 上大多数与 OpenGL 相关的问题所缺少的东西。

如果您将大量逐顶点数据上传到服务器,请确保将顶点数据存储在缓冲区对象中。切勿使用即时模式,即 glBegin/glEnd 对。而是使用 glDrawArraysglDrawElements 或其他数组绘制调用。这已经极大地提升了性能。

过度绘制本身并不慢,但它肯定会无缘无故地消耗填充率。但是遮挡剔除通常不值得初始性能设置成本。每个片段的混合会消耗大量的填充率。

如果这些提示没有帮助,我建议您检查您的应用程序是否真的受 GPU 限制。我有疑问。瓶颈可能在其他地方。也许您的 X visual/FBConfig 没有硬件加速?

【讨论】:

    【解决方案3】:

    OpenGL 的设计初衷是为了快速,但可以编写它以使其性能不佳。

    未知数太多,无法提供太多帮助。例如,您使用的是哪种语言(我猜是 C++),您使用的是哪种框架,还是您自己编写的?

    您要重建多少屏幕?例如,您是否会重新生成每个对象,而不仅仅是翻译它们?

    您可能会发现问题很有用:What are some best practices for OpenGL coding (esp. w.r.t. object orientation)?

    如果你能提供一些你分析过的例子,以确定减速的地方,那将很有帮助。

    如果您只使用线框,没有填充或纹理,您的表现如何?

    您的游戏循环是什么样的?例如,是否有任何与鼠标或键盘的交互,该逻辑是否会影响帧速率?

    我在重绘 70 fps 但我的音乐没有以正确的毫秒开始或结束时遇到了这个问题,因此,我将循环更改为仅执行 30 fps 并增加我处理音乐的频率,并且我的表现提高了。

    【讨论】:

      【解决方案4】:

      一种优化是在启用 Z 缓冲的情况下从前到后绘制图层(尽管这确实假设不透明)并利用 Early Z 功能。

      但其他 cmets 是正确的。很难说你怎么能用这么少的信息来加速......

      【讨论】:

        【解决方案5】:

        您确定渲染是一个问题,还是您有与渲染相关的逻辑? OpenGL 中的性能优化是一个相当大的话题,所以我只是为您指出一个资源。

        First link on google

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-15
          • 2013-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多