【问题标题】:What makes glBufferSubData slow on big buffer?是什么让 glBufferSubData 在大缓冲区上变慢?
【发布时间】:2016-02-03 19:54:16
【问题描述】:

我注意到,随着缓冲区大小的增加,更新 V​​BO 中的少量顶点会变得非常缓慢。例如,当我更新 512*512 缓冲区中的 2 个顶点时,比当我更新整个 256*256 缓冲区时要慢得多,尽管更新的数据量完全相反。 这是 glBufferSubData 的正常行为吗?

这就是我分配缓冲区的方式:

glBufferData(GL_ARRAY_BUFFER, sizeof(uiMapView::vertex)*(size + 1)*(size + 1), m_verts, GL_DYNAMIC_DRAW);

这是我更新它的方式:

glBufferSubData(GL_ARRAY_BUFFER, sizeof(uiMapView::vertex)*iMinId, sizeof(uiMapView::vertex)*(iMaxId-iMinId), (&m_verts[iMinId]));

【问题讨论】:

  • 除非给出更多细节,否则这个问题无法回答。缓冲区更新性能将在很大程度上受到缓冲区访问模式、更新频率以及具体实现的影响。 free chapter on Asynchronous Buffer Transfers from the OpenGL Insights book 可能会解释您必须处理的一些问题。
  • @derhass,感谢您提供有用的链接,但这并不是真正的问题

标签: c++ opengl vbo


【解决方案1】:

好吧,我对我的解决方案进行了更多研究,发现 VBO 更新并不是真正的瓶颈。减慢我的程序的原因是对数据进行了大量计算,这显然产生了最大的影响。

所以,实际上,正确的答案是:不,这不是 glBufferSubData 的正常行为。缓冲区大小不会对 glBufferSubData 性能产生如此大的影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2014-07-27
    • 2019-07-19
    • 2012-06-21
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多