2012-05-10 36 views
0

我正在阅读Nehe OpenGL教程,并有一个关于显示列表的教程。是否有任何理由使用它而不是“类和对象”方式?例如,创建类的立方体,然后只是简单地写cube.render(x,y,z); ?Opengl - 显示列表与OOP

回答

3

想法是利用硬件和板载显示列表处理。基本上,你会在图形处理器的内存中创建显示列表,然后通过发送一个命令来显示整个列表,而不是在每次显示对象时重新发送所有坐标。这可以大幅降低CPU与GPU之间的带宽需求。

实际上,它在很大程度上依赖于您正在使用的硬件和OpenGL实现。通过一些实现,显示列表可以帮助您大幅提升性能 - 但在其他实施中,它基本上没有任何优势。

1

我在阅读Nehe OpenGL教程,并且有关于显示列表的教程。

我建议停止阅读讷河。我从来没有见过任何与Ne和相关的东西在stackoverflow上被提及,而我看到的教程使用了太多的特定于平台的API。

取代NEHE,转到OpenGL.org并检查“书籍”部分。或者,第一版“OpenGL红皮书”可在glprogramming.com处获得。虽然它不包含OpenGL 4中的最新API,但通过“兼容性配置文件”,即使在最新版本的OpenGL中,所有可用的方法仍然可用。

是否有任何理由使用它来代替“类和对象”的方式?

你混淆了两个不同的概念。显示列表是OpenGL的方式来保存OpenGL调用序列,以便以后可以快速“召回”它们。取决于OpenGL的实现,它可能会提高应用程序的性能。显示列表的使用与您的程序(OOP)的内部组织无关。您可以使用OOP并仍使用cube.render()中的显示列表。或者你可以使用顶点缓冲对象或任何你想要的。或者你可以使用“非OOP”风格并仍然使用显示列表。

1

显示列表是在GPU级别预编译的。 您自己的渲染功能是在CPU级别编译的,其各个命令在运行时仍需要通过GPU。

这就像比较“存储过程”与调用内联SQL的自定义函数。 编译存储过程并在服务器端生成执行计划,而自定义函数仅在客户端组件中编译。 “

+0

”显示列表在GPU级别预编译。“不正确,这是不能保证的。存储显示列表的位置以及特定实现的方式,并未在OPenGL标准中定义。请阅读标准。 – SigTerm

+1

@SigTerm:OpenGL标准中的任何内容都不能保证在GPU或CPU上运行。但是这个答案清楚地说明了它是如何完成的*。所以,从我+1。 – ybungalobill