3

首先,我知道显示列表在 OpenGL 3.0 中已被弃用并在 3.1 中被删除。但是我仍然必须在这个使用 OpenGL 2.1 的大学项目中使用它们。

我在显示列表上阅读的每篇文章或教程都将它们用于多次绘制的某种对象,例如树木。为单个对象创建一个列表有什么问题吗?

例如,我有一个建筑物的对象(.obj 格式)。这个特定的建筑只画了一次。对于基本性能分析,我在窗口标题栏上有当前的每秒帧数。

这样做:

glmDraw(objBuilding.model, GLM_SMOOTH | GLM_TEXTURE);

我得到大约 260 FPS。如果您不了解 GLM 库,则该glmDraw函数基本上会进行大量glVertex调用。

但是这样做:

glNewList(gameDisplayLists.building, GL_COMPILE);
    glmDraw(objBuilding.model, GLM_SMOOTH | GLM_TEXTURE);
glEndList();

glCallList(gameDisplayLists.building);

我得到大约 420 FPS。当然,屏幕刷新率不会刷新那么快,但就像我说的,它只是衡量性能的一种简单而基本的方法。

它对我来说看起来好多了。

当我有一些重复多次的对象时,我也会使用显示列表,比如防御塔。同样,对单个对象执行此操作是否有任何问题,或者我可以继续执行此操作吗?

4

1 回答 1

1

为这些东西使用显示列表非常好,在顶点数组出现之前,它们是在快速内存中放置几何图形的事实标准。放置显示列表有一些有趣的陷阱。例如在 OpenGL-1.0 中没有纹理对象;而是将 glTexImage 调用放在显示列表中是模拟这一点的方法。而且这种行为仍然普遍存在,因此在显示列表中绑定纹理并调用 glTexImage 将有效地使用显示列表编译中所做的重新初始化纹理对象,无论何时调用显示列表。另一方面,显示列表不适用于顶点数组。

TL;DR:如果您的几何图形是静态的,您不希望随时过渡到 OpenGL-3 核心,它会给您带来巨大的性能提升(就像它为您所做的那样),那么就使用它们吧!

于 2011-05-18T21:15:33.147 回答