在现代GPU上组织顶点数据的最高效方式


9

说我有顶点组成的模型,每一个positionnormaltangent,和texcoord属性,其中三角形由指数三元规定。

如果我们只关注顶点属性,那么我知道两种广泛的策略:数组的结构和结构的数组。我还听说结构数组是首选的,因为它会增加给定顶点的属性的内存局部性(并因此增加高速缓存局部性)。

确实可以提高性能吗?我能想到的主要方式是通过顶点索引,该索引要求光栅化器获取早已从缓存中逐出的顶点数据。如果像这样的顶点数据访问是随机的,那么将顶点的所有属性都保留在同一缓存行上肯定会使事情变得更快,但这不是可以通过优化三角形规格的顺序来最大程度缓解的问题吗?

此外,据我了解,现代GPU在解压缩相同类型的长矢量上可能比许多类型的结构的矢量更好。如果优化了索引顺序,那么数组结构布局是否可以始终胜过相同顶点数据的结构数组布局?


4
您不能简单地尝试一下,看看哪种情况最适合您的情况?
user1118321 '18

我曾想过,对于索引网格来说,结构数组会更有效,因为顶点着色器将获得所有顶点属性,因此将它们组合到内存中将对缓存更友好。
PaulHK

根据结构中的数据类型,vec4和float会很好地组合在一起,其他类型则不太好
PaulHK

2
@ user1118321虽然单个基准测试实验是值得称赞的实践,但在更广泛的理论讨论中当然还有更多的长期价值,并且可能会基于顶点牵引硬件的工作原理而建立通用实践。
克里斯蒂安·劳

Answers:


2

抱歉,我要在您的问题线程中添加一条评论,但发现我最终花了太多精力。我的开发经验是从DX 11角度出发的,因此其中某些可能无法在OpenGL中使用

数据的存储位置当然起着重要的作用。但是,还有其他一些因素会影响数据的宽度,如您所知。我有一些GPU,并且在某些临界点的基础上,性能却出现了明显下降。举例来说,例如,在我的旧AMD r290上,您基本上可以将最多4个float4s传递到顶点缓冲区,而不会花费超过1的额外费用,但是一旦我发布> 4,则存在可测量的下降(帧内)率)。这纯粹是我的回忆,所以轶事也是最好的。但是它认为GPU架构一直在变化,今天能为您带来性能优势的利基技术可能是明天性能的祸根。一世'

话虽如此,您已经提出了有关对顶点进行排序的问题,当然这会有所帮助。当您将其与索引缓冲区结合使用时,性能将得到提高,从而使硬件能够优化和缓存已计算的顶点。当然,您可以从三角条等中获得更多收益,这些三角条可以根据您的想法专门订购。我所做的大多数模型渲染都是带有实例化的基于索引/顶点的优化模型,我对循环运动效果(例如,树枝)使用少量查找,在这些情况下,树的整个分支都在查找相同的值。因此缓存也可以在这里利用。

我可以总结一下:

  • 在开始开发游戏/应用程序时,请不要一开始就考虑过优化,不要过早优化。如果您需要返回并添加新功能,则可能会花费所有精力。您有我的习惯,也许> <,喜欢尝试获得最佳性能和技术
  • GPU架构各不相同,一个架构的优势可以反映另一个架构的劣势。AMD和Nvidia以使开发人员针对其架构优化游戏而闻名,这在一定程度上有其优点/缺点。在开发中走一条中间路可能是最好的地方,不要使用任何基于硬件供应商的功能(此处有意见)。(此外,某些打包格式仅在AMD中存在)。

这些只是我的一些想法和经验。那里有很多书,您应该着手解决这些主题。我还没有看到很多规定您要提出的建议,但这并不意味着错误。祝好运。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.