多次渲染相同精灵而不降低FPS的策略



我正在尝试生成一个涉及迷宫的游戏,每个级别随机生成。我正在为android设计这个游戏,并且正在使用openGL 1。

当我在相当小的迷宫中奔跑时,FPS大约是60,但当我的数字开始增加时,FPS会下降到30-40。我把每一面墙都画成一个单独的精灵(使用我从网上买来的标准精灵Batcher和相同的纹理),当精灵数量大约为500或更多时,FPS就会下降。当我获得3000个精灵时,FPS似乎不会进一步下降,但当我放大时,它确实会回到大约60。所以我认为必须显示的精灵数量是速度减慢的原因。

我最初的策略是在启动时绘制迷宫,然后将其渲染为一个精灵。然而,我偶尔会在游戏中对迷宫进行更改,所以这个绘图会在游戏时间调用,并且必须相当快。我试着从显示器上抓取像素,也试着在背景中使用Canvas绘制迷宫,但这两种方法都需要整整1秒的时间。

如果我的假设是错误的,我会感谢任何关于如何绕过这一点的想法,以及任何关于为什么游戏会放缓的想法。

谢谢

免责声明-我不是一个经验丰富的程序员。

我在Android系统或OpenGL ES.方面没有太多经验

但是,为了在OpenGL中获得更好的性能,你应该做一个最小的操作:

  1. 不同的绑定(缓冲区、纹理…)
  2. 不要使用大量的draw调用(批处理是最好的)

为了不必绑定多个缓冲区,更好的方法是使用一个并且只有一个在渲染开始时绑定的"大"vbo。对于纹理,有很多方法。由于您的目标是OpenGL 1,因此更好的方法应该是使用一个大的纹理阵列。

要执行批处理,您应该(也必须)使用glMultiDrawElements(或Array,但缓存时首选元素)。

所以,对于你的问题,我会尝试自己做很多事情。你不能使用稀疏的无绑定纹理(这应该是更好的解决方案),但你可以使用纹理阵列(如果它在你的目标版本中可用,我不确定)。

如果不能使用纹理阵列,则可以分配一个且只能分配一个大纹理,并将其放入许多精灵中,例如,可以将其放入20或30个精灵中,从而调整UV。之后,执行glDrawMultiElements的循环:)。

在伪代码中,你的渲染循环应该是这样的

for each batch of (say 30 sprites)
    glBindTexture();
    glMultiDrawElements(); // maybe 300 commands (if a sprite is used for 10 walls)
end for

最新更新