Performance OpenGL平铺渲染:最有效的方法?

Performance OpenGL平铺渲染:最有效的方法?,performance,opengl,graphics,2d,Performance,Opengl,Graphics,2d,我正在创建一个基于瓷砖的2D游戏,作为学习基本“现代”OpenGL概念的一种方式。我在OpenGL 2.1中使用着色器,并且熟悉渲染管道以及如何在屏幕上实际绘制几何体。我想知道的是组织tilemap以快速高效地渲染的最佳方法。我想到了几种可能的方法: 1.)将表示单个瓷砖(顶点和纹理坐标)的四边形存储在VBO中,并使用单独的draw*调用渲染每个瓷砖,将其转换到屏幕上的正确位置,并使用uniform2i给出该特定瓷砖在纹理图集中的位置 2.)使用BufferSubData在每一帧更新瓷砖,但使用

我正在创建一个基于瓷砖的2D游戏,作为学习基本“现代”OpenGL概念的一种方式。我在OpenGL 2.1中使用着色器,并且熟悉渲染管道以及如何在屏幕上实际绘制几何体。我想知道的是组织tilemap以快速高效地渲染的最佳方法。我想到了几种可能的方法:

1.)将表示单个瓷砖(顶点和纹理坐标)的四边形存储在VBO中,并使用单独的
draw*
调用渲染每个瓷砖,将其转换到屏幕上的正确位置,并使用
uniform2i
给出该特定瓷砖在纹理图集中的位置

2.)使用
BufferSubData
在每一帧更新瓷砖,但使用单个
draw*
调用,保留一个包含屏幕上每个瓷砖的VBO(已计算的屏幕坐标和纹理图集坐标)

3.)保持VBO包含静态NxN“块”瓷砖,但绘制许多块瓷砖至少在屏幕上部分可见,并将它们转换到相应位置

*如果可能的话,我不想使用最后一个选项,除非64x64块的渲染效率不是很低。分片以这种大小的块加载到内存中,即使屏幕上一次只能看到约20x40个分片,我也必须一次渲染多达四个分片。这种方法还会在其他几个方面使我的代码复杂化


那么,哪种方法是渲染瓷砖屏幕最有效的方法?有更好的方法吗?

你可以做其中任何一种,它们可能都很好;你打算渲染的东西非常非常简单

#1在原则上肯定比其他选项更糟糕,因为您将绘制许多非常简单的“模型”,而不是让GPU在一次绘制调用中执行大量批处理工作。然而,如果您一次只能在屏幕上看到20×40=800个平铺,那么对于任何现代CPU和GPU来说,这都是微不足道的工作量(除非您正在做一些疯狂的片段着色器)


我建议你选择最简单的程序,这样你就可以继续游戏了。我想这可能是1,也可能是2如果您发现自己出现性能问题,请选择#2或#3(64×64听起来像一个很好的块大小)中的任何一个,这样您就可以在程序的绘图部分(即更新缓冲区)上花费最少的CPU时间。

我最近通过Android上的OpenGL ES 2.0学习现代OpenGL。OpenGL ES 2.0编程指南建议使用“结构数组”,即

“将顶点属性一起存储在单个缓冲区中。该结构表示一个顶点的所有属性,每个顶点都有一个属性数组。”


虽然这看起来可能会在最初消耗大量空间,但它允许使用VBOs进行高效渲染,并允许灵活地对每个瓷砖进行纹理映射。最近,我在Droid2上使用包含顶点、法线、颜色和纹理数据的交错数组为20x20平铺六边形网格制作了一个平铺六边形网格。到目前为止,一切进展顺利

好的,在对“批处理”做了进一步的研究之后,我想我会选择#2。谢谢你的回答!