原始装配性能

Posted

技术标签:

【中文标题】原始装配性能【英文标题】:Primitive assembly performance 【发布时间】:2015-02-21 08:54:25 【问题描述】:

我目前正在尝试一些地形/高度图渲染。该地形的每个图块都使用 VBO 和 IBO 进行渲染。为了能够轻松绘制子图块,我使用 Morton 编码对索引进行排序,此时我想到了一些关于原始组装的问题。

原始组装发生在顶点处理之后,但是

    GPU 如何知道要处理哪些顶点?也许其中一些没有被索引。他们还会得到处理吗? GPU 如何知道必须按什么顺序处理顶点?也许三角形使用 VBO 的第一个和最后一个顶点,所以原始组装阶段必须等到整个 VBO 处理完毕?

【问题讨论】:

【参考方案1】:

GPU 如何知道要处理哪些顶点?也许其中一些没有被索引。他们还会得到处理吗?

您的索引缓冲区和绘图调用中的顶点范围决定了处理哪些顶点,并定义了图元组装期间的使用顺序。任何未包含在该顶点/索引范围内的顶点都不需要处理。

GPU 如何知道必须按什么顺序处理顶点?也许三角形使用了 VBO 的第一个和最后一个顶点,所以原始组装阶段必须等到整个 VBO 处理完毕?

被处理的顺序顶点在你到达原始装配时并不是特别重要;在顶点着色器级别没有顺序依赖性(据您所知,顶点可能已经全部并行处理)。您只需要知道顶点着色器的结果会附加到一个称为转换后缓存的特殊缓冲区中。

几何着色器(可编程原始程序集)将从转换后的缓存中获取其输入顶点,并以特定顺序执行。给定转换后缓存的传统 FIFO 实现,顺序决定缓存替换,基于条带的基元倾向于在基元组装期间最大化缓存命中率。转换后缓存中的缓存未命中会导致停顿,但仅限于不在缓存中的顶点 - 当您的顶点缓冲区中的每个顶点都被不必要地处理时,它不会停顿。

好消息是,如今大多数建模软件都以缓存有效的顺序输出顶点,而且缓存比以往任何时候都更大、更智能,所以这不是您经常需要担心的事情。 15 年前,顶点缓存是一个非常热门的话题,与您交谈的每个人都会有自己的理论来说明什么是最有效的,现在这在很大程度上是在浪费时间,而条带顺序可能就是您想要的。

【讨论】:

以上是关于原始装配性能的主要内容,如果未能解决你的问题,请参考以下文章

如果仅用于原始 sql,SQLAlchemy 的性能?

原始数据类型的性能 VS 它们的 Wrapper 类

Django QuerySet 与原始查询性能

与原始 sql 相比,Django ORM 性能较差

Java中的高性能原始数组构建器

iOS 11.3确认可以恢复旧iPhone上的原始性能