使用displaylist有什么好处?

时间:2012-11-29 06:28:56

标签: opengl

我无法清楚地理解置换列表。例如,如果我想绘制具有复杂光的场景,并且可能更改场景中对象使用的材质。设置材料的速度可能很低,所以我可以将材料的定义放在displaylist中。那么使用displaylist有什么好处呢?

1 个答案:

答案 0 :(得分:4)

显示列表基本上是宏录制器/播放器。在编译显示列表时,OpenGL实现将发送给它的所有命令记录到一个单个对象中。不幸的是,显示列表使用起来有点麻烦。例如,显示列表存储传递给纹理对象的数据(它们曾经用作OpenGL-1.0中的纹理存储,大约1992年,在引入纹理对象之前),但它们不会存储通过顶点数组绘制的几何数据。

通过显示列表获得的任何性能增益都归因于(GPU侧)顶点阵列允许的批量立即模式调用的可能性。使用顶点缓冲区对象时,显示列表的使用已过时。这大概是在2000左右。显示列表的唯一剩余用途是封装OpenGL状态设置,这是有用的,因为设置保持固定功能管道的状态书是相当繁琐的。自从OpenGL完全着色器以来,固定功能状态的大部分也变得过时了。今天你通过调用大量的OpneGL状态调用(或一个glCallLists)来完成你所做的事情,只需为手头的任务选择正确的着色器程序即可。

自从显示列表完全过时并且没有可行的性能提升。

值得注意的是,GPU不执行OpenGL边矩阵数学运算(glLoadIdentity,glTranslate,glRotate等)。矩阵由驱动程序准备,然后上传到GPU。显示列表只存储准备好的矩阵并上传它。但从带宽和性能的角度来看,自己调用glUniform / glLoadMatrix或者使用显示列表触发代码路径没有区别。所以Khronos做了合理的事情并从任何现代OpenGL版本和变体中删除了显示列表。

TL; DR:当顶点缓冲区对象无法将几何体放入快速内存并将较大的OpenGL状态集编译为单个名称时,显示列表曾经是一个有用的工具。在现代OpenGL显示列表中,不再提供优势,只会增加驱动程序的大小和复杂性,因此显示列表已从现代OpenGL变体中删除。