我使用GL_DYNAMIC_DRAW指定大型VBO和相应的索引缓冲区。在每个帧中,我通过以下方式更改了一小部分顶点和索引(每个帧中的不同,但只有少数与总缓冲区大小相比):
- 计算两个缓冲区的更改的最小和最大索引
- 使用glMapBufferRange将这些最小 - 最大范围映射到GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT |指定了GL_MAP_UNSYNCHRONICED_BIT
- 将更改写入映射范围的几个子区域
- 为变更的每个子区域调用glFushMappedBufferRange
- 调用glUnmapBuffer
-rendering
我的问题是驱动程序(正确地)最初在VIDEO内存上分配缓冲区,但是当我映射缓冲区时,它正在重新分配SYSTEM HEAP上的(整个)缓冲区并释放VIDEO上的缓冲区,然后再开启直接从系统内存中呈现缓冲区(我通过glDebugMessageCallback看到)。这成为我渲染的瓶颈(PCIe速度很快,但直接从视频内存渲染相同的缓冲区的速度大约是其两倍)。
有没有办法强制驱动程序将缓冲区保留在视频内存上,只将请求的范围映射到主机内存中,并将指定的子区域刷回设备内存? 我在Windows和NVIDIA卡上