使用一次时,显示列表是不是比即时模式更好?

Posted

技术标签:

【中文标题】使用一次时,显示列表是不是比即时模式更好?【英文标题】:Are Display Lists better then Immedient Mode when used once?使用一次时,显示列表是否比即时模式更好? 【发布时间】:2013-07-10 07:28:37 【问题描述】:

声明:由于缺少文档,我无法使用任何更新版本的 OpenGL

我想知道哪个更好用,只使用一次的显示列表,还是 OpenGL 中的即时模式。

以此为例:

示例 1:

glBegin(GL_QUADS);
glVertex2f(1.0f, 0.0f);
glVertex2f(1.0f, 1.0f);
glVertex2f(0.0f, 1.0f);
glVertex2f(0.0f, 0.0f);
glEnd();

示例 2:

GLuint quad;
quad = glGenLists(1);
glNewList(quad, GL_COMPILE);

glBegin(GL_QUADS);
glVertex2f(1.0f, 0.0f);
glVertex2f(1.0f, 1.0f);
glVertex2f(0.0f, 1.0f);
glVertex2f(0.0f, 0.0f);
glEnd();

glEndList();
glCallList(quad);

如果我每次更新都执行示例 1 或示例 2(在显示列表的情况下,变量 cube 必须再次编译并提供新顶点),这将是更快?

【问题讨论】:

【参考方案1】:

显示列表的想法是重用以节省进行所有这些调用的开销。构建一个 DL 然后立即调用它,然后立即被丢弃是疯狂的。它只会增加绘制单个事物的开销。

话虽如此,您不应使用显示列表或即时模式。使用顶点数组和 VBO。

【讨论】:

正如免责声明所说,我不能。 OpenGL 头文件或其他 OpenGL 教程专门记录了所需的每个头文件的版本和版本。 @MonetR.Adams:顶点数组并不是什么特别新鲜的东西。它们从 1.1 版开始就已经存在,甚至得到超过 15 年历史的实现的支持。【参考方案2】:

    您的免责声明没有任何意义 - 不要居高临下,您是否尝试过谷歌搜索?这是关于顶点规范的wiki page。您可以仔细阅读 wiki 的其余部分,以查看哪些功能已被弃用以及何时添加了新功能。例如,查看glBindBuffer() 上的页面。说句公道话,确实需要花费一些精力来了解所有 OpenGL 文档 - 许多教程都已经过时了,要找到正确的 PDFs 和 @ 987654324@ 本身可以是一个任务。

    您应该使用最新版本的 OpenGL - 使用 VBO 和 VAO。它们比显示列表和即时模式要好得多。既然可以开蝰蛇,为什么还要在思域和甲壳虫之间争论呢?

    如果你必须知道,速度的答案是:它取决于 OpenGL 的实现。该显示列表非常小,因此显示列表的开销可能高于仅在立即模式下执行。老红皮书1.1explains this whole concept详细介绍。

    您可以尝试分析您的代码以查看哪个运行得更快。这将为您的硬件提供明确的答案。

【讨论】:

【参考方案3】:

由于缺乏文档

完整的opengl函数参考

    OpenGL 4 OpenGL 3.3 OpenGL 2.

Specifications and reference pages.

opengl.org (books, docs, etc)

OpenGL extension wrangler library.

不乏 OpenGL 的文档。您可以找到几乎所有与 OpenGL 相关的文档。

仅使用一次的显示列表,或 OpenGL 中的即时模式。

立即模式。显示列表应该被重复使用,如果你只使用一次显示列表,渲染只会花费更长的时间(99.9% 的确定性)。

【讨论】:

以上是关于使用一次时,显示列表是不是比即时模式更好?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL显示列表比立即模式慢?

MFC使用ListControl时,第一次左键点击ListControl的列表时无法触发NM_CLICK消息,点击第二次时才能触发

为啥随机搜索显示比网格搜索更好的结果?

当动画 UIImage 被分配两次时,UITableViewCell 中的 UIImageView 没有动画

为啥我调用一次时会打印无限值?

Spark 广播变量,只有一个任务使用它