在OpenGL中,缓冲区对象函数(glBufferData、glBufferSubData和其他几个函数)有一个参数usage,文档将其描述为意图使用的提示,这可能是为了帮助实现获得更好的性能。
指定数据存储的预期使用模式。符号常量必须是
GL_STREAM_DRAW、GL_STREAM_READ、GL_STREAM_COPY、GL_STATIC_DRAW、GL_STATIC_READ、GL_STATIC_COPY、GL_DYNAMIC_DRAW、GL_DYNAMIC_READ或GL_DYNAMIC_COPY。 _..._使用是对GL实现的提示,说明如何访问缓冲区对象的数据存储。这使得GL实现能够做出更智能的决策,从而显著影响缓冲区对象的性能。但是,它并不限制数据存储的实际使用。
维基同样含糊不清:
毕竟,这些只是暗示而已。在静态缓冲区创建后修改它,或者永远不修改流缓冲区,这是完全合法的OpenGL代码。 _..._ --这些问题只能通过仔细分析才能回答。即使如此,答案也只能准确地回答来自特定硬件供应商的特定驱动程序版本。
总之,这个参数(如果有的话)有多相关?司机们真的考虑到了吗?如果他们考虑了,在你的经验中,它在实践中会对性能产生多大的影响?你有数据要分享吗?
我编写了一个瘦图形API抽象层,该抽象层将作为现有API中的任何一个实现,因此很容易忽略这个参数,并将其隐藏在公开的抽象中。
发布于 2017-10-11 10:00:24
这将因实现而异,但我所使用的驱动程序确实使用了这些驱动程序,主要用于决定内存布局。这些提示所启用的优化比您想要的要小得多,这主要是因为您可以使用任何提示。例如,如果仅提示读取访问的缓冲区根本无法写入,那么缓存无效化就会便宜得多,但这种优化是不可能的。
一些被广泛用于GPU之间基准比较的著名游戏没有正确地使用这些提示,因此GPU供应商有动机让所有的游戏都使用得更快,即使它们与提示不匹配。
发布于 2017-10-11 08:54:45
从功能上来说,它们是一样的。
驱动程序可以使用它们来区分如何在幕后处理缓冲区。例如,static_draw将被尽快复制到vram中并留在那里,但是stream_read将始终在RAM中有一个op到日期的副本。
这种模糊性是glBufferStorage成为一件事的原因。通过这种方式,您可以指定您希望如何使用缓冲区(无论您是通过BufferSubData更新它,还是通过映射来读取或写入它,映射有多连贯,映射是否可以在不同的用途之间持续存在),并且超出这些边界都是错误的。
https://computergraphics.stackexchange.com/questions/5712
复制相似问题