在 TriangleStrip 和 TriangleList 之间,哪一个执行得更快?
我刚刚读到的一些有趣的东西说:“我使用三角形列表的方法得到了大约 780fps,而使用三角形条的方法只有 70fps”。我没有关于他到底在做什么的详细信息,但据此,他使用 TriangleList 获得了大约 10 倍的帧速率。我发现这违反直觉,因为该列表包含更多顶点数据。
有谁知道为什么 TriangleList 可能比 Strip 快得多的技术原因?
在 TriangleStrip 和 TriangleList 之间,哪一个执行得更快?
我刚刚读到的一些有趣的东西说:“我使用三角形列表的方法得到了大约 780fps,而使用三角形条的方法只有 70fps”。我没有关于他到底在做什么的详细信息,但据此,他使用 TriangleList 获得了大约 10 倍的帧速率。我发现这违反直觉,因为该列表包含更多顶点数据。
有谁知道为什么 TriangleList 可能比 Strip 快得多的技术原因?
三角带是内存优化,而不是速度优化。在过去的某个时候,当系统内存和视频内存之间的总线带宽是数据密集型应用程序的主要瓶颈时,是的,它也可以节省时间,但这种情况已经很少见了。此外,旧硬件中的转换缓存非常小,因此普通条带缓存比优化不佳的索引列表更好。
三角形列表可以与三角形条带相同或更有效的原因是索引。鉴于您正在正确优化几何图形和三角形顺序,索引让硬件以一种非常可见的方式转换和缓存顶点。此外,在需要大量退化三角形的非常复杂的网格中,条带将比索引列表更慢并且占用更多内存。
我必须说我有点惊讶你的例子显示了一个数量级的差异。
三角形列表可以比条带快得多,因为它通过轻松地将顶点数据批处理在一起来节省绘制调用。绘图调用很昂贵,因此使用条带节省的内存有时不值得降低性能。
索引三角形列表通常会赢..
这是一个简单的规则。计算您将上传到显卡的顶点数。如果三角形列表(准确地说是索引三角形列表)的顶点少于与三角形带相同的数据,那么它可能会运行得更快。
如果在这两种情况下顶点的数量非常接近,那么条带可能会运行得更快,因为它没有索引列表的开销,但我希望这也是特定于驱动程序的。
Non-Indexed triangle lists are almost always worst case (3 verts per triangle, no sharing) unless you are just dealing with disjoint quads which will also cost 6 verts per quad using degenerate stripping. In that case, you get each quad for 4 verts with indexed triangle lists so it probably wins again but you'd want to test on your target hardware I think.