使用glMapBuffer的缓冲区是否会分配比glBufferSubData更慢的VRAM?

时间:2017-12-20 02:22:34

标签: c++ opengl graphics

我有一个大数据传输到缓冲区,如VBO或IndirectDrawBuffer,我使用glMapBuffer和glBufferSubData来做到这一点。我发现使用glMapBuffer上传的缓冲区比渲染缓冲区时使用glBufferSubData慢得多。 我像这样分配缓冲区

glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirectDrawBuffer);
glBufferStorage(GL_DRAW_INDIRECT_BUFFER, buffersize, 0, GL_DYNAMIC_STORAGE_BIT);

我像这样使用了glMapBuffer

m_indirectDrawBufferPtr = (GLubyte*)glMapNamedBuffer(m_indirectDrawBuffer, GL_WRITE_ONLY);
memcpy(m_indirectDrawBufferPtr, m_MultidrawCommands.data(), buffersize);
glUnmapNamedBuffer(m_indirectDrawBuffer);

我像这样使用了glBufferSubData

glNamedBufferSubData(m_indirectDrawBuffer, 0, buffersize, m_MultidrawCommands.data());

为什么会发生这种情况?

使用glMapBuffer,我该怎么做才能获得有效的缓冲区?分配2个缓冲区,一个使用glMapBuffer,另一个使用glCopyNamedBufferSubData从第一个缓冲区复制数据,也许是解决这些问题的方法。但它会使用更多的VRAM。这是唯一的方法吗?

1 个答案:

答案 0 :(得分:1)

首先,您不允许映射该缓冲区,因此不清楚您的代码工作原因。当您allocate immutable storage for a buffer时,您必须指定打算如何访问它。并且你没有说你会把它映射为阅读或写作......所以你不能

其次,映射缓冲区是一项相当重要的操作。如果你已经在内存块中有数据,那么映射缓冲区只是为了复制它然后立即取消映射它没有意义。映射允许您将数据直接生成到缓冲区中(理论上),因此用于填充m_MultidrawCommands的任何操作都应该用于直接写入映射缓冲区。

此外,persistent mapping存在,它允许您保持永久映射的缓冲区。当然,这也要求您跟踪使用部分缓冲区的命令,这样您就不会写入可以读取的值。