首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GL_STATIC_DRAW vs GL_DYNAMIC_DRAW vs GL_STREAM_DRAW:这有关系吗?

GL_STATIC_DRAW vs GL_DYNAMIC_DRAW vs GL_STREAM_DRAW:这有关系吗?
EN

Computer Graphics用户
提问于 2017-10-11 08:31:58
回答 2查看 17.1K关注 0票数 17

在OpenGL中,缓冲区对象函数(glBufferDataglBufferSubData和其他几个函数)有一个参数usage,文档将其描述为意图使用的提示,这可能是为了帮助实现获得更好的性能。

指定数据存储的预期使用模式。符号常量必须是GL_STREAM_DRAWGL_STREAM_READGL_STREAM_COPYGL_STATIC_DRAWGL_STATIC_READGL_STATIC_COPYGL_DYNAMIC_DRAWGL_DYNAMIC_READGL_DYNAMIC_COPY。 _..._使用是对GL实现的提示,说明如何访问缓冲区对象的数据存储。这使得GL实现能够做出更智能的决策,从而显著影响缓冲区对象的性能。但是,它并不限制数据存储的实际使用。

维基同样含糊不清:

毕竟,这些只是暗示而已。在静态缓冲区创建后修改它,或者永远不修改流缓冲区,这是完全合法的OpenGL代码。 _..._ --这些问题只能通过仔细分析才能回答。即使如此,答案也只能准确地回答来自特定硬件供应商的特定驱动程序版本。

总之,这个参数(如果有的话)有多相关?司机们真的考虑到了吗?如果他们考虑了,在你的经验中,它在实践中会对性能产生多大的影响?你有数据要分享吗?

我编写了一个瘦图形API抽象层,该抽象层将作为现有API中的任何一个实现,因此很容易忽略这个参数,并将其隐藏在公开的抽象中。

EN

回答 2

Computer Graphics用户

回答已采纳

发布于 2017-10-11 10:00:24

这将因实现而异,但我所使用的驱动程序确实使用了这些驱动程序,主要用于决定内存布局。这些提示所启用的优化比您想要的要小得多,这主要是因为您可以使用任何提示。例如,如果仅提示读取访问的缓冲区根本无法写入,那么缓存无效化就会便宜得多,但这种优化是不可能的。

一些被广泛用于GPU之间基准比较的著名游戏没有正确地使用这些提示,因此GPU供应商有动机让所有的游戏都使用得更快,即使它们与提示不匹配。

票数 14
EN

Computer Graphics用户

发布于 2017-10-11 08:54:45

从功能上来说,它们是一样的。

驱动程序可以使用它们来区分如何在幕后处理缓冲区。例如,static_draw将被尽快复制到vram中并留在那里,但是stream_read将始终在RAM中有一个op到日期的副本。

这种模糊性是glBufferStorage成为一件事的原因。通过这种方式,您可以指定您希望如何使用缓冲区(无论您是通过BufferSubData更新它,还是通过映射来读取或写入它,映射有多连贯,映射是否可以在不同的用途之间持续存在),并且超出这些边界都是错误的。

票数 7
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/5712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档