gpt4 book ai didi

c++ - 带有 glMapBuffer 的 Buffer 会被分配一个比 glBufferSubData 慢的 VRAM 吗?

转载 作者:行者123 更新时间:2023-11-30 05:06:30 24 4
gpt4 key购买 nike

我有大量数据要传输到缓冲区,例如 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 从第一个缓冲区复制数据,也许是解决这些问题的一种方法。但它会使用更多的显存。这是唯一的方法吗?

最佳答案

首先,您不能映射该缓冲区,因此不清楚您的代码为何能正常工作。当你allocate immutable storage for a buffer ,您必须指定您打算如何访问它。而且您没有说要将其映射为读取或写入...所以您不能

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

此外,persistent mapping存在,这允许您永久保留映射的缓冲区。当然,这还需要您跟踪哪些命令正在使用 缓冲区的一部分,这样您就不会写入可能被读取的值。

关于c++ - 带有 glMapBuffer 的 Buffer 会被分配一个比 glBufferSubData 慢的 VRAM 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47897916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com