【问题标题】:Reducing opengl draw calls vs binding smaller textures减少 opengl 绘制调用与绑定更小的纹理
【发布时间】:2018-01-26 16:02:17
【问题描述】:

我正在使用 SFML 制作等距 (2D) 游戏。我通过按 Y 位置对所有可绘制对象进行排序来处理绘图顺序(深度),并且效果非常好。

游戏使用了大量的美术资源,因此仅 NPC、怪物和玩家图形都包含在他们自己的 4k 纹理图集中。从逻辑上讲,我不可能将所有内容都放在一个地图集中。目标设备将无法处理该大小的纹理。请不要专注于为什么这是不可能的,并理解在这种情况下我必须为我的纹理使用单独的文件。

这会导致问题。假设我有一个包含 2 个 NPC 和 2 个支柱的关卡。 NPC 位于 NPCs.png 中,柱子位于 CastleLevel.png 中。根据 npc 移动的位置,绘制顺序(因此 opengly 纹理绑定顺序)可能会有所不同。假设 Y 位置的排序如下:

npc1,支柱 1,npc2,支柱 2

这意味着 opengl 必须在两个纹理之间切换两次。我的问题是,我应该:

a) 保留纹理图集或

b) 将它们全部分成较小的 png 文件(每个 npc 1 个 png,每个柱子 1 个 png 等)。由于纹理必须多次更改,如果 opengl 必须绑定较小的纹理,是否会提高性能?

是否值得保留纹理图集,因为它有时会减少绘制调用的数量?

【问题讨论】:

  • 即使有多个绘图调用,使用图集您也不必为每个可绘制对象绑定新纹理。从您的帖子中,我猜您是为了避免深度测试而从头到尾排序?您可以尝试启用深度测试并按图集排序绘制。如果您通过某种启发式方法将图集排序为大致从前到后,则减少过度绘制和纹理切换可以补偿深度测试。但我想你的问题不会有一个普遍的答案,因为它取决于太多的参数,比如场景复杂度等。
  • 感谢您的评论。由于透明度,Z 缓冲区不是一个选项。

标签: opengl drawing textures


【解决方案1】:

由于纹理必须多次更改,如果 opengl 必须绑定较小的纹理,是否会提高性能?

几乎肯定不会。纹理绑定的成本是固定的;它不是基于纹理的大小。

您最好:

  1. 正确批处理渲染。也就是说,当您说“绘制 NPC1”时,您实际上还没有绘制它。您将一些数据粘贴到一个数组中,然后执行“绘制 NPC”,它会一次性绘制 所有 已缓冲的 NPC。

  2. 使用更大的纹理图集,可能涉及array textures。阵列纹理的每一层都是您加载的图集之一。这样,您只需绑定 一个 纹理来渲染场景。

  3. 处理它。 2D 游戏对 GPU 或 CPU 的压力并不大。额外状态更改的开销不会使您从 60FPS 降低到 30FPS。

【讨论】:

  • 非常感谢。 “纹理绑定的成本是固定的”正是我需要的答案。但是我不明白你的观点 1. SFML 使用画家算法,所以除非使用 Z 缓冲区,否则我看不出这怎么可能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
相关资源
最近更新 更多