减少opengl绘制调用与绑定较小纹理

时间:2018-01-26 16:02:17

标签: opengl drawing textures

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

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

这会导致问题。让我们说我有一个2 npcs和2个支柱的水平。 npcs位于NPCs.png中,支柱位于CastleLevel.png中。根据npcs移动的位置,绘制顺序(因此opengly纹理绑定顺序)可以不同。让我们说Y位置的排序如下:

npc1,pillar1,npc2,支柱2

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

a)保持纹理atlasses OR

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

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

1 个答案:

答案 0 :(得分:6)

  

由于纹理必须多次更改,如果opengl必须绑定较小的纹理,它会改善性能吗?

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

你或者更好:

  1. 正确批量渲染。也就是说,当你说"画NPC1"时,你还没有真正画出它。你将一些数据粘贴在一个数组中,稍后,你执行"绘制NPC",它会一次性缓存所有你已经缓冲过的NPC。

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

  3. 处理它。 2D游戏对GPU或CPU来说并不是很紧张。额外状态变化带来的开销不会让你从60FPS降到30FPS。