显示列表与VAO性能

时间:2013-10-07 03:45:24

标签: performance opengl gpu displaylist vertex-array-object

我最近在渲染引擎中实现了功能,使其能够根据运行时设置将模型编译到显示列表或VAO中,以便我可以将两者相互比较。

我通常更喜欢使用VAO,因为我可以让多个VAO共享实际的顶点数据缓冲区(并且因为它们不被弃用),但我发现它们实际上比我的nVidia上的显示列表更糟糕(GTX 560)硬件。 (无论如何,我想继续支持显示列表以支持旧的硬件/驱动程序,因此保留用于处理它们的代码并没有真正的损失。)

差异不是巨大,但它肯定是可衡量的。例如,在发动机状态的某个点上,我可以使用VAO一致地测量我的绘图循环,以相当一致的平均值,大约10.0毫秒来完成一个循环,我可以切换到显示列表并观察循环时间减少在类似的一致平均值上达到约9.1毫秒。这里,一致意味着一个周期通常偏差小于±0.2 ms,远小于差值。

这些设置之间唯一的变化是普通网格的绘图代码。它改变了VAO代码,其OpenGL调用看起来很简单......

glBindVertexArray(id);
glDrawElements(GL_TRIANGLES, num, GL_UNSIGNED_SHORT, NULL); // Using an index array in the VAO

...到显示列表代码,如下所示:

glCallList(id);

当然,两种代码路径也适用于各种模型,但这种情况完全相同,因此这些应该是唯一的区别。我已明确确定不会在绘制调用之间不必要地解除VAO的绑定,因为这样做也会显着恶化。

这种行为是期待的吗?我原本期望VAO在显示列表时表现更好或至少相同,因为它们更现代,而且不被弃用。另一方面,我一直在网上看到nVidia的实现特别优化了显示列表和所有,所以我想也许他们的VAO实现可能仍然落后。有没有其他人得到的结果与我的相符(或相矛盾)?

否则,我可能做错了吗?在nVidia硬件或一般情况下是否有任何已知情况使VAO的性能比应有的差?

作为参考,我在英特尔高清显卡(Ironlake)上也尝试过相同的差异,结果发现使用VAO的效果与直接从内存中渲染一样,而显示列表则比无论是。我希望我可以试用AMD硬件,但我没有。

0 个答案:

没有答案