使用一次时,显示列表是不是比即时模式更好?
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% 的确定性)。
【讨论】:
以上是关于使用一次时,显示列表是不是比即时模式更好?的主要内容,如果未能解决你的问题,请参考以下文章
MFC使用ListControl时,第一次左键点击ListControl的列表时无法触发NM_CLICK消息,点击第二次时才能触发