【发布时间】: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 缓冲区不是一个选项。