使用glMapBuffer的缓冲区是否会分配比glBufferSubData更慢的VRAM?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用glMapBuffer的缓冲区是否会分配比glBufferSubData更慢的VRAM?相关的知识,希望对你有一定的参考价值。
我有一个大数据要传输到缓冲区,如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。这是唯一的方法吗?
首先,您不允许映射该缓冲区,因此不清楚为什么您的代码正在运行。当你allocate immutable storage for a buffer时,你必须指定你打算如何访问它。你并没有说你会把它映射成阅读或写作......所以你不能。
其次,映射缓冲区是一项相当重要的操作。如果你已经在一块内存中有数据,那么映射缓冲区只是为了复制它然后立即取消映射就没有意义了。映射允许您直接将数据生成到缓冲区中(理论上),因此用于填充m_MultidrawCommands
的任何操作都应该用于直接写入映射缓冲区。
此外,persistent mapping存在,它允许您保持永久映射的缓冲区。当然,这还要求您跟踪使用缓冲区的哪些命令,这样就不会写入可以读取的值。
以上是关于使用glMapBuffer的缓冲区是否会分配比glBufferSubData更慢的VRAM?的主要内容,如果未能解决你的问题,请参考以下文章