首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL:缓冲区对象性能问题

OpenGL:缓冲区对象性能问题
EN

Stack Overflow用户
提问于 2010-07-07 15:55:38
回答 2查看 664关注 0票数 3

我有一个与Buffer对象性能相关的问题。我已经使用标准顶点数组(非交错)渲染了一个网格,我想将其更改为Buffer Object以获得一些性能提升。当我引入buffers对象时,当我发现使用Buffers对象会降低四倍的性能时,我震惊了。我认为buffers应该可以提高性能。这是真的吗?所以,我想我做错了什么。

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

谢谢,

EN

回答 2

Stack Overflow用户

发布于 2010-07-07 21:58:57

尝试使用GL_MODELVIEW/GL_TEXTURE矩阵移动顶点/纹理坐标,而不使用缓冲区数据(仅使用GL_STATIC_DRAW)。例如,如果瓷砖的大小是1x1,创建rect (0,0)-(1,1),并用glTranslate设置它在世界上的位置。纹理坐标也是如此。

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

票数 2
EN

Stack Overflow用户

发布于 2010-07-08 05:35:30

如果您需要更新每个帧的缓冲区,则应该使用GL_STREAM_DRAW (这表明缓冲区内容可能只使用一次)而不是GL_DYNAMIC_DRAW (这表明它们将在更新之前使用几次)。就我的经验而言,使用GL_STREAM_DRAW创建的缓冲区将被类似于普通的ol数组,因此在使用它时,您应该期望与数组具有相同的性能。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3192847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档