减少 opengl 绘制调用与绑定较小的纹理
Reducing opengl draw calls vs binding smaller textures
我正在使用 SFML 制作等距 (2D) 游戏。我通过按 Y 位置对所有可绘制对象进行排序来处理绘制顺序(深度),并且效果非常好。
该游戏使用了大量的美术资源,仅 NPC、怪物和玩家图形就包含在它们自己的 4k 纹理图集中。从逻辑上讲,我不可能将所有内容都放在一张地图集中。目标设备将无法处理该大小的纹理。请不要关注为什么这是不可能的,并理解在这种情况下我必须为我的纹理使用单独的文件。
这会导致问题。假设我的关卡有 2 个 NPC 和 2 个柱子。 npc在NPCs.png,柱子在CastleLevel.png。根据 npc 移动的位置,绘制顺序(因此 opengly 纹理绑定顺序)可能会有所不同。假设 Y 位置排序如下:
npc1,支柱 1,npc2,支柱 2
这意味着 opengl 必须在 2 个纹理之间切换两次。我的问题是,我应该:
a) 保留纹理图集或
b) 将它们全部分成较小的 png 文件(每个 npc 1 png,每个柱子 1 png 等)。由于无论如何都必须多次更改纹理,如果 opengl 必须绑定较小的纹理,它会提高性能吗?
是否值得保留纹理图集,因为它有时会减少绘制调用的次数?
Since the textures must be changed multiple times anyway, would it improve performance if opengl had to bind smaller textures instead?
几乎可以肯定不是。纹理绑定的成本是固定的;它不是基于纹理的大小。
您最好选择:
正确地批处理您的渲染。也就是说,当您说 "draw NPC1" 时,您实际上并没有绘制它。你把一些数据放在一个数组中,然后你执行 "draw NPCs",它一次性绘制 所有 你缓冲的 NPC。
使用更大的纹理图集,可能涉及 array textures。数组纹理的每一层都是您加载的地图集之一。这样,您只需绑定 一个 纹理来渲染您的场景。
处理一下。 2D 游戏对 GPU 或 CPU 的压力并不大。额外状态更改的开销不会使您从 60FPS 降到 30FPS。
我正在使用 SFML 制作等距 (2D) 游戏。我通过按 Y 位置对所有可绘制对象进行排序来处理绘制顺序(深度),并且效果非常好。
该游戏使用了大量的美术资源,仅 NPC、怪物和玩家图形就包含在它们自己的 4k 纹理图集中。从逻辑上讲,我不可能将所有内容都放在一张地图集中。目标设备将无法处理该大小的纹理。请不要关注为什么这是不可能的,并理解在这种情况下我必须为我的纹理使用单独的文件。
这会导致问题。假设我的关卡有 2 个 NPC 和 2 个柱子。 npc在NPCs.png,柱子在CastleLevel.png。根据 npc 移动的位置,绘制顺序(因此 opengly 纹理绑定顺序)可能会有所不同。假设 Y 位置排序如下:
npc1,支柱 1,npc2,支柱 2
这意味着 opengl 必须在 2 个纹理之间切换两次。我的问题是,我应该:
a) 保留纹理图集或
b) 将它们全部分成较小的 png 文件(每个 npc 1 png,每个柱子 1 png 等)。由于无论如何都必须多次更改纹理,如果 opengl 必须绑定较小的纹理,它会提高性能吗?
是否值得保留纹理图集,因为它有时会减少绘制调用的次数?
Since the textures must be changed multiple times anyway, would it improve performance if opengl had to bind smaller textures instead?
几乎可以肯定不是。纹理绑定的成本是固定的;它不是基于纹理的大小。
您最好选择:
正确地批处理您的渲染。也就是说,当您说 "draw NPC1" 时,您实际上并没有绘制它。你把一些数据放在一个数组中,然后你执行 "draw NPCs",它一次性绘制 所有 你缓冲的 NPC。
使用更大的纹理图集,可能涉及 array textures。数组纹理的每一层都是您加载的地图集之一。这样,您只需绑定 一个 纹理来渲染您的场景。
处理一下。 2D 游戏对 GPU 或 CPU 的压力并不大。额外状态更改的开销不会使您从 60FPS 降到 30FPS。