【发布时间】:2010-04-29 05:50:13
【问题描述】:
我正在开发一个 2D 横向滚动游戏,我需要优化我的平铺代码以获得更好的帧速率。截至目前,我正在使用纹理图集和 16x16 瓷砖来实现 480x320 屏幕分辨率。关卡双向滚动,并且明显大于 1 个屏幕(数千像素)。我使用 glTranslate 进行实际滚动。
到目前为止我已经尝试过:
- 使用 glTriangles 仅绘制屏幕上的图块,每平方图块 2 个(开销太大)
将整个地图绘制为显示列表(在小级别上很棒,在大级别上会变慢)
将地图划分为屏幕大小一半的显示列表,然后剔除显示列表(双向滚动仍会减慢速度,过度绘制效率不高)
感谢任何建议,但我特别想知道:
- 我已经看到为此建议使用的顶点数组/VBO,因为它们是动态的。利用这一点的最佳方法是什么?如果我只是保留 1 个屏幕的顶点加上一些透支,我必须每隔几帧重新复制一次数组以考虑相对坐标的变化(将所有内容移过来并添加新的行/列)。如果我使用更多的透支,这似乎不是一个大胜利;这就像半屏显示列表的想法。
- 如果将 glScissor 用于像这样的一堆小图块(无论是显示列表还是顶点数组/VBO)上,是否会获得任何收益
- 用大纹理构建关卡然后使用 glScissor 会更好吗?如果我这样做(只是好奇,我目前在 PC 上),失去平铺的内存节省会成为移动开发的问题吗?提到了这种方法here
谢谢:)
【问题讨论】:
-
你考虑过使用
GL_QUAD吗?此外,您可以将您的世界划分为块,每个块为 16x16 块。您只需要绘制您正在看到的那个,以及最多 3 个其他块。您可能希望始终在 RAM 中保留 9 个块。 -
即使使用第一个选项,您每帧仅绘制大约 1200 个纹理映射三角形,所以我有点惊讶您遇到帧速率问题。你确定瓶颈不在 CPU 上吗?