三角形列表与三角形条带

12

在TriangleStrip和TriangleList之间,哪个执行速度更快?

我刚读到一些有趣的事情:“我的使用TriangleList方法得到了约780fps的结果,而只使用TriangleStrip的方法只得到了70fps”。我不知道他具体是在做什么,但根据这个说法,他使用TriangleList能够获得大约10倍的帧率。我发现这很反直觉,因为该列表包含更多顶点数据。

是否有人知道TriangleList为什么比Strip快得多的技术原因?

3个回答

12

三角形带是一种内存优化,而不是速度优化。在过去,当系统内存和视频内存之间的总线带宽是数据密集型应用程序中的主要瓶颈时,使用三角形带可以节省时间,但现在这种情况非常罕见。此外,在旧硬件中,变换缓存非常小,因此普通带比糟糕优化的索引列表更容易被缓存。

三角形列表之所以能与三角形带同样或更有效率,是由于索引。索引让硬件以非常可预测的方式转换和缓存顶点,前提是您正确地优化几何体和三角形顺序。另外,在需要大量退化三角形的复杂网格中,带将比索引列表更慢,并且占用更多的内存。

尽管如此,我还是有些惊讶你的例子显示了数量级的差异。


1
谢谢你的回答。我也很惊讶在他的测试中看到这两者之间帧率巨大的差异。 - Joseph Lormand
3
没有理由它应该快10倍。我认为他做错了什么。 - Robinson
1
@Joseph 我同意 Robinson 的看法。这里可能有些问题。也许你应该仔细检查一下测试,并确保两个测试使用相同的流方法(glVertex、缓冲区对象等)。 - Coincoin

6
三角形列表比带状图快得多,因为它通过轻松地批处理顶点数据来节省绘制调用。绘制调用很昂贵,因此使用带状图节省的内存有时不值得降低性能。

2
索引三角形列表通常会表现更好。简单的规则是:计算您要上传到图形卡的顶点数量。如果三角形列表(确切地说是索引三角形列表)的顶点少于同样数据的三角形带,则可能会运行得更快。如果两种情况下的顶点数非常接近,则可能条带运行得更快,因为它没有指标列表的开销,但我认为这也是特定于驱动程序的。非索引三角形列表几乎总是最坏的情况(每个三角形3个顶点,没有共享),除非您只处理不相交的四边形,这也将使用退化拼接每个四边形的6个顶点。在这种情况下,使用索引三角形列表可以获得每个四边形的4个顶点,因此它可能会再次获胜,但我认为您需要在目标硬件上进行测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接