调用glCopyNamedBufferSubData和glNamedBuffer SubData后出现OpenGL警告



我收到以下警告:

CCD_ 1。

我用glNamedBufferStorage分配这个缓冲区。我用glCopyNamedBufferSubData将数据从另一个缓冲区(以相同方式分配(复制到它中,然后用glNamedBufferSubData更新它的一些数据。这给了我一个警告。我不使用映射。只是这些功能。(使用OpenGL4.5。卡是NVidia。(

到目前为止,我无法用一些最小的代码重现这个警告,但它始终存在。经过搜索,我发现收到这条消息的人使用了某种缓冲区映射。在我的情况下,是什么导致了这个警告?我如何才能找到更多关于它的原因的信息?

编辑:

最小可重复性示例:

GLuint test_buffer_1_ID;
GLuint test_buffer_2_ID;
glCreateBuffers(1, &test_buffer_1_ID);
glCreateBuffers(1, &test_buffer_2_ID);
UByte data_source[100];
const GLbitfield flags = GL_DYNAMIC_STORAGE_BIT;
glNamedBufferStorage(test_buffer_1_ID, 100, data_source, flags);
glNamedBufferStorage(test_buffer_2_ID, 100, data_source, flags);
glCopyNamedBufferSubData(
test_buffer_1_ID,
test_buffer_2_ID,
0,
0,
10
);
glNamedBufferSubData(
test_buffer_2_ID,
0,
10,
data_source
);

调用glNamedBufferSubData时会出现警告。如果我指定源数据glNamedBufferStorage或给它nullptr没有区别。如果我先调用SubData然后再复制,或者只调用SubData,则没有警告。

由于人们过去经常滥用和错误描述缓冲区对象,实现者基本上被迫根据的使用方式来移动缓冲区存储,而不是说它将如何使用。

你说你的缓冲区会被CPU填满(否则你不能在上面使用BufferSubData(。但是,如果你从CPU中放入足够多的东西,驱动程序会认为你这么做是认真的。因此,它将把存储器转移到CPU可直接访问的存储器上,这样的拷贝会更便宜。可能以读取性能为代价。

如果你频繁地更新缓冲区的存储,以至于触发了这种情况,那么最好只是持久地映射它,并在需要时写入。当然,你现在必须管理同步,但如果性能对你很重要,你无论如何都应该这样做。

相关内容

  • 没有找到相关文章

最新更新