【问题标题】:OpenGL: Buffer object performance issueOpenGL:缓冲区对象性能问题
【发布时间】:2010-07-07 07:55:37
【问题描述】:

我有一个关于 Buffer 对象性能的问题。我使用标准顶点数组(未交错)渲染了一个网格,我想将其更改为缓冲区对象以获得一些性能提升。当我介绍缓冲区对象时,当我发现使用 Buffers 对象会降低性能四倍时,我感到很震惊。我认为缓冲区应该提高性能。是真的吗?所以,我认为我做错了什么......

我已经渲染了 3d 平铺地图,为了减少所需的内存量,我只使用单个平铺(顶点集)来渲染整个地图。我只更改地图每个图块的顶点位置的纹理坐标和 y 值。位置和纹理坐标的缓冲区是使用 GL_DYNAMIC_DRAW 参数创建的。索引缓冲区是使用 GL_STATIC_DRAW 创建的,因为它在地图渲染期间不会更改。因此,对于每个地图缓冲区,至少映射和取消映射一次。我应该只对纹理坐标和位置使用一个缓冲区吗?

谢谢,

【问题讨论】:

    标签: opengl


    【解决方案1】:

    尝试使用GL_MODELVIEW/GL_TEXTURE 矩阵移动您的顶点/纹理坐标,并保留缓冲区数据(仅GL_STATIC_DRAW)。例如如果 tile 的大小为 1x1,则创建 rect (0, 0)-(1, 1) 并使用glTranslate 设置它在世界中的位置。与纹理坐标相同。

    VBO 并不是为了提高绘制几个四边形的性能。当使用着色器绘制具有数千个多边形的网格时,可以看到它们的真正威力。如果您不需要与较新的 opengl 版本的任何前向兼容性,我认为使用它们来绘制动态变化的数据几乎没有什么用处。

    【讨论】:

    • 好的,谢谢。是的,我正在考虑使用纹理矩阵来移动纹理坐标。我还使用 GL_MODELVIEW 移动顶点坐标,但我需要更改每个顶点的一个值(y 值)以将其调整为地面高度。顺便说一句,这比几个四边形还要多。 ;)
    【解决方案2】:

    如果您需要在每帧更新缓冲区,您应该使用 GL_STREAM_DRAW(暗示缓冲区内容可能只使用一次)而不是 GL_DYNAMIC_DRAW(暗示它们将被使用但之前使用过几次正在更新)。 就我的经验而言,使用 GL_STREAM_DRAW 创建的缓冲区的处理方式与普通 ol' 数组类似,因此您在使用它时应该期望与数组大致相同的性能。

    还要确保调用 glMapBuffer 时将访问参数设置为 GL_WRITE_ONLY,假设您不需要读取缓冲区的内容。否则,如果缓冲区在视频内存中,则必须将其从视频内存传输到主内存,然后再返回(嗯,这实际上取决于驱动程序......)对于每个地图调用。通过总线传输大量数据是一个非常容易遇到的非常实际的瓶颈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      相关资源
      最近更新 更多