即使所有数据频繁变化,VBO也能提升性能

时间:2011-07-21 15:55:17

标签: opengl

我正在做一个基于2D回合的RTS游戏,使用32x32平铺(每帧400-500个平铺)。我可以使用一个VBO,但我可能不得不每帧更改几乎所有的VBO数据,因为背景是滚动的,每次地图滚动时可见的瓷砖都会改变。使用VBO而不是客户端顶点阵列仍然会在这里产生性能优势吗?另外,如果使用哪种数据格式最有效的VBO(float,或int16,或......)?

2 个答案:

答案 0 :(得分:8)

如果只是滚动,可以使用顶点着色器来操纵位置,而不是更新顶点本身。将“滚动”值作为制服传递给您的背景,只需将该值添加到每个顶点的x(或y或适用于您的情况的任何值)。

更新

如果您打算经常修改VBO,可以使用usage的{​​{1}}参数告诉驱动程序。此页面详细描述了其工作原理:http://www.opengl.org/wiki/Vertex_Buffer_Object,在访问VBO下。在您的情况下,您应该将glBufferData指定为GL_DYNAMIC_DRAW,以便驱动程序将您的VBO放在内存中应用程序的最佳位置。

答案 1 :(得分:2)

常规方法是移动相机并执行剔除,而不是更新VBO的内容。对于2D游戏剔除将使用简单的矩形交叉算法,无论如何你将需要在游戏中进行单位选择。作为奖励,操纵相机将允许对相机进行评级并放大和缩小。您还可以将多个图块(4,9或16)组合到一个VBO中。

我强烈建议不要写逻辑来移动瓷砖而不是相机。它会花更长的时间,有更多的错误,而且灵活性会降低。

格式取决于您在VBO中存储的数据。如果有疑问,只需使用uint8作为颜色,使用float32作为其他一切。虽然对于2D游戏,你的VBO或顶点阵列与3d应用程序相比会非常小,所以VBO不太可能产生任何差异。