我正在与一群人一起开发基于图块/精灵的小型PC游戏,但我们遇到了性能问题。我上一次使用OpenGL是在2004年左右,所以我一直在教自己如何使用核心配置文件,但发现自己有些困惑。
我需要每帧在屏幕上绘制250-750个48x48瓦片附近,以及大约50个精灵。磁贴仅在加载新关卡时更改,并且精灵一直在更改。一些图块由四个24x24片组成,大多数(但不是全部)子画面与图块大小相同。许多图块和精灵使用alpha混合。
现在,我正在即时模式下进行所有操作,这是一个坏主意。一样,当我们的一个团队成员尝试运行它时,他的帧率非常差(〜20-30 fps),而且当有更多的图块时,情况会更糟,尤其是当这些图块中的很多都是被切成碎片。所有这些使我认为问题在于进行绘制调用的次数。
我已经想到了一些可能的解决方案,但是我想让一些知道他们在说什么的人来运行它们,所以我不会在愚蠢的事情上浪费时间:
标题:
- 加载关卡后,将所有图块一次绘制到连接到大喇叭声纹理的帧缓冲区中,然后每帧绘制一个带有该纹理的大矩形。
- 加载关卡时,将所有图块放入静态顶点缓冲区中,并以这种方式绘制它们。我不知道是否有一种方法可以通过一次调用glDrawElements来绘制具有不同纹理的对象,或者这是否是我想要做的事情。也许只是将所有瓦片都变成巨大的巨型纹理,然后在VBO中使用有趣的纹理坐标?
精神:
- 通过单独调用glDrawElements绘制每个精灵。这似乎涉及许多纹理切换,但我被告知是不好的。纹理数组在这里可能有用吗?
- 以某种方式使用动态VBO。与上面的数字2相同的纹理问题。
- 点精灵?这可能很愚蠢。
这些想法中有什么明智的吗?我可以看的地方有很好的实现吗?