是什么让 glBufferSubData 在大缓冲区上变慢?
What makes glBufferSubData slow on big buffer?
我注意到随着缓冲区大小的增加,更新 VBO 中的少量顶点变得非常缓慢。例如,当我更新时,比如说,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]));
好吧,我对我的解决方案进行了更多研究,发现 VBO 更新并不是真正的瓶颈。使我的程序变慢的原因是对数据进行了大量计算,显然影响最大。
所以,实际上,正确的答案是:不,这不是 glBufferSubData 的正常行为。缓冲区大小不会对 glBufferSubData 性能产生如此大的影响。
我注意到随着缓冲区大小的增加,更新 VBO 中的少量顶点变得非常缓慢。例如,当我更新时,比如说,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]));
好吧,我对我的解决方案进行了更多研究,发现 VBO 更新并不是真正的瓶颈。使我的程序变慢的原因是对数据进行了大量计算,显然影响最大。
所以,实际上,正确的答案是:不,这不是 glBufferSubData 的正常行为。缓冲区大小不会对 glBufferSubData 性能产生如此大的影响。