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