在运行时只更新大型OpenGL VBO的一部分而没有延迟

时间:2014-03-20 13:21:24

标签: c++ performance opengl vbo

我正在尝试更新OpenGL中的大型VBO,其中包含大约4,000,000个浮点数,但我只需要更新正在发生变化的元素(<1%),这需要在运行时进行。

我已经预先计算了需要更改的索引,但由于它们在整个VBO中被分段,我必须使用适当的索引偏移发送1000个单独的glBufferSubDataARB调用(我不确定这是否是一个问题)< / p>

我已将VBO设置为使用STREAM_DRAW_ARB,因为VBO的更新每5秒发生一次。

即使我只更新了VBO中的1000个对象(因此大约有16,000个浮点数分布在1000个调用中),我注意到一个很小但很明显的延迟。

我相信这可能是由于VBO被用于绘图而正在更新,因为我听说这会导致延迟。当您更新整个VBO时,我只知道此问题的解决方案 - 例如:OpenGL VBO updating data

然而,因为我的VBO太大了,我认为每5秒发送4,000,000个数据元素会慢得多,并占用大量的CPU-GPU带宽。所以我想知道是否有人知道如何避免VBO等待GPU完成更新它按照我的方式进行更新 - 在VBO上分段,更新了大约一千个电话。

无论如何,以下是我的代码的一部分,它每5秒更新一次缓冲区,通常大约有16,000个浮动的4,000,000个存在(但正如我所说,使用大约1000个调用)。

for(unsigned int kkkk = 0;kkkk < surf_props.quadrant_indices[0].size();kkkk++)
{
temp_surf_base_colour[0] = surf_props.quadrant_brightness[0][kkkk];
temp_surf_base_colour[1] = 1.0;
temp_surf_base_colour[2] = surf_props.quadrant_brightness[0][kkkk];
temp_surf_base_colour[3] = 1.0;
temp_surf_base_colour[4] = surf_props.quadrant_brightness[0][kkkk];
temp_surf_base_colour[5] = 1.0;
temp_surf_base_colour[6] = surf_props.quadrant_brightness[0][kkkk];
temp_surf_base_colour[7] = 1.0;
temp_surf_base_colour[8] = surf_props.quadrant_brightness[0][kkkk];
temp_surf_base_colour[9] = 1.0;
temp_surf_base_colour[10] = surf_props.quadrant_brightness[0][kkkk];
temp_surf_base_colour[11] = 1.0;
temp_surf_base_colour[12] = surf_props.quadrant_brightness[0][kkkk];
temp_surf_base_colour[13] = 1.0;
temp_surf_base_colour[14] = surf_props.quadrant_brightness[0][kkkk];
temp_surf_base_colour[15] = 1.0;

glBindBufferARB(GL_ARRAY_BUFFER_ARB, vb_colour_surf);       
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB,  sizeof(GLfloat) * ((numb_surf_prims * 4) + surf_props.quadrant_indices[0][kkkk] * 16)), sizeof(GLfloat) * 16, temp_surf_base_colour);  
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
}

0 个答案:

没有答案