当尝试使用glBufferSubData访问GL_ARRAY_BUFFER到128字节的缓冲区大小时,访问最多需要200微秒。相反,当使用glBufferData再次分配整个缓冲区时,只需要3微秒。我使用glGetBufferSubData时也有类似的问题。我的CPU是i5 8600k,GPU是gtx 1080 ti
glBufferData(GL_ARRAY_BUFFER, sizeof(mat4) * 2, matrices.data(), GL_DYNAMIC_DRAW); // 3 us
glBufferSubData(GL_ARRAY_BUFFER, sizeof(mat4) * index, sizeof(mat4), matrix.data()); // at worst 200 us
using namespace std::chrono;
// same measurement for both cases
auto timer = high_resolution_clock::now();
glBufferData(GL_ARRAY_BUFFER, sizeof(mat4) * 2, matrices.data(), GL_DYNAMIC_DRAW);
std::cout << duration_cast<microseconds>(high_resolution_clock::now() - timer).count() << '\n';
1条答案
按热度按时间zdwk9cvp1#
这个问题可能早就该回答了,但今天我在考虑使用glGetBufferSubData时发现,尽管运行了和NVidia GEFORCE RTX 3060,但还是有一点延迟。将数据下载到CPU/RAM需要0.006秒,加载到GPU需要0秒。我建议在RAM中保留一份矩阵的副本,并将矩阵所在位置的索引存储在着色器存储缓冲区中,以便您可以在以后的程序中更新它。至少我正在这么做。
你可以在这里看到我的原始帖子:将矩阵下载到CPU/RAM进行更新并将其发送回GPU是否高效?